Новая NoSQL
Я написал свою JSON-ориентированную безсерверную NoSQL SimpleBase – быструю, надежную и с Mongo-подобным интерфейсом. Ее можно использовать в продуктах Simpe и любых других проектах. Код открыт.
Документация: https://simplebase.readthedocs.io/en/latest/#
GitHub : https://github.com/dvdocumentation/simplebase
СУБД встроена в SimpleUI в виде python-библиотеки и в виде Java-класса, т.е. с базой данных можно работать разными способами.
Зачем я ее написал?
Это наиболее простой способ работы с локальным хранением – по сути чистый JSON, для которого не нужно знать SQL, да и вообще -на JSON в стеке симпла буквально все – команды, разметки экрана и переменных. Например: пришли документы из 1С по http – это JSON, его не надо растаскивать по таблицам, а можно хранить как есть, работать с ним как есть, выводить на экран, заполнять экранные списки – JSON, обратно отсылать – тоже JSON без собирания и упаковки. Получается это намного проще SQL, а из стека нужно знать только работу со словарями и списками - итерации и вот это вот все.
За счет особой архитектуры работы с данными удалось добиться показателей скорости, сравнимых с SQL в критичных участках: добавление данных, поиск по индексу, текстовый поиск.
Свойства SimpleBase:
- Мгновенное добавление новых записей в коллекции независимо от размера коллекции благодаря специальной архитектуре хранения.
- Более быстрая работа с операциями, за счет того, что не требуется кодировать/декодировать всю коллекцию (которая может быть очень большой)
- Коллекции всегда хранятся в оперативной памяти с отслеживанием изменений одновременно: данные перечитываются с диска только в том случае, если они были изменены другим процессом.
- ACID для многопользовательской и многопоточной работы
- Два типа индексов для ключевых типов запросов — хеш-индекс и специальное B-дерево для полнотекстового поиска.
- Поддержка транзакций (сессий)
Примеры работы в документации, на гитхабе и в ui-примерах к статье
Интеграция питон-библиотеки
Питон библиотека уже встроена в приложения и для использования достаточно импорта, чтобы использовать СУБД
from pysimplebase import SimpleBase
Пути к базам по умолчанию располагаются в папке SimpleBase и для того чтобы работать с базой и из Python и из нативных обработчиков нужно располагать файл в ней. Для этого есть функция get_simplebase_files в классе SimpleUtilities
Например:
db = SimpleBase("testdb3",path=suClass.get_simplebase_dir(),timeout=200)
Нативная интеграция (переменные, нативные обработчики)
Также, помимо python реализована поддержка на уровне приложения – через обработчики типа nosql и через команды-переменные. Через команды-переменные можно работать с СУБД онлайн – из 1С например. И также нативные обработчики (аналогично нативным SQL-обработчикам) доступны всегда, а Python доступен только когда приложение запущено в памяти (есть контекст приложения), а, например, если приложение в памяти не висит, но при этом все еще доступен фоновый сервис или воркер – то Python в этот момент недоступен, в отличие от нативных обработчиков.
Важно. Нативные обработчики поддерживают только базовые CRUD функции + find(базовый) и all, со сложными запросами, индексами, сессиями следует работать из python-обработчиков
Формат обработчиков типа обработчика nosql:
<имя базы> <имя коллекции> <команда> <параметр, если есть>
Например:
dbnative test_1 insert {"txt":"Привет мир","count":1}
Команды при успешном выполнении возвращают результат в переменную NOSQLResult
Все то же самое поддерживается через команды-переменные с помощью общей команды "RunSimpleBase"
RunSimpleBase,< [{"database":<имя базы>,"collection":<имя коллекции>,"command":<команда>,"value":<значение>},…] >
Например (данный пример логичнее сделать из 1С, но у меня для простоты локальный Python):
hashMap.put("RunSimpleBase",json.dumps([{"database":"dbnative","collection":"test_1","command":"insert","value":{"caption":"Hello world"}}]))
Работа с файлами
Полноценно работать с файлами за пределами папки приложения в новых версиях Android все сложнее и сложнее, но кое-что пока можно. При этом внутри папки приложения можно работать средствами, например, Python без ограничений.
Диалоги «Открыть файл»/Сохранить файл
Открытие файла через диалог(пикер) состоит из комманды-переменной и обработчика события.
Надо отметить, что можно открывать файлы и не через диалог, а через открытие файла приложением Simple через Открыть (доступен соответствующий общий обработчик).
OpenExternalFile, пустой параметр – команда запуска диалога, при открытии файла генерируется событие FileOpen которое можно перехватить в обработчике типа pythonbytes в который попадает байт-массив открытого файла.
SaveExternalFile, параметр: {"path":<путь к внутреннему файлу>,"default":<имя по умолчанию>} – команда запуска диалога выбора локации сохранения файла и имени файла (можно выбрать имя по умолчанию). При успешном сохранении генерируется событие FileSave
Сохранение в Downloads
В Java классе SimpleUtilites появилась функция download_file(<имя файла>), которая сохраняет файл (сформированный в папке приложения) во внешнюю паапку Downloads (коллекция Загрузки).
Таким образом можно сбрасывать информацию в виде файлов как через диалог так и безусловно.
Ручное задание VisionSettings для распознавания текста в экранах и ActiveCV
VisionSettings для настройки OCR можно задавать в конструкторе, но также сейчас есть возможность переопределять его в коде.
SetVisionSettings(<{словарь с настройками}>) – команда для экранов и ActiveCV которая, если ее выполнить до запуска OCR, задаст настройки детектора OCR
Доступные настройки тут: https://uitxt.readthedocs.io/ru/latest/cv.html#ocr
Модернизация детектора Мультисканер
Мультисканер это один из детекторов ActiveCV, который включает в себя детектирование материальных объектов для каждого из которых можно динамически подключить детектор штрихкодов внутри объекта (barcode), распознавание текста внутри объекта (ocr) и отключить детекторы (stop). На этом режиме построен ранее публикуемый прайсчекер //infostart.ru/1c/tools/1882131/
В новом релизе он значительно улучшен:
- Добавлена возможность фильтрации OCR до передачи в обработчик. Текст внутри объекта разбивается на массив элементов, к кажому из которых можно применить фильтр по минимальной/максимальной длине, «заменять O на 0», «в верхний регистр» а также новый фильтр «OnlyNumbers» - только числа
- Для подключения режима предварительной фильтрации требуется использовать команду UseVisionSettings (предварительно должны быть установлены настройки распознавания)
- Улучшена команда stop – синхронизируется между несколькими потоками и прерывает мгновенно
- Улучшено быстродействие в целом и перенесена обработка на локальный TensorFlow
Мини-релизы, по которым не было описание на Инфостарте
В своем ТГ я публикую промежуточные релизы и патчи, для которых не пишу статьи на Инфостарт
Вот список изменений в последних двух релизах:
Релиз 11.50.00 https://telegra.ph/OpenCV-v-relize-SimpleUI-1150-04-20
• Поддержка OpenCV. Теперь можно всё и сразу.
• Распознавание 2D-материальных объектов по фичам (не нейросеть – feature detection). Теперь можно распознавать полиграфическую продукцию и тому подобное.
Релиз 11.50.35 https://telegra.ph/Nebolshoj-reliz-115035-04-28
• Компрессия трафика GZIP для онлайн обработчиков. Сильно экономит трафик и скорость на 3G/4G
• OCR для экранов: возможность использовать обработчик вместо опорной выборки (вместо SQL и списка значений)
• selected_card_data – возврат всего содержимого карточки/строки таблицы
• Возможность изменения запросов онлайн-обработчиков для работы в стиле *args
Запуска таймеров из кода
Таймеры (повторяющиеся в фоне задания) можно определить в конфигурации и также в новом релизе запустить/остановить из кода.
StartTimers, пустой параметр – инициализирует объект таймеров
StartTimer, <{"handler":<массив обработчиков>,"period":<периодичность, мс>}> - добавляет новый таймер и запускает его
StopTimers, пустой параметр – останавливает объект таймеров и удаляет все ранее добавленные таймеры (командой StartTimer)
Улучшенная работа с диалогом
Переопределить содержимое модального диалога можно было через указание процесса с экраном-образцом, теперь можно задать контейнер напрямую
ShowDialogLayout, <JSON-структура котнейнера> - определяет содержимое окна диалога. Используется совместно с командой ShowDialog
Режим записи переменных при возврате из обработчика StackAddMode
Обработчик, начиная свое выполнение, забирает содержимое стека переменных, а после выполнения возвращает назад перезаписью стека. При параллельной работе в нескольких потоках и одновременно при длительном выполнении обработчиков, может случиться коллизия – длительный обработчик вернет состояние переменных и перезапишет то, что за это время успело поменяться в других потоках, например, пользователем.
Для избежания этой коллизии следует определить переменную _StackAddMode до начала обработчиков, тогда возвращаемый стек переменных будет в режиме объединения а не замещения.
Прочие доработки
- Поддержка уведомлений в Андроид 13 (требуется разрешение)
- Поддержка параметров в JSON в SQLQuery, SQLExcec (аналогично в SQLExcecMany)
- runprogress можно запускать в onStart/onPostStart
- интегрирована поддержка html2image для сохранения html в виде картинки. Документации нет – только пример.
- исправлены ошибки и проведены оптимизации
- переработаны разделы документации «Хранение», «CV»
Примеры к релизу, как всегда, в основной статье //infostart.ru/1c/tools/1153616/
Конечно же, Телеграм-канал проекта, в котором масса всего полезного: https://t.me/devsimpleui