SlideShare a Scribd company logo
1 of 52
AlaSQL
SQL библиотека для обработки данных на JavaScript
Андрей Гершун PiterJS
agershun@gmail.com 14 мая 2015 года
@agershun
1
à la
SQL
Содержание
• Зачем нужен SQL на клиенте?
• Как установить AlaSQL?
• Как использовать AlaSQL?
• Решение задач ETL
• Хранение данных на клиенте
• Расширение SQL
• Как устроен AlaSQL?
2
Зачем SQL на клиенте?
• Задачи обработки данных
• Выбор (SELECT, REMOVE COLUMNS)
• Сортировка (ORDER BY)
• Группировка (GROUP BY)
• Выборка (WHERE, HAVING)
• Соединение (JOIN)
• Импорт/экспорт в различные форматы
хранения данных (Excel, CSV, TXT,
Google)
• Хранение данных на клиенте
3
Почему бы не использовать только
«большие» базы данных?
• Может быть плохая связь
• Хранение данных в памяти клиента
• Быстрый фронт-энд для приложений BI
4
Какие решения уже существуют?
• Встроенные базы данных
• WebSQL
• IndexedDB
• SQL на JavaScript
• SQL.js
• SequelSphere
• “Почти” SQL
• Lovefield
• ydb-db
• pouchDB
5
Как можно использовать SQL в
программе на JavaScript?
<script src="alasql.min.js"></script>
<script>
alasql("CREATE TABLE cities ( 
city string, population number)");
alasql("INSERT INTO cities VALUES 
('Rome',2863223), ('Paris',2249975),
('Berlin',3517424), ('Madrid',3041579)");
console.log( alasql("SELECT * FROM cities 
WHERE population < 3500000 
ORDER BY population DESC") );
</script>
6
Как с помощью SQL обрабатывать
данные JavaScript ?
<script src=“alasql.min.js”></script>
<script>
var data = [{a:10},{a:2},{a:25}];
var res = alasql(‘SELECT * FROM ? ORDER BY a’,[data]);
</script>
7
API
• Синхронный
var res = alasql(‘SELECT * FROM one’,
[params]);
• Асинхронный (для операций с файлами)
alasql(‘SELECT * FROM two’, [params],
function(data,err) {
if(err) console.log(err);
console.log(data)
});
8
AlaSQL
Пакеты NPM, Bower, Meteor
Установка:
npm install alasql
bower install alasql
meteor add agershun:alasql
Подключение
<script src=“alasql.min.js”></script>
var alasql = require(‘alasql’);
Зависимости от других библиотек:
• Нет
• xlsx-js, TableTop, AngularJS, Meteor - для отдельных операций
импорта-экспорта
9
WebWorker
<script src="alasql-worker.min.js"></script>
<script>
var arr = [{a:1},{a:2},{a:1}];
alasql('SELECT * FROM ?',[arr], function(data) {
console.log(data);
});
</script>
или изнутри WebWorker:
importScripts(‘alasql.min.js’);
10
SQL-92
• SELECT
• INSERT
• DELETE
• UPDATE
• CREATE TABLE
• CREATE VIEW
• CREATE UNIQUE
INDEX
• CREATE DATABASE
• и другие операторы
• Реализованы
практически все
основные операторы
и функциональность
SQL за исключением
триггеров и
ограниченной
поддержки
транзакций
11
CREATE TABLE Fruits (
fruitid INT PRIMARY KEY,
fruitname NVARCHAR(MAX),
price MONEY
);
CREATE TABLE Orders (
orderid INT PRIMARY KEY IDENTITY,
fruitid INT REFERENCES Fruits(fruitid),
qty FLOAT
);
INSERT INTO Fruits
VALUES (1,"Peach",22), (2,"Apple",10),(3,"Melon",14);
INSERT INTO Orders (fruitid, qty)
VALUES (1,100), (2,150), (3,25);
SELECT f.fruitname, f.price, o.qty,
f.price*o.qty AS amount
FROM Orders o
INNER JOIN Fruits f USING fruitid;
12
Все JOINы на свете…
• CROSS JOIN
• INNER JOIN
• LEFT OUTER JOIN
• RIGHT OUTER JOIN
• FULL OUTER JOIN
• SEMI JOIN
• ANTI JOIN
• NATURAL JOIN
• ON
• USING
• CROSS APPLY
• OUTER APPLY
13
Обработка данных JSON
SELECT {a:1,b:2}
{a:1,b:2}
SELECT {a:1,b:2} == {a:1,b:2}
true
SELECT {a:1,b:2}->b
2
SELECT {a:1,b:(2*2)}->b
4
SELECT @[1,2,3,(b+4)] FROM @[{b:100}]
[1,2,3,104]
14
РЕШЕНИЕ ЗАДАЧ ETL
Извлечение, обработка, загрузка данных
15
Импорт и экспорт данных
(CSV, TAB, XLSX)
SELECT Country, Name
INTO CSV("mydata.csv")
FROM XLSX("cities.xlsx",
{headers:true, range:"B1:E10"})
WHERE Population > 100000',
16
17
18
Пример: Подготовка данных для
Google Maps из Slideshare.com
Данные
по
просмот
рам
XLSX
(на
сервере)
Гео
данные
по
странам
CSV
(в
Интерне
те)
Данные
по
просмотр
ам
по
странам
с
указание
м
широты
и долготы
Массив
JavaScrip
t
slideshare
.com
github.co
m
Google
Maps API
JOI
N
19
SELECT countries.*, views.cnt
FROM (
SELECT Country, COUNT(*) AS cnt
FROM "all_latest_views_3m.csv"
GROUP BY Country
) AS views
JOIN (
SELECT *
FROM "https://abc.com/lat-long-
countries.csv"
) AS countries USING Country
20
Сохранение данных в XLS с цветами и
стилями
var mystyle = {
headers: true,
column: {style:{Font:{Bold:"1"}}},
rows: {1:{style:
{Font:{Color:"#FF0077"}}}}
};
alasql('SELECT * INTO XLSXML("rest.xls",?) 
FROM ?',[mystyle,data]);
21
Alacon - утилита для ETL
> alacon “SELECT 2+2”
4
> alacon “SELECT * INTO 'medals.csv'
FROM 'medals.xlsx' WHERE Year=2008”
22
ХРАНЕНИЕ ДАННЫХ
НА КЛИЕНТЕ
IndexedDB, localStorage, fileStorage
23
IndexedDB
ATTACH INDEXEDDB DATABASE geo;
CREATE TABLE IF NOT EXISTS geo.country;
SELECT * INTO geo.country
FROM CSV("country.csv",{headers:true});
SELECT * INTO XLSX("asia.xlsx")
FROM geo.country
WHERE continent_name = "Asia"');
24
ИНТЕГРАЦИЯ С ДРУГИМИ
ПОПУЛЯРНЫМИ
БИБЛИОТЕКАМИ
Angular.js, d3.js
25
Angular.js
$scope.exportData = function () {
alasql('SELECT * 
INTO XLSX("john.xlsx”,{headers:true})
FROM ?',[$scope.items]);
};
26
27
Alasql для d3.js:
Олимпийские медали из Excel
28
alasql('SELECT '+axe+', 
SUM([Gold Medals]) AS Gold, 
SUM([Silver Medals]) AS Silver, 
SUM([Bronze Medals]) AS Bronze 
FROM "medals.csv" 
GROUP BY '+axe+'
ORDER BY '+axe,[],function (data){
// data - выборка медали по заданной
оси
});
Интеграция с d3.js
alasql('SELECT . . .’, function(data){
d3.select("body")
.append('ul')
.data(data)
.entry()
.append('li')
.text(function(d){return d[axe]});
});
29
30
ЗА РАМКАМИ SQL
Графы, объекты
31
Поиск по вложенным JSON объектам
var data = {a:{a:{a:{a:{b:10}}}},b:20};
alasql(‘SEARCH a b FROM ?,[data])
20
alasql(‘SEARCH /* b FROM ?,[data])
[10,20]
alasql(‘SEARCH a? b WHERE(b>=20) FROM ?,[data])
[20]
32
Парсер SQL (AST-дерево)
var ast = alasql.parse('SELECT SUM(x)+20 
FROM one GROUP BY x');
{ statements: [ {
columns: [{
left: { aggregatorid: 'SUM',
expression:{columnid: ‘x’},
over: undefined },
op: '+’,
right: { value: 20 } } ],
from: [Object],
group: [Object]
} ] }
33
Поиск по дереву
var res = alasql(’ 
SEARCH /+ aggregatorid 
FROM ?',[ast]);
['SUM’]
34
Графы
CREATE GRAPH Olga, Helen, Pablo,
Andrey, [Alice Cooper],
Olga > loves > #Pablo,
Helen > hates> Andrey,
Pablo > loves > Alice,
Andrey >> Alice
35
SEARCH PATH
alasql('SEARCH >> name FROM #Olga');
['Pablo']
alasql('SEARCH >> >> name FROM #Olga');
['Alice']
alasql('SEARCH / >> >> #Alice name');
['Olga','Helen']
36
Файл CSV с ребрами графа
source,target,value
Игорь,Зина,1.2
Игорь,Марина,1.3
Сергей,Алиса,0.2
Эва,Алиса,0.5
Петр,Алиса,1.6
Марина,Алиса,0.4
Яков,Алиса,0.6
…
37
Загружаем граф
1. Загружаем граф
SELECT * FROM
CSV("forcerus.csv",{headers:true})
2. Определяем вершины
var vv = alasql('SEARCH DISTINCT(UNION
ALL(/[source],/[target])) FROM ?',[data]);
3. Создаем граф
alasql('CREATE GRAPH
'+vv.map(function(v){return '"'+v+'"'}));
38
39
Работа с графами
Как связаны Саша и Марина?
SEARCH / "Саша” PATH("Марина")
EDGE SET(color="red”)
40
41
ПОД КАПОТОМ
42
Как устроен AlaSQL изнутри?
• Лексер
• Парсер
• Интерпретатор
• Критические участки
SELECT/INSERT/DELETE/UPDATE/SEARCH
компилируются в JS
43
Скорость работы
SELECT SUM(test1.one), test1.two,
test2.three
FROM test1
JOIN test2 ON test1.two = test2.two
WHERE test1.one > 5
GROUP BY test1.two, test2.three
ORDER BY three, sumone
44
45
http://jsperf.com/alasql-js-vs-websql/7
Оптимизация
• Анализ JOIN и WHERE выражений и преиндексация
FROM one
JOIN two USING e
JOIN three ON two.a = three.a+1 AND two.b =
three.c+three.d
WHERE two.a > 10 AND three.c > 20
• Как сократить пробег?
• one.length x two.length x three.length
• Оптимизиация
• two.e - индекс (хэш) для demo.e
• (three.a+1) +’#’+ (three.c+three.d) – индекс для (two.a) +’#’+
(two.b)
• two.a > 10 – префильтрация массива one
• three.c > 20 – префильтрация массива two
46
Прекомпиляция
• Парсинг занимает существенное время
• Можно прекомпилировать операторы заранее
var more = alasql.compile(
‘SELECT COLUMN * FROM ? WHERE _ > ?’);
more([[1,2,3,20,30],10])
[20,30]
47
Компиляция
SELECT * FROM data ORDER BY alpha, beta
var orderfns = “
if(a.alpha>b.alpha) {return 1;
else if(a.alpha==b.alpha) return 0;
if(a.beta>b.beta) {return 1;
else if(a.beta==b.beta) return 0;
}}
return -1;”;
var orderfn = new Function(‘a,b’, orderfns);
var data = data.sort(orderfn);
48
Выбор методов JavaScript
• for быстрее, чем forEach и т.д.
• some быстрее, чем filter()
• parseInt(x,10) быстрее, чем x|0
jsPerf.com - лучший советчик…
49
50
Инструменты разработки
• Gulp – сборка
• UglifyJS - минификация
• Jison – генератор парсеров
• Mocha – юнит-тестирование
• sqllogictest – тестирование на соответствие SQL
51
Контакты
• github.com/agershun/alasql
• alasql.org
• Андрей Гершун
• agershun@gmail.com
• @agershun
52
à la
SQL

More Related Content

What's hot

Liquibase: Enterprise Edition
Liquibase: Enterprise EditionLiquibase: Enterprise Edition
Liquibase: Enterprise EditionAndrei Solntsev
 
14 - Hadoop. Фреймворк Spark
14 - Hadoop. Фреймворк Spark14 - Hadoop. Фреймворк Spark
14 - Hadoop. Фреймворк SparkRoman Brovko
 
Референсная архитектура приложения на ASP.NET MVC
Референсная архитектура приложения на ASP.NET MVCРеференсная архитектура приложения на ASP.NET MVC
Референсная архитектура приложения на ASP.NET MVCAndrew Mayorov
 
Expert Fridays Spark Job
Expert Fridays Spark JobExpert Fridays Spark Job
Expert Fridays Spark JobProvectus
 
Основы индексирования и расширенные возможности EXPLAIN в MySQL / Василий Лук...
Основы индексирования и расширенные возможности EXPLAIN в MySQL / Василий Лук...Основы индексирования и расширенные возможности EXPLAIN в MySQL / Василий Лук...
Основы индексирования и расширенные возможности EXPLAIN в MySQL / Василий Лук...Ontico
 

What's hot (7)

Liquibase: Enterprise Edition
Liquibase: Enterprise EditionLiquibase: Enterprise Edition
Liquibase: Enterprise Edition
 
Scala for android
Scala for androidScala for android
Scala for android
 
Trees in RDBs
Trees in RDBsTrees in RDBs
Trees in RDBs
 
14 - Hadoop. Фреймворк Spark
14 - Hadoop. Фреймворк Spark14 - Hadoop. Фреймворк Spark
14 - Hadoop. Фреймворк Spark
 
Референсная архитектура приложения на ASP.NET MVC
Референсная архитектура приложения на ASP.NET MVCРеференсная архитектура приложения на ASP.NET MVC
Референсная архитектура приложения на ASP.NET MVC
 
Expert Fridays Spark Job
Expert Fridays Spark JobExpert Fridays Spark Job
Expert Fridays Spark Job
 
Основы индексирования и расширенные возможности EXPLAIN в MySQL / Василий Лук...
Основы индексирования и расширенные возможности EXPLAIN в MySQL / Василий Лук...Основы индексирования и расширенные возможности EXPLAIN в MySQL / Василий Лук...
Основы индексирования и расширенные возможности EXPLAIN в MySQL / Василий Лук...
 

Viewers also liked

Alasql JavaScript SQL Database Library: User Manual
Alasql JavaScript SQL Database Library: User ManualAlasql JavaScript SQL Database Library: User Manual
Alasql JavaScript SQL Database Library: User ManualAndrey Gershun
 
X query language reference
X query language referenceX query language reference
X query language referenceSteve Xu
 
Multi-thematic spatial databases
Multi-thematic spatial databasesMulti-thematic spatial databases
Multi-thematic spatial databasesConor Mc Elhinney
 
Sql server ___________session3-normailzation
Sql server  ___________session3-normailzationSql server  ___________session3-normailzation
Sql server ___________session3-normailzationEhtisham Ali
 
SQL Server 2008 for .NET Developers
SQL Server 2008 for .NET DevelopersSQL Server 2008 for .NET Developers
SQL Server 2008 for .NET Developersllangit
 
SQL Server 2008 for Developers
SQL Server 2008 for DevelopersSQL Server 2008 for Developers
SQL Server 2008 for Developersllangit
 
High Performance Front-End Development
High Performance Front-End DevelopmentHigh Performance Front-End Development
High Performance Front-End Developmentdrywallbmb
 
Css introduction
Css introductionCss introduction
Css introductionSridhar P
 
Transact sql data definition language - ddl- reference
Transact sql data definition language - ddl- referenceTransact sql data definition language - ddl- reference
Transact sql data definition language - ddl- referenceSteve Xu
 
Multidimensional model programming
Multidimensional model programmingMultidimensional model programming
Multidimensional model programmingSteve Xu
 
5 tsssisu sql_server_2012
5 tsssisu sql_server_20125 tsssisu sql_server_2012
5 tsssisu sql_server_2012Steve Xu
 

Viewers also liked (20)

Alasql JavaScript SQL Database Library: User Manual
Alasql JavaScript SQL Database Library: User ManualAlasql JavaScript SQL Database Library: User Manual
Alasql JavaScript SQL Database Library: User Manual
 
SQL Server 2008 Spatial Data - Getting Started
SQL Server 2008 Spatial Data - Getting StartedSQL Server 2008 Spatial Data - Getting Started
SQL Server 2008 Spatial Data - Getting Started
 
X query language reference
X query language referenceX query language reference
X query language reference
 
Module03
Module03Module03
Module03
 
Multi-thematic spatial databases
Multi-thematic spatial databasesMulti-thematic spatial databases
Multi-thematic spatial databases
 
Sql server ___________session3-normailzation
Sql server  ___________session3-normailzationSql server  ___________session3-normailzation
Sql server ___________session3-normailzation
 
Module06
Module06Module06
Module06
 
Module07
Module07Module07
Module07
 
SQL Server 2008 for .NET Developers
SQL Server 2008 for .NET DevelopersSQL Server 2008 for .NET Developers
SQL Server 2008 for .NET Developers
 
SQL Server 2008 for Developers
SQL Server 2008 for DevelopersSQL Server 2008 for Developers
SQL Server 2008 for Developers
 
High Performance Front-End Development
High Performance Front-End DevelopmentHigh Performance Front-End Development
High Performance Front-End Development
 
Sql Server Data Tools - Codenamed JUNEAU
Sql Server Data Tools - Codenamed JUNEAUSql Server Data Tools - Codenamed JUNEAU
Sql Server Data Tools - Codenamed JUNEAU
 
Css introduction
Css introductionCss introduction
Css introduction
 
Transact sql data definition language - ddl- reference
Transact sql data definition language - ddl- referenceTransact sql data definition language - ddl- reference
Transact sql data definition language - ddl- reference
 
Module01
Module01Module01
Module01
 
Multidimensional model programming
Multidimensional model programmingMultidimensional model programming
Multidimensional model programming
 
5 tsssisu sql_server_2012
5 tsssisu sql_server_20125 tsssisu sql_server_2012
5 tsssisu sql_server_2012
 
Module08
Module08Module08
Module08
 
Module05
Module05Module05
Module05
 
Module04
Module04Module04
Module04
 

Similar to AlaSQL - SQL библиотека на JavaScript (выступление на PiterJS)

MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)
MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)
MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)Ontico
 
Новые возможности языка SQL в Firebird 3.0
Новые возможности языка SQL в Firebird 3.0Новые возможности языка SQL в Firebird 3.0
Новые возможности языка SQL в Firebird 3.0Alexey Kovyazin
 
Народные средства оптимизации PostgreSQL
Народные средства оптимизации PostgreSQLНародные средства оптимизации PostgreSQL
Народные средства оптимизации PostgreSQLNikolay Pisarev
 
Advanced Sql Injection
Advanced Sql InjectionAdvanced Sql Injection
Advanced Sql InjectionDmitry Evteev
 
Подход к тестированию хранилища данных на базе MS SQL Server
Подход к тестированию хранилища данных на базе MS SQL ServerПодход к тестированию хранилища данных на базе MS SQL Server
Подход к тестированию хранилища данных на базе MS SQL ServerSQALab
 
Обзор ES2015(ES6)
Обзор ES2015(ES6)Обзор ES2015(ES6)
Обзор ES2015(ES6)Alex Filatov
 
Reform: путь к лучшему ORM
Reform: путь к лучшему ORMReform: путь к лучшему ORM
Reform: путь к лучшему ORMBadoo Development
 
Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...
Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...
Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...Fedor Lavrentyev
 
Консервативный Backend на Node.js / Дмитрий Ляпин (Recrumatic)
Консервативный Backend на Node.js / Дмитрий Ляпин (Recrumatic)Консервативный Backend на Node.js / Дмитрий Ляпин (Recrumatic)
Консервативный Backend на Node.js / Дмитрий Ляпин (Recrumatic)Ontico
 
2015 09-05 02 Сергей Сорокин. Обзор и анализ мобильного backend сервиса
2015 09-05 02 Сергей Сорокин. Обзор и анализ мобильного backend сервиса2015 09-05 02 Сергей Сорокин. Обзор и анализ мобильного backend сервиса
2015 09-05 02 Сергей Сорокин. Обзор и анализ мобильного backend сервисаОмские ИТ-субботники
 
Тестирование программных фильтров безопасности
Тестирование программных фильтров безопасностиТестирование программных фильтров безопасности
Тестирование программных фильтров безопасностиZestranec
 
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"Technopark
 
Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)
Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)
Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)Ontico
 

Similar to AlaSQL - SQL библиотека на JavaScript (выступление на PiterJS) (20)

MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)
MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)
MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)
 
Новые возможности языка SQL в Firebird 3.0
Новые возможности языка SQL в Firebird 3.0Новые возможности языка SQL в Firebird 3.0
Новые возможности языка SQL в Firebird 3.0
 
Народные средства оптимизации PostgreSQL
Народные средства оптимизации PostgreSQLНародные средства оптимизации PostgreSQL
Народные средства оптимизации PostgreSQL
 
PT Hackday#2
PT Hackday#2PT Hackday#2
PT Hackday#2
 
Yserver
YserverYserver
Yserver
 
PT MIFI Labsql
PT MIFI LabsqlPT MIFI Labsql
PT MIFI Labsql
 
Access 04
Access 04Access 04
Access 04
 
Advanced Sql Injection
Advanced Sql InjectionAdvanced Sql Injection
Advanced Sql Injection
 
Подход к тестированию хранилища данных на базе MS SQL Server
Подход к тестированию хранилища данных на базе MS SQL ServerПодход к тестированию хранилища данных на базе MS SQL Server
Подход к тестированию хранилища данных на базе MS SQL Server
 
Обзор ES2015(ES6)
Обзор ES2015(ES6)Обзор ES2015(ES6)
Обзор ES2015(ES6)
 
Jdbc in java
Jdbc in javaJdbc in java
Jdbc in java
 
Reform: путь к лучшему ORM
Reform: путь к лучшему ORMReform: путь к лучшему ORM
Reform: путь к лучшему ORM
 
Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...
Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...
Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...
 
Консервативный Backend на Node.js / Дмитрий Ляпин (Recrumatic)
Консервативный Backend на Node.js / Дмитрий Ляпин (Recrumatic)Консервативный Backend на Node.js / Дмитрий Ляпин (Recrumatic)
Консервативный Backend на Node.js / Дмитрий Ляпин (Recrumatic)
 
2015 09-05 02 Сергей Сорокин. Обзор и анализ мобильного backend сервиса
2015 09-05 02 Сергей Сорокин. Обзор и анализ мобильного backend сервиса2015 09-05 02 Сергей Сорокин. Обзор и анализ мобильного backend сервиса
2015 09-05 02 Сергей Сорокин. Обзор и анализ мобильного backend сервиса
 
Расширение библиотеки Slick
Расширение библиотеки SlickРасширение библиотеки Slick
Расширение библиотеки Slick
 
Тестирование программных фильтров безопасности
Тестирование программных фильтров безопасностиТестирование программных фильтров безопасности
Тестирование программных фильтров безопасности
 
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
 
Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)
Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)
Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)
 
SQL Server Denali
SQL Server DenaliSQL Server Denali
SQL Server Denali
 

AlaSQL - SQL библиотека на JavaScript (выступление на PiterJS)

  • 1. AlaSQL SQL библиотека для обработки данных на JavaScript Андрей Гершун PiterJS agershun@gmail.com 14 мая 2015 года @agershun 1 à la SQL
  • 2. Содержание • Зачем нужен SQL на клиенте? • Как установить AlaSQL? • Как использовать AlaSQL? • Решение задач ETL • Хранение данных на клиенте • Расширение SQL • Как устроен AlaSQL? 2
  • 3. Зачем SQL на клиенте? • Задачи обработки данных • Выбор (SELECT, REMOVE COLUMNS) • Сортировка (ORDER BY) • Группировка (GROUP BY) • Выборка (WHERE, HAVING) • Соединение (JOIN) • Импорт/экспорт в различные форматы хранения данных (Excel, CSV, TXT, Google) • Хранение данных на клиенте 3
  • 4. Почему бы не использовать только «большие» базы данных? • Может быть плохая связь • Хранение данных в памяти клиента • Быстрый фронт-энд для приложений BI 4
  • 5. Какие решения уже существуют? • Встроенные базы данных • WebSQL • IndexedDB • SQL на JavaScript • SQL.js • SequelSphere • “Почти” SQL • Lovefield • ydb-db • pouchDB 5
  • 6. Как можно использовать SQL в программе на JavaScript? <script src="alasql.min.js"></script> <script> alasql("CREATE TABLE cities ( city string, population number)"); alasql("INSERT INTO cities VALUES ('Rome',2863223), ('Paris',2249975), ('Berlin',3517424), ('Madrid',3041579)"); console.log( alasql("SELECT * FROM cities WHERE population < 3500000 ORDER BY population DESC") ); </script> 6
  • 7. Как с помощью SQL обрабатывать данные JavaScript ? <script src=“alasql.min.js”></script> <script> var data = [{a:10},{a:2},{a:25}]; var res = alasql(‘SELECT * FROM ? ORDER BY a’,[data]); </script> 7
  • 8. API • Синхронный var res = alasql(‘SELECT * FROM one’, [params]); • Асинхронный (для операций с файлами) alasql(‘SELECT * FROM two’, [params], function(data,err) { if(err) console.log(err); console.log(data) }); 8
  • 9. AlaSQL Пакеты NPM, Bower, Meteor Установка: npm install alasql bower install alasql meteor add agershun:alasql Подключение <script src=“alasql.min.js”></script> var alasql = require(‘alasql’); Зависимости от других библиотек: • Нет • xlsx-js, TableTop, AngularJS, Meteor - для отдельных операций импорта-экспорта 9
  • 10. WebWorker <script src="alasql-worker.min.js"></script> <script> var arr = [{a:1},{a:2},{a:1}]; alasql('SELECT * FROM ?',[arr], function(data) { console.log(data); }); </script> или изнутри WebWorker: importScripts(‘alasql.min.js’); 10
  • 11. SQL-92 • SELECT • INSERT • DELETE • UPDATE • CREATE TABLE • CREATE VIEW • CREATE UNIQUE INDEX • CREATE DATABASE • и другие операторы • Реализованы практически все основные операторы и функциональность SQL за исключением триггеров и ограниченной поддержки транзакций 11
  • 12. CREATE TABLE Fruits ( fruitid INT PRIMARY KEY, fruitname NVARCHAR(MAX), price MONEY ); CREATE TABLE Orders ( orderid INT PRIMARY KEY IDENTITY, fruitid INT REFERENCES Fruits(fruitid), qty FLOAT ); INSERT INTO Fruits VALUES (1,"Peach",22), (2,"Apple",10),(3,"Melon",14); INSERT INTO Orders (fruitid, qty) VALUES (1,100), (2,150), (3,25); SELECT f.fruitname, f.price, o.qty, f.price*o.qty AS amount FROM Orders o INNER JOIN Fruits f USING fruitid; 12
  • 13. Все JOINы на свете… • CROSS JOIN • INNER JOIN • LEFT OUTER JOIN • RIGHT OUTER JOIN • FULL OUTER JOIN • SEMI JOIN • ANTI JOIN • NATURAL JOIN • ON • USING • CROSS APPLY • OUTER APPLY 13
  • 14. Обработка данных JSON SELECT {a:1,b:2} {a:1,b:2} SELECT {a:1,b:2} == {a:1,b:2} true SELECT {a:1,b:2}->b 2 SELECT {a:1,b:(2*2)}->b 4 SELECT @[1,2,3,(b+4)] FROM @[{b:100}] [1,2,3,104] 14
  • 15. РЕШЕНИЕ ЗАДАЧ ETL Извлечение, обработка, загрузка данных 15
  • 16. Импорт и экспорт данных (CSV, TAB, XLSX) SELECT Country, Name INTO CSV("mydata.csv") FROM XLSX("cities.xlsx", {headers:true, range:"B1:E10"}) WHERE Population > 100000', 16
  • 17. 17
  • 18. 18
  • 19. Пример: Подготовка данных для Google Maps из Slideshare.com Данные по просмот рам XLSX (на сервере) Гео данные по странам CSV (в Интерне те) Данные по просмотр ам по странам с указание м широты и долготы Массив JavaScrip t slideshare .com github.co m Google Maps API JOI N 19
  • 20. SELECT countries.*, views.cnt FROM ( SELECT Country, COUNT(*) AS cnt FROM "all_latest_views_3m.csv" GROUP BY Country ) AS views JOIN ( SELECT * FROM "https://abc.com/lat-long- countries.csv" ) AS countries USING Country 20
  • 21. Сохранение данных в XLS с цветами и стилями var mystyle = { headers: true, column: {style:{Font:{Bold:"1"}}}, rows: {1:{style: {Font:{Color:"#FF0077"}}}} }; alasql('SELECT * INTO XLSXML("rest.xls",?) FROM ?',[mystyle,data]); 21
  • 22. Alacon - утилита для ETL > alacon “SELECT 2+2” 4 > alacon “SELECT * INTO 'medals.csv' FROM 'medals.xlsx' WHERE Year=2008” 22
  • 24. IndexedDB ATTACH INDEXEDDB DATABASE geo; CREATE TABLE IF NOT EXISTS geo.country; SELECT * INTO geo.country FROM CSV("country.csv",{headers:true}); SELECT * INTO XLSX("asia.xlsx") FROM geo.country WHERE continent_name = "Asia"'); 24
  • 26. Angular.js $scope.exportData = function () { alasql('SELECT * INTO XLSX("john.xlsx”,{headers:true}) FROM ?',[$scope.items]); }; 26
  • 27. 27
  • 28. Alasql для d3.js: Олимпийские медали из Excel 28 alasql('SELECT '+axe+', SUM([Gold Medals]) AS Gold, SUM([Silver Medals]) AS Silver, SUM([Bronze Medals]) AS Bronze FROM "medals.csv" GROUP BY '+axe+' ORDER BY '+axe,[],function (data){ // data - выборка медали по заданной оси });
  • 29. Интеграция с d3.js alasql('SELECT . . .’, function(data){ d3.select("body") .append('ul') .data(data) .entry() .append('li') .text(function(d){return d[axe]}); }); 29
  • 30. 30
  • 32. Поиск по вложенным JSON объектам var data = {a:{a:{a:{a:{b:10}}}},b:20}; alasql(‘SEARCH a b FROM ?,[data]) 20 alasql(‘SEARCH /* b FROM ?,[data]) [10,20] alasql(‘SEARCH a? b WHERE(b>=20) FROM ?,[data]) [20] 32
  • 33. Парсер SQL (AST-дерево) var ast = alasql.parse('SELECT SUM(x)+20 FROM one GROUP BY x'); { statements: [ { columns: [{ left: { aggregatorid: 'SUM', expression:{columnid: ‘x’}, over: undefined }, op: '+’, right: { value: 20 } } ], from: [Object], group: [Object] } ] } 33
  • 34. Поиск по дереву var res = alasql(’ SEARCH /+ aggregatorid FROM ?',[ast]); ['SUM’] 34
  • 35. Графы CREATE GRAPH Olga, Helen, Pablo, Andrey, [Alice Cooper], Olga > loves > #Pablo, Helen > hates> Andrey, Pablo > loves > Alice, Andrey >> Alice 35
  • 36. SEARCH PATH alasql('SEARCH >> name FROM #Olga'); ['Pablo'] alasql('SEARCH >> >> name FROM #Olga'); ['Alice'] alasql('SEARCH / >> >> #Alice name'); ['Olga','Helen'] 36
  • 37. Файл CSV с ребрами графа source,target,value Игорь,Зина,1.2 Игорь,Марина,1.3 Сергей,Алиса,0.2 Эва,Алиса,0.5 Петр,Алиса,1.6 Марина,Алиса,0.4 Яков,Алиса,0.6 … 37
  • 38. Загружаем граф 1. Загружаем граф SELECT * FROM CSV("forcerus.csv",{headers:true}) 2. Определяем вершины var vv = alasql('SEARCH DISTINCT(UNION ALL(/[source],/[target])) FROM ?',[data]); 3. Создаем граф alasql('CREATE GRAPH '+vv.map(function(v){return '"'+v+'"'})); 38
  • 39. 39
  • 40. Работа с графами Как связаны Саша и Марина? SEARCH / "Саша” PATH("Марина") EDGE SET(color="red”) 40
  • 41. 41
  • 43. Как устроен AlaSQL изнутри? • Лексер • Парсер • Интерпретатор • Критические участки SELECT/INSERT/DELETE/UPDATE/SEARCH компилируются в JS 43
  • 44. Скорость работы SELECT SUM(test1.one), test1.two, test2.three FROM test1 JOIN test2 ON test1.two = test2.two WHERE test1.one > 5 GROUP BY test1.two, test2.three ORDER BY three, sumone 44
  • 46. Оптимизация • Анализ JOIN и WHERE выражений и преиндексация FROM one JOIN two USING e JOIN three ON two.a = three.a+1 AND two.b = three.c+three.d WHERE two.a > 10 AND three.c > 20 • Как сократить пробег? • one.length x two.length x three.length • Оптимизиация • two.e - индекс (хэш) для demo.e • (three.a+1) +’#’+ (three.c+three.d) – индекс для (two.a) +’#’+ (two.b) • two.a > 10 – префильтрация массива one • three.c > 20 – префильтрация массива two 46
  • 47. Прекомпиляция • Парсинг занимает существенное время • Можно прекомпилировать операторы заранее var more = alasql.compile( ‘SELECT COLUMN * FROM ? WHERE _ > ?’); more([[1,2,3,20,30],10]) [20,30] 47
  • 48. Компиляция SELECT * FROM data ORDER BY alpha, beta var orderfns = “ if(a.alpha>b.alpha) {return 1; else if(a.alpha==b.alpha) return 0; if(a.beta>b.beta) {return 1; else if(a.beta==b.beta) return 0; }} return -1;”; var orderfn = new Function(‘a,b’, orderfns); var data = data.sort(orderfn); 48
  • 49. Выбор методов JavaScript • for быстрее, чем forEach и т.д. • some быстрее, чем filter() • parseInt(x,10) быстрее, чем x|0 jsPerf.com - лучший советчик… 49
  • 50. 50
  • 51. Инструменты разработки • Gulp – сборка • UglifyJS - минификация • Jison – генератор парсеров • Mocha – юнит-тестирование • sqllogictest – тестирование на соответствие SQL 51
  • 52. Контакты • github.com/agershun/alasql • alasql.org • Андрей Гершун • agershun@gmail.com • @agershun 52 à la SQL