Объектно-реляционный язык ORL

(полуфинальная спецификация в состоянии перманентной модификации)

Структура языка

Элементы языка

Ссылки и множества

Системные объекты и базовые классы

Определение базовых классов

Дерево классов

Ключевые слова

Нереализованные понятия

Примеры использования


Структура языка

Выражения

Язык основан на двух выражениях NEW и GET/SET. Выражения RUN и DEL вводится для удобства и могут быть функционально заменены посредством вызовов стандартных методов RUN и DEL в операторах первых двух выражений. Выражения строятся на базе элементов языка .

NEW
Создание нового объекта класса и манипулирование им
LET (GET-SET)
Выборка существующего объекта (объектов) класса и манипулирование им (ими)
RUN
Создание нового объекта класса, манипулирование им и уничтожение после завершения манипуляций
DEL
Выборка существующего объекта (объектов) класса и уничтожение его (их)

 

Структура выражения

Кажде выражение имеет следующую структуру
[keyword] class [query] [code];

keyword - ключевое слово NEW, GET, SET, RUN или DEL

class - строка символов, соответствующай имени одного из существующих классов

query - спецификация запроса, заключенная в круглые () или фигурные скобки {}, предназначенное для однозначной идентификации одного или множества объектов, с которыми должны производиться манипуляции

code - спецификация манипуляций по изменению значений атрибутов объекта и вызову его методов


NEW

[NEW] class [code];

Выражение позволяет создать новый объект класса class и произвести с ним манипуляции в соответствии со списком операторов operators , включая изменение значений атрибутов класса и вызов методов класса применительно к объекту (в том числе методов RUN и DEL).


LET (GET | SET)

[GET | SET] class [query] [code];

Выражение позволяет предварительно выбрать один или несколько объектов класса class и произвести с ним или с ними манипуляции в соответствии со списком операторов operators , включая изменение значений атрибутов класса и вызов методов класса применительно к каждлому выбранному объекту (в том числе методов RUN и DEL).


DEL

[NEW] class [query] [code];

Выражение эквивалентно по смыслу выражению GET | SET, причем после завершения всех манипуляций с каждым из выбранных объектов, к каждому из них применяется метод DEL для уничтожения объекта.


RUN

[NEW] class [code];

Выражение эквивалентно по смыслу выражению NEW, причем после завершения всех манипуляций с созданным объектом, к нему применяется метод RUN для предопределенных этому объекту действий и, затем - метод DEL для уничтожения объекта


Элементы языка

В языке выдяляются следующие группы синтаксических элементов


Знаки препинания

В языке выделяются следующие знаки препинания

; - точка с запятой обозначает конец выражения или оператора в списке операторов

, - запятая разделяет элементы множеств в списках, операторы в списках операторов запроса или выражения в списке выражений внутри оператора

. - точка обозначает переход от одного объекта или метода к другому объекту или методу в пути доступа по цепочке

{ и } - фигурные скобки обозначают начало и конец запроса или ссылки, операторы которых соединены по условию OR

( и ) - круглые скобки обозначают начало и конец запроса или ссылки, операторы которых соединены по условию AND

" и " - двойные кавычки обозначают начало и конец строки текста

// - начало комментария, продолжающегося до конца строки


Значения


Запросы

Все запросы являются экземплярами базового класса запрос или производных от него классов.


Операторы

Все операторы являются экземплярами базового класса запрос


Ссылки и множества

Для связи объектов друг с другом язык предусматривает ссылки и множества.

    • Ссылка обозначает однозначное указание на некий объект и соответствует таким понятиям, как машинный адрес в памяти или уникальный первичный ключ в базе данных. В языке ссылка представлена как запрос, однозначно идентифицирующий тот объект, на который делается ссылка.
    • Множество, или коллекция значений, представляет собой список ссылок или массив указателей на объекты некоторого класса, в том числе класса объект (что практически означает множество объектов любого класса)


Системные объекты и базовые классы

Системными объектами являются экземпляры базовых классов "класс", "метод", атрибут, изначально определенные системой, и определяющие следующие базовые предопределенные классы, все из которых являются объектами, то есть - экземплярами класса объект.

Объект

Базовый класс для всех других классов. От него происходят все остальные базовые классы, а также подавляющее большинство производных классов, определяемых для хранения данных предметной области. Класс класс является, с одной стороны, производным от него, а сам объект является, в свою очередь экземпляром класса класс. Не происходит ни от кого.

OBJECT

Класс

Класс объектов, экземпляры которого являются классами. Происходит от класса объект. Все базовые классы, включая и его самого, являются его наследниками. Класс объект является его экземпляром, и он сам является экземпляром самого себя. Класс класс может описывать как множество объектов, размещенных в одной таблице базы данных, так и тип значения атрибута другого класса или аргумента метода или функции.

CLASS

Метод

Класс, описывающий некую программную функцию, выполняющую некоторые действия применительно к какому-либо классу и реализованную некоторым образом. Происходит от класса класс.

METHOD

Атрибут

Класс, описывающий атрибут объектов некоторого класса или входные, выходные или внутренние параметры некоторого метода. Происходит от класса объект.

ATTRIBUTE

Оператор

Класс, объектов описывающих некоторое однократное действие над объектами или атрибутами, выполняемое в последовательности других таких-же объектов, в рамках метода или запроса.

OPERATOR

Запрос

Класс, описывающий некоторые правила выбора объекта заданного класса, возможные действия над ним и какой-либо непосредственно возвращаемый результат. Происходит от класса метод, являются его системно-поддерживаемыми расширением.

QUERY


Определение базовых классов

CLASS OBJECT

Атрибуты

ID - число, системный идентификатор объекта, уникальный первичный ключ в базе данных
CLASS - ссылка на объект - "основной" класс данного объекта
OWNER - ссылка на объект - "владелец" данного объекта
ELEM - идентификатор (системный атрибут)
CLASSES - множество классов, экземплярами которых является объект
VALUES - множество значений атрибутов объекта (системный атрибут)
JOINED BY - множество объектов, к которым данный объект присоединен
JOINS - множество объектов, присоединенных к данному объекту

Описание атрибутов

Синтаксис

Определение

 


CLASS CLASS

Атрибуты

NAME - строка, системное имя класса в символах латинского алфавита, уникально его идентифицирующее
TEXT - строка, текстовое описание класса, или альтернативное содержательное имя в символах любого алфавита
TYPE - строка, тип класса [ ATOM | STRUCTURE | VARIANT ]
USAGE - строка, назначение класса [ABSTRACT|TEMPORARY|UNIVERSAL|ALONE|EMBEDDED|REFERENCED]
TABLE - строка, имя базы данных и таблицы в базе банных, при хранении класса в базе данных
EXTENDS - множество наследуемых классов
EXTENDED BY - множество классов - наследников (зарезервированный атрибут)
METHODS - множество методов класса
ATTRIBUTES - множество атрибутов класса
OBJECTS - множество объектов - экземпляров класса

Описание атрибутов

TYPE
Допустимые значения:
atom - элементарный класс
structure - структура
variant - вариант
USAGE
Описывает способ хранения экземпляров класса
Допустимые значения:
abstract - абстрактный для наследования дочерними классами
temporary - существует только в памяти для временного использовани
universal - реальный для инстантации экземплярами в СУБД
alone - самостоятельный для непосредственного доступа
embedded - встроенный для использования внутри объектов
referenced - самостоятельный для использования в связи с другими
Примечания:
universal включает alone, owned, linked, и, возможно, temporary

Синтаксис

<class_statement> =
[ universal | abstract | temporary | alone | embedded | referenced ]
class <class_name>
[ <constructor_arguments> ] [ <external_text> ]
<attribute_declaration> = | <attribute_statement> | { <attribute_statement> } |
<attribute_statement> = <attribute_name>
[ access [ protected | private | public ] ;]
[ usage [ embedded | [shared|own] reference | [shared|own] collection ] ;]
[ key [ not [key] | unique | order ] ;]
[ null [ null | not [null] ] ;]
<class_reference> [ <constructor_arguments> ];
[ <external_text> ]
;
 <external_text> = text <text_string> ;
 

Определение

 


CLASS METHOD

Атрибуты

NAME - строка, системное имя метода в символах латинского алфавита, уникально его идентифицирующее
TEXT - строка, текстовое описание метода, или альтернативное содержательное имя в символах любого алфавита
TYPE - способов реализации метода [ CODE | PROGRAM | STORED | SCRIPT ]
RETURN - значение, возвращаемое методом, возвращаемый атрибут
CALLS - множество операторов метода CODE
CALLERS - множество методов, вызывающих этот метод
LOGIC - сцепление подчиненных операторов IF (AND или OR) и DO (PAR/SEQ) 
LOCATION - расположение метода

Описание атрибутов

OWNER - класс, методом которого является данный метод

Синтаксис

Определение

 


CLASS ATTRIBUTE

Атрибуты

ORDER - порядковый номер атрибута
NAME - строка, системное имя атрибута в символах латинского алфавита, уникально его идентифицирующее
TEXT - строка, текстовое описание атрибута, или альтернативное содержательное имя в символах любого алфавита
ACCESS - [ protected | private | public ]
KEY - [ not [key] | unique | order ]
USAGE - [ EMBEDDED | REFERENCE | COLLECTION]
SHARED - [ YES | NOT ]
TYPE - (STRING,INT,DATE,STRUCTURE,UNION)
DOMAIN - ссылка на класс значениий данного атрибута
NULLS - разрешены ли пустые значения [ NO | YES ] ( [NULL | NOT NULL] )
PARAMETER - является ли атрибут параметром [ NO | IN | OUT | INOUT ]
QUERY - ссылка на METHOD, реализующий инициализацию значения атрибута при создании экземпляра объекта данного класса

Описание атрибутов

OWNER - ссылка на класс, атрибутом которого является сам атрибут

Синтаксис

Определение


CLASS OPERATOR

реализация оператора DO или фильтра IF запроса или метода
TYPE - тип значения операнда - самоочевидно по контексту VALUE/QUERY
LQUERY - объект атрибута оператора (1 операнд)
LVALUE - атрибут оператора (1 операнд)
OPERATION - операция оператора
OPERATION - операция оператора
VALUE - значение операнда (2 операнд)
QUERY - запрос операнда (2 операнд)
CALLS - подчиненные вложенные операторы
LOGIC - сцепление подчиненных операторов IF (AND или OR) и DO (PAR/SEQ) 

Атрибуты

Описание атрибутов

TYPE : DO PAR = …,…,… DO SEQ …;…;…

TYPE : IF ANY = …,…,… IF ALL …;…;…

Синтаксис

Определение

Разновидности

 

TYPE
LQUERY
LVALUE
OPERATION
METHOD
QUERY
VALIUE
Присвоение значения
DO
Get-query
Attribute
+-*/…

 

 

Value
Присвоение переменного значения
DO
Get-query
Attribute
+-*/…

 

[Get-query]
Attribute
Проверка на значение
IF
Get-query
Attribute
<>=…

 

 

Value
Проверка на переменное значение
IF
Get-query
Attribute
<>=…

 

[Get-query]
Attribute
Вызов метода
RUN
[Get-query]

 

 

Method
[Set-query]

 

Создание (на основании шаблона)
NEW

[Get-query] 

 

 

 

Set-query

 

Манипуляция
LET
Get-query

 

 

[Method]

Set-query

 

Манипуляция
GET
Get-query

 

 

[Method]

[Set-query]

 

Манипуляция
SET
[Get-query]

 

 

[Method]

Set-query

 

Удаление
DEL
Get-query

 

 

 

[Set-query]

 

 


CLASS QUERY

Атрибуты

Атрибуты соответствуют методу

Описание атрибутов

TYPE - тип запроса SET | GET | NEW | DEL (UPDATE | SELECT | INSERT | DELETE)
OWNER - класс объекта, к которому применяется запрос
CALLS - для SET - операторы, для GET - условия фильтра

Синтаксис

Определение

 

 


Дерево классов (пока еще устаревшее)

Примерно соответствует схеме системных метаданных в том смысле, что манипуляции на синтаксическом уровне языка управления бизнес-метаданными и бизнес-данными прямо отображаются на создание, удаление и изменение объектов метаданных и данных в системной области

DATA
SYSTEM METADATA
CLASS
INTERFACE
...
SYSTEM DATA
OBJECT
BUSINESS METADATA
BUSINESS_CLASS
BUSINESS_INTERFACE
...
BUSINESS DATA
BUSINESS_OBJECT
...
...


Зарезервированные слова

Эти слова являются именами базовах классов и методов или их атрибутов. Хотя принципиально нет необходимости ограничивать использование этих слов, во избежание путаницы не рекомендуется их использование.

name primary unique nokey type function method implemented embed extends

extended embeds embedded object location implementation call caller

argument order attribute owner extension functions methods arguments objects

calls callers attributes owners universal alone usage query new set get del

filter filters operation operand operator value temporary alone

reference references referenced run key access entity id attribute

not but by shared collection atom structure variant own defaults

 


Нереализованные понятия

entity // базовая сущность, от которой все растет
id // уникальный код
name // основное им
attribute // атрибут сущности или отношение M:1
references[] // набор при сущности или отношение 1:M
new // метод создани
set // метод изменени
get // метод выборки
del // метод удалени
run // метод запуска
interface // по сути, набор методов, реализующих поведение
functions[] // по сути, абстрактные методы
implemented[] // реализующие классы
text // внешнее имя интерфейса
function
interface // интерфейс функции
methods[] // список методов функции
arguments[] // аргумент функции (доступен вызывающему после)
implementation // реализация класса-интерфейс
interface // реализующий класс
class // реализуемый интерфейс
call // вызов метода методом
method // вызываемый метод
caller // вызывающий метод
argument // аргумент метода
function // функция аргумента
order // порядок аргумента
class // класс-тип аргумента
extension // наследование двух классов
class // класс-наследник
super // наследуемый класс
not / but - используются для переопределения системных метаданных on fly
class any_class
usage not abstract but universal;
text not "Any abstract class" but "Some universal class";
;
class.referenced - переход к классу, владельцу отношени
 


Примеры использования языка

new person
name = john;
age = 35;
kids
name=ann; age=1 ;
,
name=bob; age=2 ;
;
wife
name=joe; age=22;
;
;
 
method
query_person;
owner (name person)
type get;
logic all;
code
name = john,
age = 35,
;
;
 
get person( name=jonh, age=35 ) age+=1, name=John; ;
get person( name=jonh; age=35 ) age+=1; name=John; ;
set person age+=1, name=John; ( name=jonh, age=35 );
set person age+=1; name=John; ( name=jonh; age=35 );
 
 

 

SQL

CREATE TABLE PERSON_DATA (
FIRST_NAME CHAR(40), MIDDLE_NAME CHAR(40), LAST_NAME CHAR(40));
INSERT INTO PERSON_DATA (FIRST_NAME, MIDDLE_NAME,LAST_NAME)
VALUES ("Васисуалий", "Сысоевич", "Лоханкин");
INSERT INTO PERSON_DATA (FIRST_NAME, MIDDLE_NAME,LAST_NAME)
VALUES ("Сидор", "Петрович", "Иванов");
UPDATE PERSON_DATA SET MIDDLE_NAME = "Свиридович"
WHERE FIRST_NAME "Васисуалий" AND LAST_NAME "Лоханкин" ;

ORL

class PERSON_DATA
storage alone;
text "Данные физического лица";
extends BUSINESS_TYPE, BUSINESS_STRUCTURE;
implements SOME_INTERFACE, OTHER_INTERFACE;
attributes
CHAR FIRST_NAME(40) text "Имя",
CHAR MIDDLE_NAME(40) text "Отчество",
CHAR LAST_NAME(40) text "Фамилия";
;
PERSON_DATA objects
FIRST_NAME "Васисуалий", MIDDLE_NAME "Сысоевич", LAST_NAME "Лоханкин";
FIRST_NAME "Сидор" , MIDDLE_NAME "Петрович", LAST_NAME "Иванов" ;
;
PERSON_DATA objects ( FIRST_NAME "Васисуалий" LAST_NAME "Лоханкин" )
MIDDLE_NAME "Свиридович"
;


Примеры ORL-запросов посредством класса QUERY

// 1 вариант запроса
query GET_MIDDLE_NAME_BY_OTHERS
class PERSON_DATA;
return MIDDLE_NAME;
filters FIRST_NAME = value "Васисуалий", LAST_NAME = value "Лоханкин" ;
text "Выборка отчества по имени и фамилии";
;
// 2 вариант запроса
query GET_MIDDLE_NAME_BY_OTHERS
PERSON_DATA; MIDDLE_NAME;
FIRST_NAME = value "Васисуалий", LAST_NAME = value "Лоханкин" ;
;
// 1 вариант запроса с изменением
query GET_MIDDLE_NAME_BY_OTHERS
PERSON_DATA;
FIRST_NAME = value "Васисуалий", LAST_NAME = value "Лоханкин" ;
;
PERSON_DATA objects ( GET_MIDDLE_NAME_BY_OTHERS ) MIDDLE_NAME "Свиридович".
// 2 вариант запроса с изменением
PERSON_DATA objects
( FIRST_NAME = value "Васисуалий", LAST_NAME = value "Лоханкин" )
MIDDLE_NAME "Свиридович"
;
// Запрос с косвенной подстановкой критери
// SELECT CLIENT NAME WHERE CLIENT.ID = ORDER.CLIENT_ID
query GET_ORDER_CLIENT_ID class ORDER; return CLIENT_ID .
query GET_CLIENT_NAME_BY_ORDER
class CLIENT;
return NAME;
filters ID = query GET_ORDER_CLIENT_ID
;

// или

query GET_CLIENT_NAME_BY_ORDER
class CLIENT;
return NAME;
filters ID = query ( class ORDER; return CLIENT_ID )
;


Словарь

ATTRIBUTE. QUERY

 


 Объектно-реляционный язык ORL и системное ядро