Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Вопрос нуба по запросу / 13 сообщений из 13, страница 1 из 1
19.04.2012, 10:50
    #37760568
fonarshik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос нуба по запросу
В каше' нуб, поэтому сильно не пинайте. Вопрос: есть возможность через SQL-запрос сделать выборку из таблицы БД по полю где хранится коллекция (или ссылки на коллекцию я если честно не знаю, как правильно сказать) .
...
Рейтинг: 0 / 0
19.04.2012, 15:38
    #37761297
fonarshik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос нуба по запросу
Забыл в конце предложения знак вопроса поставить.
...
Рейтинг: 0 / 0
19.04.2012, 18:02
    #37761641
servit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос нуба по запросу
fonarshik ,

Было .

Коллекции есть двух видов: списки, массивы.

Если у Вас массив, то используйте виртуальную таблицу: Основы Проецирования Объект-SQL
Если же список, то SQL-предикат FOR SOME %ELEMENT

Кроме того для ускорения запросов Вы можете коллекции проиндексировать: Индексация Коллекций
...
Рейтинг: 0 / 0
19.04.2012, 19:19
    #37761805
ну я
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос нуба по запросу
servitКроме того для ускорения запросов Вы можете коллекции проиндексировать: Индексация Коллекций
А при выборке через SQL как эти индексы могут быть использованы?
...
Рейтинг: 0 / 0
19.04.2012, 21:36
    #37761963
doublefint
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос нуба по запросу
ну я, было дело:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
Class Example.Example %Extends %Persistent {

/// Список идентификаторов k, через запятую, для которых запрещены действия с объектом Example.Example
/// <example>2,114,321,23</example>
Property kban As %String(MAXLEN = 16384);

/// Не менять название, используется в коде <method>..kbanned</method>
/// Example.ExampleI("kban"," 2")=0101010001000100100100100100101010
/// Example.ExampleI("kban"," 23")=1111111111111111111111111111111111
/// Example.ExampleI("kban"," 114")=0000000000000010010010010010101000
/// Example.ExampleI("kban"," 321")=0000000000000010010010010010101000
Index kban On "kban(ELEMENTS)" [ Type = bitmap ];

/// Обязательный метод (версия Каше 5.1) для построения системой
/// хитро-ного индекса <index>kban</index>
/// Строится вызове через объекты  - d ..%Save()
/// Разбирает список значений в массив
ClassMethod kbanBuildValueArray(kban As %String, ByRef arr) As %Status {
	s list=$LFS(kban,","),key=0,k=""
	while $LISTNEXT(list,key,k){
		s:k'="" arr(k)=""
	}
 Q $$$OK
}

/// Проверка на наличие запрета
/// код для проверки значения битмапного индекса
ClassMethod kbanned(id, k) As %Boolean [ SqlProc ] {
        s part=id\64000+1 ;подиндекс в зависимости от кол-ва ид в классе
	s offset=id#64000+1 ;смещение от начала строки
        #; " "_k - нужно, так как значения строковые
	Q $bit($g(^Example.ExampleI("kban"," "_k,part)),offset)  
}
}


Использование, например:
Код: sql
1.
 Select * From Example.Example Where Example.Example_kbanned(ID,2)=1
...
Рейтинг: 0 / 0
20.04.2012, 00:29
    #37762161
ну я
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос нуба по запросу
doublefintИспользование, например:
Код: sql
1.
 Select * From Example.Example Where Example.Example_kbanned(ID,2)=1


Дык тут чтобы встать на ID оно же все ID должно перебрать. Вот если бы эта рукопашная SqlProc вернула сам ID, тогда еще ниче так.
...
Рейтинг: 0 / 0
20.04.2012, 08:38
    #37762270
fonarshik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос нуба по запросу
servit fonarshik ,

Было .

Коллекции есть двух видов: списки, массивы.

Если у Вас массив, то используйте виртуальную таблицу: Основы Проецирования Объект-SQL
Если же список, то SQL-предикат FOR SOME %ELEMENT

Кроме того для ускорения запросов Вы можете коллекции проиндексировать: Индексация Коллекций

У меня коллекция список объектов(которые занесены в другую таблицу), сейчас пример приведу:
Есть 2 класса Salers и Prodacts

/// Торгаши
Class OModel.Salers Extends %Persistent
{
/// ФИО
Property Name As %String;;
/// Рег.данные
Property Reg As %String;
/// Адрес
Property Address As Address;
/// Товары
Property Product As list Of Product;
}


/// Товары
Class OModel.Prodacts Extends %Persistent
{
/// Артикул
Property Artikul As %Integer;
/// Описание товара
Property Opisanie As %String;
}

Мне нужно выбрать продавцов у которых имеется заданный товар(например по артикулу). Это возможно сделать?
...
Рейтинг: 0 / 0
20.04.2012, 11:14
    #37762527
servit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос нуба по запросу
ну яservitКроме того для ускорения запросов Вы можете коллекции проиндексировать: Индексация Коллекций А при выборке через SQL как эти индексы могут быть использованы? SELECT Name,FavoriteColors FROM Sample.Person WHERE FOR SOME %ELEMENT(FavoriteColors) (%VALUE='Red')

План запроса без индекса:

Код: plaintext
1.
2.
3.
4.
5.
Относительная стоимость = 169400 
Read master map Sample.Person.IDKEY, looping on ID.

For each row:

 Output the row.


План запроса с индексом Index fcIDX1 On FavoriteColors(ELEMENTS); :

Код: plaintext
1.
2.
3.
4.
5.
6.
Относительная стоимость = 1644 
Read index map Sample.Person.fcIDX1, using the given %SQLUPPER(Subvalue(FavoriteColors)), and looping on ID.

For each row:

 Read master map Sample.Person.IDKEY, using the given idkey value. 
 Output the row.

Разница в количестве глобальных ссылок (соответственно возрастание скорости выполнения) будет особо ощутима на б о льшем количестве данных.

По поводу примера doublefint .
Хоть это и не коллекция в чистом виде, тем не менее оптимизатор может ускорить запрос и для таких данных.
Например:Class test.C Extends %Persistent
{

Index f1 On f1(ELEMENTS) [ Type = bitmap ];

Property f1 As %String;

ClassMethod f1BuildValueArray(
  serialized As %Binary,
  array As %Binary) As %Status
{
  s list=$LFS(serialized,","),ptr=0,item=""
  while $LISTNEXT(list,ptr,item){
    s:item'="" array(ptr)=item
  }
 Q $$$OK
}

ClassMethod Fill()
{
  d ..%KillExtent()
  s ^test.CD(1)=$lb("","")  
  s ^test.CD(2)=$lb("","1")  
  s ^test.CD(3)=$lb("","2,1")  
  s ^test.CD(4)=$lb("","2,2")  
  s ^test.CD(5)=$lb("","1,2,3")  
  s ^test.CD=5
  do ..%BuildIndices(,1,1)
  
  do $system.SQL.TuneTable("test.C",1,1)

}

}
Найти все записи, в строке(списке) f1 которых есть элементы 1 и/или 3:
select * from test.C where for some %element(f1) (%value in (1,3))

Можно то же сделать, работая с f1 как обычной строкой, но это будет менее эффективно.
...
Рейтинг: 0 / 0
20.04.2012, 11:20
    #37762541
servit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос нуба по запросу
fonarshikМне нужно выбрать продавцов у которых имеется заданный товар(например по артикулу). Это возможно сделать?
Можно:Class SqlRu.Prodacts Extends %Persistent
{

/// Артикул
Property Artikul As %Integer;

/// Описание товара
Property Opisanie As %String;

}

Class SqlRu.Salers Extends %Persistent
{

/// ФИО
Property Name As %String;

/// Рег.данные
Property Reg As %String;

/// Товары
Property Product As list Of Prodacts;

ClassMethod Fill()
{
  ;d ##class(SqlRu.Salers).Fill()
  do ##class(SqlRu.Salers).%KillExtent()
  do ##class(SqlRu.Prodacts).%KillExtent()
  
  &sql(insert into SqlRu.Prodacts(Artikul,Opisanie) 
          select 2,'Opisanie2' union
          select 4,'Opisanie4' union
          select 1,'Opisanie1')
  &sql(insert into SqlRu.Salers(Name,Reg,Product) 
          select 'Name1','Reg1',$listbuild($listbuild(trim('1')),$listbuild(trim('3'))) union
          select 'Name2','Reg2',$listbuild($listbuild(trim('3')),$listbuild(trim('2'))) union
          select 'Name3','Reg3',$listbuild($listbuild(trim('1'))))

  do ##class(SqlRu.Prodacts).%BuildIndices(,1,1)
  do ##class(SqlRu.Salers).%BuildIndices(,1,1)
  
  do $system.SQL.TuneTable("SqlRu.Prodacts",1,1)
  do $system.SQL.TuneTable("SqlRu.Salers",1,1)
}

}
Найти всех продавцов, продавших товар с артикулом 2 и/или 4:
select * from SqlRu.Salers where for some %element(product) (+$listget(%value) in (select %ID from SqlRu.Prodacts where Artikul in (2,4)))

PS: в Вашем случае вместо коллекции объектов лучше использовать отношение типа один-ко-многим или родитель-потомки .
...
Рейтинг: 0 / 0
20.04.2012, 11:37
    #37762597
ну я
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос нуба по запросу
круто, хорошее дополнение к доке
...
Рейтинг: 0 / 0
20.04.2012, 11:58
    #37762654
servit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос нуба по запросу
doublefint
Код: sql
1.
/// хитро-ного индекса <index>kban</index>

Хитронный индекс?
+1
...
Рейтинг: 0 / 0
20.04.2012, 12:17
    #37762693
fonarshik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос нуба по запросу
servit,

Спасибо, буду пробовать.
...
Рейтинг: 0 / 0
20.04.2012, 14:16
    #37763038
doublefint
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос нуба по запросу
servit, хитронный, да :D
...
Рейтинг: 0 / 0
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Вопрос нуба по запросу / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]