Переключение на Главную Страницу Страницы: 1 ... 70 71 [72] 73 74 ... 79 ОтправитьПечать
Очень популярная тема (более 25 ответов) 1sqlite (число прочтений - 458083 )
Ветер в поле
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 40
Зарегистрирован: 06. Октября 2010
Пол: Мужской
Re: 1sqlite
Ответ #1065 - 23. Декабря 2022 :: 15:20
Печать  
А вот небольшое развитие опубликованной выше функции. Добавил возможность селекции. Т.е. с помощью конструкции типа РазобратьВСписок(СтрJSON, "$.analysisGroups") можно получить список с конкретным объектом в JSON
Можно без затей получить все данные через РазобратьВСписок(СтрJSON). Так получается более универсально и эффективно.

Код
Выбрать все
Функция РазобратьВСписок(Стр, Узел="$") Экспорт

	итJSON = глБДSQLite.НовыйЗапрос().ВыполнитьЗапрос(
		"SELECT
		| key as Ключ, atom as Значение, type as Тип, id as [ИД $Число.10.0], parent as [ИДРодителя $Число.10.0]
		|FROM json_tree('" + Стр + "', '" + Узел + "')", СоздатьОбъект("ИндексированнаяТаблица"));

	Если итJSON.КоличествоСтрок() = 0 Тогда
		Возврат СоздатьОбъект("СписокЗначений");
	КонецЕсли;

	итОбъектов = СоздатьОбъект("ИндексированнаяТаблица");
	итОбъектов.НоваяКолонка("ИД");
	итОбъектов.НоваяКолонка("Объект");

	ИндексИДОбъекта = итОбъектов.ДобавитьИндекс("ИД", "ИД", 1);

	ТекИДОбъекта = итJSON.ПолучитьЗначение(1, "ИД");
	ТекОбъект = СоздатьОбъект("СписокЗначений");

	итОбъектов.НоваяСтрока();
	итОбъектов.ИД = ТекИДОбъекта;
	итОбъектов.Объект = ТекОбъект;

	итJSON.ВыбратьСтроки();
	Пока итJSON.ПолучитьСтроку() = 1 Цикл
		ТекТип = итJSON.Тип;
		Если Найти("text,integer,true,false,null", ТекТип) > 0 Тогда
			ТекЗначение = итJSON.Значение;

		ИначеЕсли Найти("object,array", ТекТип) > 0 Тогда
			Если итJSON.ИД = ТекИДОбъекта Тогда
				Продолжить; //это уже обработано еще до цикла
			КонецЕсли;

			ТекЗначение = СоздатьОбъект("СписокЗначений");

			итОбъектов.НоваяСтрока();
			итОбъектов.ИД = итJSON.ИД;
			итОбъектов.Объект = ТекЗначение;

		ИначеЕсли ТекТип = "real" Тогда
			ТекЗначение = Окр(итJSON.Значение, 8); //чтобы не было значений типа 1.19999999999999

		Иначе
			глВывестиМногострочноеСообщение("РазобратьВСписок2: Неизвестный тип значения - " + ТекТип + ". Значение " + итJSON.Значение);
			Продолжить;
		КонецЕсли;

		Если ТекИДОбъекта <> итJSON.ИДРодителя Тогда
			ТекИДОбъекта = итJSON.ИДРодителя;
			Если итОбъектов.НайтиСтроку(ИндексИДОбъекта, ТекИДОбъекта, 0, 1) = 0 Тогда
				глВывестиМногострочноеСообщение("РазобратьВСписок2: Какая-то ошибка - не найден объект, который уже должен был быть загружен - " + ТекИДОбъекта);
				ТекИДОбъекта = -1;
				Продолжить;
			КонецЕсли;

			ТекОбъект = итОбъектов.Объект;
		КонецЕсли;

		ТекОбъект.ДобавитьЗначение(ТекЗначение, Строка(итJSON.Ключ));
	КонецЦикла;

	Возврат итОбъектов.ПолучитьЗначение(1, "Объект");

КонецФункции //РазобратьВСписок
 

  
Наверх
 
IP записан
 
Djelf
God Member
*****
Отсутствует


Ubuntu + wine@etersoft
+ 1C 7.7

Сообщений: 633
Местоположение: Питер
Зарегистрирован: 02. Ноября 2007
Пол: Мужской
Re: 1sqlite
Ответ #1066 - 24. Декабря 2022 :: 08:24
Печать  
Ветер в поле писал(а) 23. Декабря 2022 :: 14:53:
Самый большой мой файл JSON размером 3400К распарсился за 1 с. Это в разы быстрее, чем парсинг XML файлов такого объема.

Этот вопрос тоже решаемый, вот этим:  https://github.com/jakethaw/xml_to_json
Сборка расширения тут: https://cloud.mail.ru/public/XabY/oh13hFeNa
Правда не все xml`ки видимо съест и пространства имен оставляет, что не есть хорошо.
Код (SQL)
Выбрать все
SELECT load_extension("xml_to_json") as xml_to_json;
SELECT * from json_tree(xml_to_json('<?xml version="1.0" ?><x><y>тест</y><y>def</y></x>', 0)); 




P.S. Вот тут очень большая подборка расширений https://github.com/nalgeon/sqlean
Собираются православным gcc без всяких плясок с бубном.
« Последняя редакция: 24. Декабря 2022 :: 13:34 - Djelf »  
Наверх
www  
IP записан
 
Ветер в поле
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 40
Зарегистрирован: 06. Октября 2010
Пол: Мужской
Re: 1sqlite
Ответ #1067 - 26. Декабря 2022 :: 19:28
Печать  
Спасибо!

Достаточно быстро конвертирует, но необходима подготовка перед конвертацией (замена апострофов на кавычки), ну и после конвертации некоторые мои файлы не парсятся потом через json_tree - ругается "Ошибка подстановки текстового параметра  - Плохое имя параметра". Скорее всего это заморочки парсера. Может какие-нибудь нечитаемые символы сбивают его с толку
  
Наверх
 
IP записан
 
Djelf
God Member
*****
Отсутствует


Ubuntu + wine@etersoft
+ 1C 7.7

Сообщений: 633
Местоположение: Питер
Зарегистрирован: 02. Ноября 2007
Пол: Мужской
Re: 1sqlite
Ответ #1068 - 27. Декабря 2022 :: 04:47
Печать  
Ветер в поле писал(а) 26. Декабря 2022 :: 19:28:
Спасибо!

Достаточно быстро конвертирует, но необходима подготовка перед конвертацией (замена апострофов на кавычки), ну и после конвертации некоторые мои файлы не парсятся потом через json_tree - ругается "Ошибка подстановки текстового параметра  - Плохое имя параметра". Скорее всего это заморочки парсера. Может какие-нибудь нечитаемые символы сбивают его с толку


Все верно, лучше ТекстДляПарсинга засовывать через УстановитьПараметр, иначе ТекстДляПарсинга будет обрабатываться метапарсером 1sqlite и это получается ~20% медленее и приводит вот к таким казусам. Т.е. вот так будет и безопаснее и быстрее:
Код (SQL)
Выбрать все
Запрос = База.НовыйЗапрос();
Запрос.Подготовить(ТестЗапроса);
Запрос.УстановитьПараметр("@ТекстJson", ТекстJson);
тз = Запрос.Выполнить(); 

  
Наверх
www  
IP записан
 
Ветер в поле
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 40
Зарегистрирован: 06. Октября 2010
Пол: Мужской
Re: 1sqlite
Ответ #1069 - 09. Января 2023 :: 11:35
Печать  
Djelf писал(а) 27. Декабря 2022 :: 04:47:
Все верно, лучше ТекстДляПарсинга засовывать через УстановитьПараметр, иначе ТекстДляПарсинга будет обрабатываться метапарсером 1sqlite и это получается ~20% медленее и приводит вот к таким казусам. Т.е. вот так будет и безопаснее и быстрее:
Код (SQL)
Выбрать все
Запрос = База.НовыйЗапрос();
Запрос.Подготовить(ТестЗапроса);
Запрос.УстановитьПараметр("@ТекстJson", ТекстJson);
тз = Запрос.Выполнить(); 



Переписал на параметризированный запрос. Ошибки ушли, скорость обработки существенно возросла.
Спасибо еще раз!
  
Наверх
 
IP записан
 
Djelf
God Member
*****
Отсутствует


Ubuntu + wine@etersoft
+ 1C 7.7

Сообщений: 633
Местоположение: Питер
Зарегистрирован: 02. Ноября 2007
Пол: Мужской
Re: 1sqlite
Ответ #1070 - 09. Января 2023 :: 13:12
Печать  
Небольшое Новогоднее обновление на движок 3.41.0.26
https://cloud.mail.ru/public/9znr/ZJ6ULE9aR
Задержка выпусков обусловлена тем, что сначала почти ничего интересного (для меня, да и никто не хотел) не происходило.
Потом добавили  RIGHT JOIN (это я уже научился избегать, мало уже интересно).
Но почти сразу добавили отрицатльный фильтр выборки Bloom (который глючил не с базами 1С, а с моими сторонними базами sqlite).
Описание Bloom:
https://ru.wikipedia.org/wiki/%D0%A4%D0%B8%D0%BB%D1%8C%D1%82%D1%80_%D0%91%D0%BB%...
Сейчас (на моих тестах и в продакшен) работает нормально.

P.S. Все изменения движка sqlite тут: https://www.sqlite.org/draft/changes.html

P.P.S. Будут проблемы, давайте тест для воспроизведения, может что-то и получится исправить.
  
Наверх
www  
IP записан
 
alyuev
God Member
*****
Отсутствует


Гражданин Вселенной

Сообщений: 850
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: 1sqlite
Ответ #1071 - 06. Апреля 2023 :: 13:56
Печать  
Djelf, подскажи пожалуйста. Ты компилил 1sqlite без опции SQLITE_ENABLE_UPDATE_DELETE_LIMIT? Просто понадобилось удалять как

DELETE FROM table
WHERE search_condition
ORDER BY criteria
LIMIT row_count OFFSET offset;

Но сейчас так не дает. Полагаю, что без опции скомпилировано.
  

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
Djelf
God Member
*****
Отсутствует


Ubuntu + wine@etersoft
+ 1C 7.7

Сообщений: 633
Местоположение: Питер
Зарегистрирован: 02. Ноября 2007
Пол: Мужской
Re: 1sqlite
Ответ #1072 - 07. Апреля 2023 :: 05:08
Печать  
alyuev писал(а) 06. Апреля 2023 :: 13:56:
Но сейчас так не дает. Полагаю, что без опции скомпилировано.

Глянул внимательнее.
Судя по мануали https://sqlite.org/compile.html

Цитата:
SQLITE_ENABLE_UPDATE_DELETE_LIMIT

This option enables an optional ORDER BY and LIMIT clause on UPDATE and DELETE statements.

If this option is defined, then it must also be defined when using the Lemon parser generator tool to generate a parse.c file.
Because of this, this option may only be used when the library is built from source, not from the amalgamation or from the collection of pre-packaged C files provided for non-Unix like platforms on the website.

Т.е. при сборке 1sqlite c монолитным amalgamation эта опция ничего не даст.
Может когда-то это работало, зачем и когда отключили я не нашел.
« Последняя редакция: 07. Апреля 2023 :: 08:42 - Djelf »  
Наверх
www  
IP записан
 
alyuev
God Member
*****
Отсутствует


Гражданин Вселенной

Сообщений: 850
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: 1sqlite
Ответ #1073 - 28. Апреля 2023 :: 13:49
Печать  
Спасибо. Понятно.
  

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
noknown
YaBB Newbies
*
Отсутствует


Спасибо за 1C++!

Сообщений: 2
Местоположение: Россия
Зарегистрирован: 02. Мая 2023
Пол: Мужской
Re: 1sqlite
Ответ #1074 - 02. Мая 2023 :: 22:46
Печать  
Djelf, доброго времени суток! Не планируется ли доработка оптимизации запросов с условиями IN? А то как-то даже обидно: древняя 1.0.2.3 выполняет за 200мсек, а последняя - и за 200 секунд не справляется... Кое-где я запросы попеределал, но не везде...
  
Наверх
 
IP записан
 
Djelf
God Member
*****
Отсутствует


Ubuntu + wine@etersoft
+ 1C 7.7

Сообщений: 633
Местоположение: Питер
Зарегистрирован: 02. Ноября 2007
Пол: Мужской
Re: 1sqlite
Ответ #1075 - 03. Мая 2023 :: 12:35
Печать  
noknown писал(а) 02. Мая 2023 :: 22:46:
Djelf, доброго времени суток! Не планируется ли доработка оптимизации запросов с условиями IN? А то как-то даже обидно: древняя 1.0.2.3 выполняет за 200мсек, а последняя - и за 200 секунд не справляется... Кое-где я запросы попеределал, но не везде...

Оптимизацию по IN в sqlite отключить сложно:
- при компиляции можно вообще отключить поддержку IN, но это нам не надо;
- такой опции в pragma нет;
- в sqlite3_test_control тоже нет отключения (это в консольке sqlite используется, но можно и из вк чуток ткнуть);
- в sqlite3_index_info IN попадет как "=" т.е. и тут не засечь
- вроде есть что-то по этому поводу: sqlite3_vtab_in, но как и где это применить я в недоумении (покрутил чуток, но кажется, это так не работает как я это понимаю);

В проблемным запросах нужно просто "+" поставить перед проблемным полем, т.е. +Таблица.Поле IN(...) это не сложно и это можно очень быстро поправить.
Обычно эта оптимизация может такие запросы ускорить, но может и замедлить, поэтому "+" в проблемных запросах и все.
  
Наверх
www  
IP записан
 
noknown
YaBB Newbies
*
Отсутствует


Спасибо за 1C++!

Сообщений: 2
Местоположение: Россия
Зарегистрирован: 02. Мая 2023
Пол: Мужской
Re: 1sqlite
Ответ #1076 - 05. Мая 2023 :: 15:53
Печать  
Djelf писал(а) 03. Мая 2023 :: 12:35:
В проблемным запросах нужно просто "+" поставить перед проблемным полем, т.е. +Таблица.Поле IN(...) это не сложно и это можно очень быстро поправить.
Обычно эта оптимизация может такие запросы ускорить, но может и замедлить, поэтому "+" в проблемных запросах и все.


Охххх. Дай Джа тебе здоровья, успехов в делах и долгих лет! Поставил в запросах плюсы и всё взлетело! Спасибо тебе огромное милчеловек! Храни тебя Джа!
  
Наверх
 
IP записан
 
Ветер в поле
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 40
Зарегистрирован: 06. Октября 2010
Пол: Мужской
Re: 1sqlite
Ответ #1077 - 29. Мая 2023 :: 19:00
Печать  
У меня какой-то невозможный глюк. После обновления с версии 3.16.2.14 на более новые, перестал работать LIKE. Причем работает только при поиске по одной букве. Т.е. по условию Спр.Descr collate _1C LIKE 'иванов%' ничего не найдет.
По условию Спр.Descr collate _1C LIKE '%иванов%' ищет все, но попадают, конечно еще и отчества. Но самое главное, что тут поиск без индекса.
По условию Спр.Descr collate _1C LIKE 'и%' нормально ищет используя индекс. А добавляешь еще хотя бы одну букву и ничего не находит.
  
Наверх
 
IP записан
 
Djelf
God Member
*****
Отсутствует


Ubuntu + wine@etersoft
+ 1C 7.7

Сообщений: 633
Местоположение: Питер
Зарегистрирован: 02. Ноября 2007
Пол: Мужской
Re: 1sqlite
Ответ #1078 - 30. Мая 2023 :: 09:54
Печать  
Ветер в поле писал(а) 29. Мая 2023 :: 19:00:
У меня какой-то невозможный глюк. После обновления с версии 3.16.2.14 на более новые, перестал работать LIKE. Причем работает только при поиске по одной букве. Т.е. по условию Спр.Descr collate _1C LIKE 'иванов%' ничего не найдет.
По условию Спр.Descr collate _1C LIKE '%иванов%' ищет все, но попадают, конечно еще и отчества. Но самое главное, что тут поиск без индекса.
По условию Спр.Descr collate _1C LIKE 'и%' нормально ищет используя индекс. А добавляешь еще хотя бы одну букву и ничего не находит.

Та же самая ерунда что чуть выше с IN, в 3.16.2 индекс по LIKE не использовался, можешь сам проверить с помощью "explain QUERY PLAN " +ТекстЗапроса.
В принципе он и не должен работать, я сейчас проверил в коде, индексы я разрешил только по примитивным сравнениям (больше, меньше равно в разных сочетаниях).
Где-то я индексу по LIKE кислород видать не перекрыл (см. ниже, там все интереснее происходит).
Реализовать будет сложно, а вот отключить попробую.

sqlite подает запрос на поиск индекса в 1sqlite:
WHERE Автомобили.DESCR  LIKE 'автом%'
Подбор индекса для таблицы SC7649 :
     Ограничения: DESCR>=; DESCR<; DESCR like;
     Выбран индекс DESCR: UPPER(DESCR)
     Стоимость: 10

И подсовывает уже при выполнении запроса DESCR>='автом' и DESCR< 'автон', (это видно уже при explain+ТекстЗапроса) а потом уже видимо хочет прогнать like, но так это не работает, должно быть DESCR< 'автояяяяяяяяяяяяяяяяяяяяяя'.
А какого лешего поиск работает с одной буковой мне вообще никак не понятно. Не должно работать, ну вот просто не должно и все!

P.S. Сейчас стоит отключить индекс через +Автомобили.DESCR.

P.P.S. Лучше попробуй fts5 с триграмным токинайзером, это значительно круче!
Тут обсуждали https://forum.mista.ru/topic.php?id=886147&page=1
« Последняя редакция: 30. Мая 2023 :: 12:23 - Djelf »  
Наверх
www  
IP записан
 
Ветер в поле
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 40
Зарегистрирован: 06. Октября 2010
Пол: Мужской
Re: 1sqlite
Ответ #1079 - 31. Мая 2023 :: 06:28
Печать  
Djelf писал(а) 30. Мая 2023 :: 09:54:
Та же самая ерунда что чуть выше с IN, в 3.16.2 индекс по LIKE не использовался, можешь сам проверить с помощью "explain QUERY PLAN " +ТекстЗапроса.
В принципе он и не должен работать, я сейчас проверил в коде, индексы я разрешил только по примитивным сравнениям (больше, меньше равно в разных сочетаниях).
Где-то я индексу по LIKE кислород видать не перекрыл (см. ниже, там все интереснее происходит).
Реализовать будет сложно, а вот отключить попробую.

sqlite подает запрос на поиск индекса в 1sqlite:
WHERE Автомобили.DESCR  LIKE 'автом%'
Подбор индекса для таблицы SC7649 :
     Ограничения: DESCR>=; DESCR<; DESCR like;
     Выбран индекс DESCR: UPPER(DESCR)
     Стоимость: 10

И подсовывает уже при выполнении запроса DESCR>='автом' и DESCR< 'автон', (это видно уже при explain+ТекстЗапроса) а потом уже видимо хочет прогнать like, но так это не работает, должно быть DESCR< 'автояяяяяяяяяяяяяяяяяяяяяя'.
А какого лешего поиск работает с одной буковой мне вообще никак не понятно. Не должно работать, ну вот просто не должно и все!

P.S. Сейчас стоит отключить индекс через +Автомобили.DESCR.

P.P.S. Лучше попробуй fts5 с триграмным токинайзером, это значительно круче!
Тут обсуждали https://forum.mista.ru/topic.php?id=886147&page=1


Большое спасибо! А я уж было подумал, что у меня какой-то невозможный глюк - у всех всё работает и не жалуются - один я с проблемой...
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1 ... 70 71 [72] 73 74 ... 79
ОтправитьПечать