Работа с существующими глобалами через объекты и SQL Вадим Федоров InterSystems Corporation

Содержание

Слайд 2

Содержание

CacheStorage

Обзор стратегий хранения

CacheSQLStorage

CustomStorage

Пример CacheSQLStorage

Содержание CacheStorage Обзор стратегий хранения CacheSQLStorage CustomStorage Пример CacheSQLStorage

Слайд 3

Сравнение стратегий хранений

✓ Обеспечивается Caché
? Реализуется разработчиком

Сравнение стратегий хранений ✓ Обеспечивается Caché ? Реализуется разработчиком

Слайд 4

CacheStorage идеально подходит для новых приложений
CacheSQLStorage применяется, когда с существующими

CacheStorage идеально подходит для новых приложений CacheSQLStorage применяется, когда с существующими глобалами
глобалами можно и нужно работать с помощью SQL
CustomStorage используется тогда, когда нельзя работать с глобалами через SQL и нужно реализовывать собственную сложную логику для обеспечения объектного доступа

Выбираем стратегию хранения

Слайд 5

Содержание

CacheStorage

Обзор стратегий хранения

CacheSQLStorage

CustomStorage

Пример CacheSQLStorage

Содержание CacheStorage Обзор стратегий хранения CacheSQLStorage CustomStorage Пример CacheSQLStorage

Слайд 6

Обзор CacheStorage

Объектное API

Приложение

%LoadData

%SaveData

%DeleteData

ObjectScript

ObjectScript

ObjectScript

Объектная реализация

Глобалы

Обзор CacheStorage Объектное API Приложение %LoadData %SaveData %DeleteData ObjectScript ObjectScript ObjectScript Объектная реализация Глобалы

Слайд 7

CacheStorage генерирует глобалы, в которых используется $ListBuild
Уникальный идентификатор (IDKey / PrimaryKey)

CacheStorage генерирует глобалы, в которых используется $ListBuild Уникальный идентификатор (IDKey / PrimaryKey)
может автоматически сгенерирован Cache или задан разработчиком вручную
Это влияет на структуру глобалов
Можно управлять хранением свойств классов в глобалах
Это влияет на структуру значений глобалов

Информация о CacheStorage

Слайд 8

Содержание

CacheStorage

Обзор стратегий хранения

CacheSQLStorage

CustomStorage

Пример CacheSQLStorage

Содержание CacheStorage Обзор стратегий хранения CacheSQLStorage CustomStorage Пример CacheSQLStorage

Слайд 9

Обзор CacheSQLStorage

Объектное API

Приложение

%LoadData

%SaveData

%DeleteData

SELECT

INSERT / UPDATE

DELETE

SQL Реализация

Глобалы

Обзор CacheSQLStorage Объектное API Приложение %LoadData %SaveData %DeleteData SELECT INSERT / UPDATE DELETE SQL Реализация Глобалы

Слайд 10

Создайте Persistent-класс
Добавьте свойства в класс
Определите свойство (свойства), которое будет

Создайте Persistent-класс Добавьте свойства в класс Определите свойство (свойства), которое будет идентификатором
идентификатором класса (IDKey / Primary Key)
Создайте стратегию хранения выставив соответствие между свойствами класса и данными глобала

Обзор CacheSQLStorage

Слайд 11

При работе через объекты будут вызываться триггеры (при использовании CacheStorage они не

При работе через объекты будут вызываться триггеры (при использовании CacheStorage они не
вызываются)!
Поддерживается ссылка и Parent-Child отношение для связи классов

Особенности CacheSQLStorage

Слайд 12

CacheSQLStorage обычно создается:
Программистом
Программой конвертации из F-DBMS
Программой конвертации из KB-SQL

Создание CacheSQLStorage

CacheSQLStorage обычно создается: Программистом Программой конвертации из F-DBMS Программой конвертации из KB-SQL Создание CacheSQLStorage

Слайд 13

Не ко всем структурам глобалов можно настроить CacheSQLStorage так чтобы обеспечить

Не ко всем структурам глобалов можно настроить CacheSQLStorage так чтобы обеспечить полный
полный SQL-доступ (Read/Write/Delete)
Некоторые структуры подходят только для чтения через SQL (SELECT)
Чтобы обеспечитьобновление иногда необходима дополнительная работа, кроме установки Mapping

Обеспечение SQL-доступа

Слайд 14

Различают следующие виды CacheSQLStorage карт:
Данные (MasterMap): Должны быть определены все поля

Различают следующие виды CacheSQLStorage карт: Данные (MasterMap): Должны быть определены все поля
Индексы: Должны быть определены некоторые поля
Full (по умолчанию): Все данные попадают в индексы
Conditional: Данные попадают в индексы, если выполняется
Nonnull: Нулевые значения (Null values) не попадают в индексы

Виды карт

Слайд 15

IDKey индексы определяют уникальные идентификаторы для объектов
Primary Key индексы определяют

IDKey индексы определяют уникальные идентификаторы для объектов Primary Key индексы определяют уникальные
уникальные идентификаторы для SQL
IDKey и Primary Key индексы обычно строятся по одним и тем же полям

ID и Primary Key

Слайд 16

Индексы (subscripts) карт обычно эквивалентны индексам глобалов
Индексы карт используется для формирования

Индексы (subscripts) карт обычно эквивалентны индексам глобалов Индексы карт используется для формирования
кода, перебирающего записи таблицы.
Поддерживаются следующие типы индексов (subscripts) :
Sub: Основанный на «стандартном» индексе глобалов
Piece: Основанный на определенной позиции (используется разделитель)
Global: Основанный на данных, хранящихся в нескольких глобалах
Other: Основанный на пользовательском коде

Индексы глобалов (Subscripts)

Слайд 17

Существует тесная связь между IDKey и RowID для карт данных, но

Существует тесная связь между IDKey и RowID для карт данных, но не
не для карт индексов
A RowID используется для уникальной идентификации данных в глобале, на основе индекса глобала, определенного в карте
Например, для глобала:
^Person(PersonID,“Cars”,CarID)=“Make^Model^Year”
2 поля будут нашими RowID:
PersonID: хранится на первом уровне {L1}
CarID: хранится на третьем уровне {L3}

RowID

Слайд 18

Когда определены индексы глобала, нужно определить хранение свойств класса в глобале

Когда определены индексы глобала, нужно определить хранение свойств класса в глобале Можно
Можно определить дополнительные узлы индекса глобала (только литералы)
Можно использовать $Piece или $ListBuild

Карты данных

Слайд 19

Map Name: Имя карты.
Map Type: Данные или Индексы (Data or

Map Name: Имя карты. Map Type: Данные или Индексы (Data or Index)
Index)
Global Name: Имя глобала (^…) или локального массива
Node Structure: Структура узла: $Piece или $List
Population Type: Тип заполнения
Population %: Оценка предполагаемого количества рядов в индексе
Condition: Выражение определяющее условие. Например, {Name}‘=“”
Conditional Fields: Поля, по которым будет проверяться условие
Conditional with hostvars: Булева значение, которое влияет на использование индекса кэшированными запросами
Row Reference: Позволяет программистам переопределить сгенерированный RowID

Подробности редактирования карт

Слайд 20

Access Type: Тип доступа. Sub, Piece, Global или Other
Delimiter: Разделитель.

Access Type: Тип доступа. Sub, Piece, Global или Other Delimiter: Разделитель. Используется,
Используется, если тип доступа Piece
Expression: Выражение. Обычно {поле}, “string” или число, или определенная позиция
Loop Init Value: Не включаемое значение, используемое для генерации кода обхода
Start Value: Включаемое значение, используемое в сгенерированном коде обхода
Stop Value: Значение, при котором обход останавливается
Stop Expression: Выражение, при котором обход останавливается, например, {L1}>200
Data Access: Доступ к данным. Переопределяет контекст текущего выражения для вычисления значения текущего уровня доступа (Override the context of the current access-level’s value expression)
Next Code: Используется программистом для переопределения генерируемого кода обхода
Invalid Conditions: Выражения, используемые для исключения рядов из карты. Например, {L1}<1
Access Variables: Переменные, используемые программистом, для обеспечения обеспечения уникальности имен

Подробности редактирования индексов глобалов

Слайд 21

RowID: Позиция поля в спецификации RowID
Field: Имя поля, состовляющего

RowID: Позиция поля в спецификации RowID Field: Имя поля, состовляющего часть RowID
часть RowID
Expression: Уровень внутри определения индексов глобала (subscript definition). Например, {L2} или {L6}

Подробности редактирования RowID

Слайд 22

Field: Имя поля
Node: Дополнительный индекс глобала (только литерал), где находится

Field: Имя поля Node: Дополнительный индекс глобала (только литерал), где находится поле
поле
Piece: Позиция в строке $Piece
Delimiter: Разделитель. Например, “^” или $c(1)

Подробности редактирования данных

Слайд 23

Содержание

CacheStorage

Обзор стратегий хранения

CacheSQLStorage

CustomStorage

Пример CacheSQLStorage

Содержание CacheStorage Обзор стратегий хранения CacheSQLStorage CustomStorage Пример CacheSQLStorage

Слайд 24

Обзор CustomStorage

Объектные API

Прилжение

%LoadData

%SaveData

%DeleteData

?

?

?

Собственная реализация

Глобалы

Обзор CustomStorage Объектные API Прилжение %LoadData %SaveData %DeleteData ? ? ? Собственная реализация Глобалы

Слайд 25

Создайте Persistent-класс
Добавьте свойства в класс
Определите свойство (свойства), которое будет

Создайте Persistent-класс Добавьте свойства в класс Определите свойство (свойства), которое будет идентификатором
идентификатором класса (IDKey / Primary Key)
Создайте стратегию хранения выставив соответствие между свойствами класса и данными глобала
Реализуйте код доступа к объектам: %LoadData, %SaveData, %DeleteData

Обзор CustomStorage

Слайд 26

Для того чтобы использовать SQL с CustomStorage, необходимо определить специальный параметр

Для того чтобы использовать SQL с CustomStorage, необходимо определить специальный параметр класса:
класса:
Parameter SQLENABLED = 1;
Mapping the SQL portion with CustomStorage is identical to the methods used for CacheSQLStorage

CustomStorage и SQL

Слайд 27

Для того чтобы использовать объекты с CustomStorage, необходимо выполнить следующее:
Реализовать

Для того чтобы использовать объекты с CustomStorage, необходимо выполнить следующее: Реализовать %LoadData,
%LoadData, %SaveData, %DeleteData
В Вашем коде Вы должны управлять :
ID объектов на диске и в памяти (с помощью метода %IdSet())
Переменными экземпляров свойств (имена свойств имеют первые символы “i%” )
Concurrency
Уникальностью данных
Ограничениями, накладываемыми внешних ключей (Foreign key constraints)

CustomStorage и объекты

Слайд 28

Код, реализованный в %LoadData(), будет выполняться каждый раз, когда загружается объект,

Код, реализованный в %LoadData(), будет выполняться каждый раз, когда загружается объект, обычно
обычно после вызова %Open() и %OpenId()
Пример %LoadData:
Method %LoadData(id As %Library.String) As %Library.Status
{
Set i%SSN = id
Set i%Name = $Piece(^P(id),“^”,1)
Set i%DOB = $Piece(^P(id),“^”,2)
Quit $$$OK
}

%LoadData

Слайд 29

Код, реализованный в %SaveData(), будет выполняться каждый раз, когда сохраняется объект,

Код, реализованный в %SaveData(), будет выполняться каждый раз, когда сохраняется объект, в
в результате вызова метода %Save()
Пример %SaveData:
Method %SaveData(id As %Library.String) As %Library.Status
{
Lock ^P(id):5 If '$Test Quit $$$ERROR($$$LockFailedToAcquireExclusive)
Set id = i%SSN
Do ..%IdSet(id)
Set $Piece(^P(id),”^”,1) = i%Name
Set $Piece(^P(id),”^”,2) = i%DOB
Quit $$$OK
}

%SaveData

Слайд 30

Код, реализованный в %DeleteData, будет выполняться каждый раз, когда объект будет

Код, реализованный в %DeleteData, будет выполняться каждый раз, когда объект будет удаляться,
удаляться, в результате вызова %Delete() или %DeleteId()
Пример %DeleteData:
Method %DeleteData(id As %String, concurrency as %Integer) As %Status
{
Lock ^P(id):5 If '$Test Quit $$$ERROR($$$LockFailedToAcquireExclusive)
Kill ^P(id)
Quit $$$OK
}

%DeleteData

Слайд 31

Содержание

CacheStorage

Обзор стратегий хранения

CacheSQLStorage

CustomStorage

Пример CacheSQLStorage

Содержание CacheStorage Обзор стратегий хранения CacheSQLStorage CustomStorage Пример CacheSQLStorage

Слайд 32

Phone Numbers

Doctor Visits

Пример модели данных

Есть два отношения Parent-Children:
Пациент может иметь

Phone Numbers Doctor Visits Пример модели данных Есть два отношения Parent-Children: Пациент
несколько номеров телефона
Пациент может посещать доктора несколько раз
Удаление пациента удаляет его номера телефонов и визиты к врачу

Address

Patient

Слайд 33

^P(SSN) = “Name^DOB^Phone1~Phone2~...~PhoneN^Company”
^P(SSN,“Address”) = “City^PostalCode^Country”
^P(SSN,“Visits”,VisitDate,VisitTime) = “Symptom^Payment”

Пример структуры данных глобала

^P(“211-22-1222”) = “Smith,John^39873^718-317-3312~917-225-2213^AT&T”
^P(“211-22-1222”,“Address”)

^P(SSN) = “Name^DOB^Phone1~Phone2~...~PhoneN^Company” ^P(SSN,“Address”) = “City^PostalCode^Country” ^P(SSN,“Visits”,VisitDate,VisitTime) = “Symptom^Payment” Пример структуры данных
= “New York^10312^USA”
^P(“211-22-1222”,“Visits”,58809,43200) = “Cough^15.00”
^P(“211-22-1222”,“Visits”,58820,57900) = “Sore Throat^50.00”

Слайд 34

^PI(Name,SSN) = “”

Пример структуры индексов глобала

^PI(“Smith,John”,“211-22-1222”) = “”

^PI(Name,SSN) = “” Пример структуры индексов глобала ^PI(“Smith,John”,“211-22-1222”) = “”

Слайд 35

Создаем Persistent-класс

Создаем Persistent-класс

Слайд 36

Добавляем свойства

Добавляем свойства

Слайд 37

Выбираем уникальный идентификатор

Базируется на одном поле: SSN

Выбираем уникальный идентификатор Базируется на одном поле: SSN

Слайд 38

Определяем ID / Primary Key индекс

Основан на свойстве SSN
Не изменяйте

Определяем ID / Primary Key индекс Основан на свойстве SSN Не изменяйте collation индекса
collation индекса

Слайд 39

Создаем Storage

Создаем Storage

Слайд 40

Создаем карту данных

Имя карты не может содержать символ «пробел»

Создаем карту данных Имя карты не может содержать символ «пробел»

Слайд 41

Определяем индексы глобала

Первый уровень индекса глобала - SSN

Определяем индексы глобала Первый уровень индекса глобала - SSN

Слайд 42

Определяем Row ID

Первый Row ID 1 основан на SSN, которое хранится

Определяем Row ID Первый Row ID 1 основан на SSN, которое хранится
в первом уровне индекса глобала

Слайд 43

Определяем свойства

Введите разделитель и дополнительную информацию

Определяем свойства Введите разделитель и дополнительную информацию

Слайд 44

Срздаем карту индексов

Выберите тип заполнения ‘full’

Срздаем карту индексов Выберите тип заполнения ‘full’

Слайд 45

Определяем индексы глобала индексов

Определяем индексы глобала индексов

Слайд 46

Определяем Row ID индекса

Первый Row ID основан на SSN, который хранится

Определяем Row ID индекса Первый Row ID основан на SSN, который хранится
в уровне 2 индекса глобала

Слайд 47

Сохраняем и компилируем класс

Сохраняем и компилируем класс

Слайд 48

Создаем дочернюю таблицу PhoneList

Этот класс тоже Persistent

Создаем дочернюю таблицу PhoneList Этот класс тоже Persistent

Слайд 49

Создаем отношение Parent-Child

Отношения (Relationship) – специальный класс свойств
Кроме определения свойства

Создаем отношение Parent-Child Отношения (Relationship) – специальный класс свойств Кроме определения свойства
в этом классе (PatientRef), Вы должны определить другую сторону отношения (PhoneNumbers)

Слайд 50

Добавляем остальные свойства

Кроме свойства, Вы должны определить свойство для представления позиции

Добавляем остальные свойства Кроме свойства, Вы должны определить свойство для представления позиции во встроенной разделенной (Counter)
во встроенной разделенной (Counter)

Слайд 51

Выбираем уникальный идентификатор

Наш идентификатор будет строится на поле Counter

Выбираем уникальный идентификатор Наш идентификатор будет строится на поле Counter

Слайд 52

Определяем индекс ID / Primary Key

Задайте индекс по свойству Counter

Определяем индекс ID / Primary Key Задайте индекс по свойству Counter Не
Не модифицируйте collation
Свойство PatientRef неявно часть IDKey / Primary Key

Слайд 53

Создаем Storage

Создаем Storage

Слайд 54

Создаем карту данных

Имя карты не может содержать символ «пробел»

Создаем карту данных Имя карты не может содержать символ «пробел»

Слайд 55

Определяем индексы глобала

Первый уровень индекса глобала основан на Training.Patient.SSN
Второй уровень

Определяем индексы глобала Первый уровень индекса глобала основан на Training.Patient.SSN Второй уровень
индекса глобала основан на “^” разделителе, используя третью позицию
Третий уровень индекса глобала основан на “~” разделителе, используя свойство Counter для позиции

Слайд 56

Определяем Row ID

Row ID 1 основан на Training.Patient.SSN, которое хранится на

Определяем Row ID Row ID 1 основан на Training.Patient.SSN, которое хранится на
первом уровне индекса глобала
Row ID 2 основан на Counter, которое хранится на первом уровне индекса глобала

Слайд 57

Определяем свойства

Внесите только свойство HomePhone

Определяем свойства Внесите только свойство HomePhone

Слайд 58

Сохраняем и компилируем класс

Сохраняем и компилируем класс

Слайд 59

Создаем дочернюю таблицу Visit

Этот класс тоже Persistent

Создаем дочернюю таблицу Visit Этот класс тоже Persistent

Слайд 60

Создаем отношение Parent-Child

Кроме определения свойства в этом классе (PatientRef), Вы должны

Создаем отношение Parent-Child Кроме определения свойства в этом классе (PatientRef), Вы должны
определить другую сторону отношения (Visits)

Слайд 61

Добавляем остальные свойства

Добавляем остальные свойства

Слайд 62

Выбираем уникальный идентификатор

В этот раз идентификатор будет строиться по 2 полям: VisitDate

Выбираем уникальный идентификатор В этот раз идентификатор будет строиться по 2 полям: VisitDate и VisitTime
и VisitTime

Слайд 63

Определяем индекс ID / Primary Key

Постройте индекс по свойствам VisitDate и

Определяем индекс ID / Primary Key Постройте индекс по свойствам VisitDate и
VisitTime
Не изменяйте collation
Свойство PatientRef неявно часть IDKey / Primary Key

Слайд 64

Создаем Storage

Создаем Storage

Слайд 65

Создаем карту данных

Имя карты не может содержать символ «пробел»

Создаем карту данных Имя карты не может содержать символ «пробел»

Слайд 66

Определяем индексы глобала

Первый уровень индекса глобала основан на Training.Patient.SSN
Второй уровень

Определяем индексы глобала Первый уровень индекса глобала основан на Training.Patient.SSN Второй уровень
индекса глобала основан на литерале “Visits”
Третий уровень индекса глобала основан на VisitDate
Четвертый уровень индекса глобала основан на VisitTime

Слайд 67

Определяем Row ID

Row ID 1 основан на свойстве Training.Patient.SSN, которое хранится

Определяем Row ID Row ID 1 основан на свойстве Training.Patient.SSN, которое хранится
на первом уровне индекса глобала
Row ID 2 основан на свойстве VisitDate, которое хранится на третьем уровне индекса глобала
Row ID основан на свойстве VisitTime, которое хранится на четвертом уровне индекса глобала

Слайд 68

Определяем свойства

Определяем свойства

Слайд 69

Сохраняем и компилируем класс

Сохраняем и компилируем класс