Гость
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / select для производного класса / 25 сообщений из 65, страница 1 из 3
05.09.2018, 22:27
    #39698758
alatalo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
select для производного класса
Класс classB произведен от класса classA как показано ниже. Как "select * from classB" находит объекты класса classB? Никакого индекса по имени класса нет, перебором все объектов в таблице classA?

Код: xml
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.
Class User.classA Extends %Persistent
{
	Storage Default
	{
	<Data name="classADefaultData">
	<Value name="1">
	<Value>%%CLASSNAME</Value>
	</Value>
	</Data>
	<DataLocation>^User.classAD</DataLocation>
	<DefaultData>classADefaultData</DefaultData>
	<IdLocation>^User.classAD</IdLocation>
	<IndexLocation>^User.classAI</IndexLocation>
	<StreamLocation>^User.classAS</StreamLocation>
	<Type>%Library.CacheStorage</Type>
	}
}


Class User.classB Extends classA
{
	Storage Default
	{
	<Type>%Library.CacheStorage</Type>
	}
}
...
Рейтинг: 0 / 0
06.09.2018, 13:39
    #39699007
DAiMor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
select для производного класса
alatalo,

да, перебирая все объекты. И проверяет класс в хранении.
...
Рейтинг: 0 / 0
06.09.2018, 21:58
    #39699268
alatalo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
select для производного класса
Но ведь тогда, без дополнительных индексов по типу, все это имеет сомнительную пременимость поскольку будет серьезно подтормаживать при большом колве записей
...
Рейтинг: 0 / 0
07.09.2018, 08:35
    #39699323
logist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
select для производного класса
alatalo,

Если не складывать все объекты в одну глобаль то делать select * from ClassA будет невозможно.

Можно класс А сделать абстрактным, тогда объекты подклассов будут попадать в отдельные глобали

Для ускорения поиска по подклассу можно создать extent индекс https://docs.intersystems.com/latest/csp/docbook/DocBook.UI.Page.cls?KEY=ROBJ_index_extent
...
Рейтинг: 0 / 0
07.09.2018, 10:43
    #39699410
alatalo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
select для производного класса
logist,

про extent не знал, спасибо. Что интересно, Каше его использует только в запросе "select %ID from classB", "select *" предпочитает перебирать все.

А про Abstract не понял. По крайней мере, побавление [Abstact] в декларацию classA ничего не меняет. Storage каждому подклассу свой делать нужно?
...
Рейтинг: 0 / 0
07.09.2018, 10:52
    #39699422
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
select для производного класса
alataloА про Abstract не понял. По крайней мере, побавление [Abstact] в декларацию classA ничего не меняет. Storage каждому подклассу свой делать нужно?
Тут кагбэ нужно понять какую цель ты преследуешь так изворачиваясь с классами... Тогда можно было бы предложить путнее решение пока ты не вырыл подземный ход на чердак.
...
Рейтинг: 0 / 0
07.09.2018, 14:19
    #39699648
Блок А.Н.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
select для производного класса
alatalo,

Если наследованный класс будет в первую очередь наследоваться от %Persistent, то у него автоматически свое хранилище создастся.
...
Рейтинг: 0 / 0
09.09.2018, 20:43
    #39700151
alatalo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
select для производного класса
krvsa,

logist предложил два решения проблемы перебора все таблицы. С extent-ом все понятно, про Abstract - нет
...
Рейтинг: 0 / 0
09.09.2018, 20:44
    #39700152
alatalo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
select для производного класса
Блок А.Н.,

да, это понятно
...
Рейтинг: 0 / 0
10.09.2018, 09:09
    #39700241
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
select для производного класса
alatalo , повторюсь, без знания твоей проблемы нет проку что-либо советовать...
Но ты делаешь явно не то.
...
Рейтинг: 0 / 0
10.09.2018, 11:13
    #39700302
Блок А.Н.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
select для производного класса
alatalokrvsa,

logist предложил два решения проблемы перебора все таблицы. С extent-ом все понятно, про Abstract - нетНу с abstract все примерно так же, как с первичным наследованием от %Persistent. По идее (емнип), у абстрактного класса не создается хранилище, а значит, у каждого наследованного класса он будет свой). Но это поломает возможность селекта по базовому классу, что вас не устраивает.
Вообще, я бы 10 раз подумал перед тем, как делать единое хранилище для всех классов. Нужно будет намного аккуратнее продумывать индексы и запросы, чтобы работа с ними не просадила быстродействие.
...
Рейтинг: 0 / 0
11.09.2018, 11:48
    #39700829
alatalo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
select для производного класса
krvsa,

по дефолту "select * from classB" будет перебирать всю таблицу что не оптимально. Варианта решения два, индекс по контенту или под-классы пишут в отдельные глобали. Вопрос как организовать второй вариант.
...
Рейтинг: 0 / 0
11.09.2018, 11:54
    #39700833
alatalo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
select для производного класса
Блок А.Н.,

>По идее (емнип), у абстрактного класса не создается хранилище
Я попробовал, abstract не меняет вообще ничего в плане хранилища
...
Рейтинг: 0 / 0
12.09.2018, 08:43
    #39701239
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
select для производного класса
alatalo , спрошу по другому... Что ты хранить собрался в тех классах?

Нужно не проблему решать, а ее не создавать вовсе.
...
Рейтинг: 0 / 0
12.09.2018, 16:20
    #39701614
doublefint
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
select для производного класса
alatalo, возможно это поможет
...
Рейтинг: 0 / 0
13.09.2018, 11:05
    #39701932
alatalo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
select для производного класса
krvsa,

смотри на это как на абстракную задачу: есть производный класс, нужно сделать select по нему быстрым
...
Рейтинг: 0 / 0
13.09.2018, 11:17
    #39701942
alatalo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
select для производного класса
doublefint,

чуть в сторону:

>Если не закрывать открытый объект ( kill, не %Close()! ), то да - рано или поздно Cache "встанет".
это почему так? Разве каше не должен закрыть объект после того, как умрет последняя ссылка на него?
...
Рейтинг: 0 / 0
14.09.2018, 10:19
    #39702454
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
select для производного класса
alataloсмотри на это как на абстракную задачу: есть производный класс, нужно сделать select по нему быстрым
На задачи по оптимизации не стоит смотреть абстрактно.
Вся оптимизация строится именно на конкретике.

Не хочешь объяснять проблему - твое дело... Тебе с этим мурыжиться.
...
Рейтинг: 0 / 0
14.09.2018, 13:01
    #39702600
doublefint
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
select для производного класса
alatalodoublefint,

чуть в сторону:

>Если не закрывать открытый объект ( kill, не %Close()! ), то да - рано или поздно Cache "встанет".
это почему так? Разве каше не должен закрыть объект после того, как умрет последняя ссылка на него?
Эм.. Это сильно в сторону и не ко мне
...
Рейтинг: 0 / 0
14.09.2018, 13:23
    #39702620
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
select для производного класса
alatalo>Если не закрывать открытый объект ( kill, не %Close()! ), то да - рано или поздно Cache "встанет".
это почему так? Разве каше не должен закрыть объект после того, как умрет последняя ссылка на него?
Ты посмотри на даты тех сообщений. Это было почти 8 лет назад. И нет примера как такового, который "опустит" сервер на "миллионах записей".
Меня лично заверяли, что методы %Close() устарели и ничего не делают. Де нужно использовать именно kill. Что я и сделал...
Никаких "зависаний" не происходило. Хотя конвертировались данные областного значения, переводил с dbf-файлов на классы.
...
Рейтинг: 0 / 0
14.09.2018, 16:57
    #39702785
doublefint
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
select для производного класса
alatalo, если пройти по цепочке наследования вверх от %Persistent до %Library.SystemBase, то в документации ( Cache 2017.2 ) к его методу %Close() [Final, Internal] можно прочитать:
"This method is deprecated because we now reference count objects automatically so there is no need to call this method. It is a no-op and just returns success %Status code."
Похоже, приведенная вами цитата, начиная с какой то версии, утратила актуальность.
...
Рейтинг: 0 / 0
20.09.2018, 04:44
    #39705344
logist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
select для производного класса
alatalo,


alataloБлок А.Н.,

>По идее (емнип), у абстрактного класса не создается хранилище
Я попробовал, abstract не меняет вообще ничего в плане хранилища

Да, в какой то из версий слегка поменялось, нужно еще ClassType снять.

Теперь нужно как то так делать:

Код: sql
1.
2.
3.
4.
5.
6.
Class User.A Extends %Persistent [Abstract, ClassType=""]
{

Property A As %String;

}




Код: sql
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.
Class User.B Extends User.A [ClassType = persistent]
{

Property AAA As %String;

Storage Default
{
<Data name="BDefaultData">
<Value name="1">
<Value>%%CLASSNAME</Value>
</Value>
<Value name="2">
<Value>A</Value>
</Value>
<Value name="3">
<Value>AAA</Value>
</Value>
</Data>
<DataLocation>^User.BD</DataLocation>
<DefaultData>BDefaultData</DefaultData>
<IdLocation>^User.BD</IdLocation>
<IndexLocation>^User.BI</IndexLocation>
<StreamLocation>^User.BS</StreamLocation>
<Type>%Library.CacheStorage</Type>
}

}
...
Рейтинг: 0 / 0
08.10.2018, 10:58
    #39714279
kolesov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
select для производного класса
logistalatalo,

Да, в какой то из версий слегка поменялось, нужно еще ClassType снять.
Теперь нужно как то так делать:



Не "теперь", а при первой(!) возможности - бережет массу сил и времени.
Визг про " все в одной глобали " - он от профанов идет.
Наследование хранимых - часть хорошей архитектуры... если Каше, конечно ;)
(эх, было бы наследование таблиц в MySQL...)
...
Рейтинг: 0 / 0
08.10.2018, 16:22
    #39714528
doublefint
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
select для производного класса
kolesovНаследование хранимых - часть хорошей архитектуры... если Каше, конечно ;)
"Favor object composition over class inheritance” the Gang of Four
"Subclasses are dependent on the implementation and entire hierarchy of the parent class: the tightest form of coupling available in OO design "
...
Рейтинг: 0 / 0
08.10.2018, 16:25
    #39714534
doublefint
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
select для производного класса
kolesov было бы наследование таблиц в MySQL... Есть в PostgreSQL
...
Рейтинг: 0 / 0
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / select для производного класса / 25 сообщений из 65, страница 1 из 3
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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