GithubHelp home page GithubHelp logo

entity's Issues

getRepository - МенеджерСущности, заточенный под конкретную сущность

Чтобы упростить, например, поиск сущностей за счет отсутствия необходимости передавать тип.
Другими словами,

public class EntityManager {
  ...
  getRepository(entityType: T): Repository<T>
  ...
}

public class Repository<T> {
  get(id: any): T[],
  get(filter: Map<string, any>): T[],
  get(filter: Filter[]): T[], 
  save(entity: T): void
}

Конструктор SQL запросов

Хотелось бы видеть функционал создания sql запросов в виде конструктора в fluent стиле.
Примеры:
Дано:

  • Сущность Автор с полями: Код, Имя, Почта, Роль. Таблица бд называется Авторы.
  • Сущность Роль с полями: Код, Имя. Таблица бд называется Роли.
Конструктор = МенеджерСущностей.КонструкторЗапросов();

Выборка = Конструктор.Из("Автор") .Где("Код", 1).Выполнить();
Для Каждого ЭлементВыборки Из Выборка Цикл
    Сообщить(ЭлементВыборки.Имя);
КонецЦикла;

Возможности:

  • Из(ИмяСущности) - метод FROM
  • Где(ИмяПоля, Значение), Где(Соответствие), Где(Массив) - метод WHERE
  • Выбрать(), Выбрать("ИмяСущности.Поле1, ИмяСущности.Поле2, ИмяСущности.Поле3"), Выбрать(Массив) - указание выбора определенных полей из запроса
  • Ограничить(НомерЗаписи, КоличествоЗаписей) - метод LIMIT
  • ЛевоеСоединение(Условие), ПравоеСоединение(Условие), ВнутренееСоединение(Условие), ВнешнееСоединение(Условие) - методы LEFT JOIN, RIGHT JOIN, INNER JOIN, OUTER JOIN
  • Упорядочить(Поле, ПорядокСортировки), Упорядочик(Массив) - метод ORDER BY
  • Выполнить() - выполнить запрос

Еще пример (дано такое же):

Выборка = Конструктор
    .Из("Автор")
    .Выбрать("Автор.Имя, Автор.Почта")
    .ЛевоеСоединение("Роль", "Автор.Роль=Роль.Код")
    .Выбрать("Роль.Имя")
    .Упорядочить("Автор.Имя", ПорядокСортировки.Убывание);
    .Выполнить();

Как пример всего этого в других языках: fluentPDO

Migrations: Step 2

@nixel2007: Задачу миграции я бы разделил на две больших подзадачи.

  1. разработка способа работы с DML в виде объектной модели. Для этого можно завести новый интерфейс для коннектора с методами ДобавитьКолонку, ПереименоватьКолонку, ДобавитьИндекс и такое все. Чтобы можно было во fluent режиме в виде билдера описать изменение схемы, а на выходе получить текст запроса для alter table, который опять таки можно пихнуть в коннектор и выполнить.

С точки зрения разработчика нужно будет класть дто с миграциями в спец папочку и указать в конфиге/коде приложения текущую версию. Всё остальное брал бы на себя энтити.

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

Расширение типов для колонок

Расширить типы для колонки:

  1. Тип &Колонка(Тип = "Тип") - чтобы в поле можно было положить например Тип("Строка")
  2. ДвоичныеДанные &Колонка(Тип = "ДвоичныеДанные ")

Получение сущностей с отбором

СтруктураПоиска = Новый Структура("Имя", "Иван");
НайденныеФизЛица = МенеджерСущностей.Получить(Тип("ФизическиеЛица"), СтруктураПоиска);

Если две сущности ссылаются друг на друга, то foreing key надо создавать отложенно, через alter column

Что-то среднее между багом и улучшением.

Две таблицы с FK друг на друга не могут быть последовательно созданы - от СУБД придет эксепшен при накладывании констрэйта FK.
Инициализация должна идти по принципу создания таблиц с типами, без контстрейта FK, а потом через ALTER COLUMN уже проставлять FK.

Добавить поддержку типа колонку uuid

В ТипыКолонок добавить поддержку типа uuid, типа первичный ключ, автогенерируемый.
Цели:

  1. При загрузке данных из 1С чтобы элемент таблицы имел ровно тот же тип и значение ссылки что и в самой 1С.
  2. Если первичный источник данных - веб-приложение, и затем данные уходят в 1С - чтобы в 1С можно было создать ссылку с тем же идентификатором что и в самом веб-приложении.

Формирование сложных sql запросов через соединение entity

Через соединение entity формировать сложные sql запросы.
Варианты от @nixel2007:

  • Получить коннектор и вызвать у него unstable метод ВыполнитьЗапрос()
  • Можно ввести в интерфейс коннектора
  • Можно ввести в интерфейс менеджера
  • Можно в менеджер добавить ряд популярных запросов
  • Объектный флюент-построитель запросов. Например:
Авторы.Выбрать().Где("а = 0").Упорядочить()

Коннектор к SQLLiteWEB

Поскольку в Оскрипт.WEB своя реализация SQLLite, то и коннектор нужен свой.

Отдельные классы, описывающие интерфейсы аннотаций

Нужен некий класс, который позволит описать все поля и допустимые типы полей аннотации, а так же "контракты" - обработчики проверки корректности значений полей аннотации.

Инициализация модели аннотированной сущностью должна выполнять проверку заполнения аннотаций и выдавать внятные исключения при ошибках.

Падает сохранение объекта со вложенными таблицами, при использовании автоинкремента (SQLite)

При использовании автоинкремента в идентификаторах и ПодчиненнаяТаблица, сохранение "главной" сущности выкидывает исключение Внешнее исключение (Microsoft.Data.Sqlite.SqliteException): SQLite Error 19: 'FOREIGN KEY constraint failed'.

Пример кода:

//Файл Источник.os
&ПодчиненнаяТаблица(Тип = "Массив", ТипЭлемента = "ОписаниеПараметра")
Перем Параметры Экспорт;
МенеджерСущностей.ДобавитьКлассВМодель(Тип("ОписаниеПараметра"));
МенеджерСущностей.ДобавитьКлассВМодель(Тип("ОписаниеИсточника"));
МенеджерСущностей.Инициализировать();

Параметр = Параметры.Создать();
Параметр.Имя = "Тест";
Параметр.Значение = "фывыфв";
Параметр.Сохранить();

Источник = Источники.Создать();
Источник.Наименование = "Тест";
Источник.Тип = "Файл";
Источник.Параметры.Добавить(Параметр);
Источник.Сохранить();

При использовании ОС.Веб блокируются запросы после ошибки на уровне SQL (Коннектор SQLite)

В коннекторе SQL Lite нет обработки особождения семафора если Запрос.ВыполнитьКоманду() выкидывает исключение:

https://github.com/nixel2007/entity/blob/develop/src/%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B/%D0%9A%D0%BE%D0%BD%D0%BD%D0%B5%D0%BA%D1%82%D0%BE%D1%80SQLite.os#L175-L189

Migrations: Step 1

@nixel2007: Задачу миграции я бы разделил на две больших подзадачи.

  1. создание интерфейса/дто миграции с методами Вверх() и необязательным Вниз(), принимающими в себя коннектор/какой-то новый обьект для выполнения миграций и просто выполняющие субд-специфичную строку с текстом запроса миграции (из этого механизма несколько выпадает коннектор json, но с ним отдельно надо думать). Возможно ещё и с какими-то метаданными миграции, типа версии, чтобы можно было указывать миграцию/откат до какой-то версии. Менеджер миграции, который находил бы все дто миграции из определённой папки, сортировал бы их и выполнял нужные. Таблица в бд для учёта миграций - статус, версия, время выполнения.

Коннектор к PostgreSQL

Вводная

Коннектор состоит из двух реализаций:

  • Через sql библиотеку OneScript
  • Через ИнформационнаяБаза для OneScript.Web

Ошибка при редактировании Сущности - генерируется новый идентификатор

src\oscript_modules\entity\src\Классы\КоннекторPostgreSQL.os

Процедура Сохранить()
...

Запрос.ВыполнитьКоманду();

Если ОбъектМодели.Идентификатор().ГенерируемоеЗначение Тогда

	Если ЭтоВставкаОбъекта Тогда

...

ЗАМЕНИТЬ НА:

Запрос.ВыполнитьКоманду();

Если ОбъектМодели.Идентификатор().ГенерируемоеЗначение И НЕ ЗначениеЗаполнено(ОбъектМодели.ПолучитьЗначениеИдентификатора(Сущность)) Тогда

	Если ЭтоВставкаОбъекта Тогда

...

  • в этой же процедуре убрать:
    Сообщить(ТекстЗапроса);

Получение сущностей со сложным отбором

ЭлементОтбора = Новый ЭлементОтбора("ДатаРождения", ВидСравнения.Меньше, Дата(1990, 1, 1));

НайденныеФизЛица = МенеджерСущности.Получить(Тип("ФизическоеЛицо"), ЭлементОтбора);
МассивОтборов = Новый Массив;
ЭлементОтбора1 = Новый ЭлементОтбора("ДатаРождения", ВидСравнения.Меньше, Дата(1990, 1, 1));
ЭлементОтбора2 = Новый ЭлементОтбора("Имя", ВидСравнения.Равно, "Иван");

МассивОтборов.Добавить(ЭлементОтбора1);
МассивОтборов.Добавить(ЭлементОтбора2);

НайденныеФизЛица = МенеджерСущности.Получить(Тип("ФизическоеЛицо"), МассивОтборов);

Создание произвольных индексов в базах данных из аннотаций сущностей

Возможность через сущность создавать произвольные индексы таблиц. Например:

Дана сущность Автор

&Идентификатор
&ГенерируемоеЗначение
&Колонка(Тип = "Целое")
Перем Код Экспорт;

Перем УчетнаяЗапись Экспорт;

Перем Имя Экспорт;

Перем ЭлектроннаяПочта Экспорт;

&Сущность(ИмяТаблицы = "Авторы")
Процедура ПриСозданииОбъекта(пКод = Неопределено)

	Если ЗначениеЗаполнено(пКод) Тогда
		Объект = МенеджерБазыДанных.АвторыМенеджер.ПолучитьОдно(пКод);	
		Если ЗначениеЗаполнено(Объект) Тогда
			ЗаполнитьЗначенияСвойств(ЭтотОбъект, Объект);
		КонецЕсли;
	КонецЕсли;

КонецПроцедуры

Мы хотим создать произвольный индекс по колонке ЭлектроннаяПочта. Добавляем аннотацию:

&Индекс(Имя = "ПроизвольныйИндекс", Колонки = "ЭлектроннаяПочта")

Пулл соединений в менеджере сущностей

Подумать над большей потокобезопасностью менеджера сущностей в плане работы с коннектором субд.

вызов двух методов НачатьТранзакцию должен как-то распределяться по разным коннекторам. соответственно и сохранение/получение сущностей должно работать как-то в разных коннекторах.

Идентификатор сущности вместе самой сущности при использовании ПодчиненнаяТаблица

Дано

РандомнаяСущность.os - сущность, где идентификатор:

...
&Идентификатор
&ГенерируемоеЗначение
&Колонка(Тип = "Целое")
Перем Код Экспорт;
...

Какая-то еще НоваяСущность.os с переменной:

...
&ПодчиненнаяТаблица (Тип = "Массив", ТипЭлемента = "РандомнаяСущность")
Перем Коллекция Экспорт;
...

Добавляем в нее через

НоваяСущность.Коллекция  = Новый Массив;
НоваяСущность.Добавить(РандомнаяСущность);

После записи НоваяСущность и ее повторного чтения имеем:

НоваяСущность.Коллекция[0] // Значение = 1

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.