Skip to content

Commit 3faa14e

Browse files
author
flexicious
committed
sql builder from grid core
1 parent 05ef5e5 commit 3faa14e

5 files changed

Lines changed: 218 additions & 7725 deletions

File tree

apps/graphql-apollo-react/shared/sql-builder.ts

Lines changed: 2 additions & 126 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
import { FilterPageSortArguments, FilterOperation, FilterExpression, Filter } from '@euxdt/grid-core';
2-
import { isFilter, isFilterExpression } from '@euxdt/grid-shared';
1+
import { FilterPageSortArguments, buildSqlWhereClause } from '@euxdt/grid-core';
32

43
const sqlite3 = require('sqlite3').verbose();
54

@@ -9,130 +8,7 @@ export interface Sqlite3Query {
98
params: Primitive[];
109
}
1110
export const buildWhereClause = ({ filter, pagination, sorts }: FilterPageSortArguments, params:Primitive[], defaultPageLimit=true): string => {
12-
let query = ` `;
13-
if (filter && filter.children.length > 0) {
14-
query += ' WHERE';
15-
let isFirstFilter = true;
16-
for (const child of filter.children) {
17-
const filterExpression: FilterExpression = child as FilterExpression;
18-
const childFilter: Filter = child as Filter;
19-
if (isFilterExpression(filterExpression)) {
20-
const { col, operation, expression } = filterExpression;
21-
const column = col.dataField;
22-
const primitiveExpression = expression as Primitive;
23-
const arrayOfPrimitives = expression as Primitive[];
24-
const betweenExpression = expression as { start: Primitive, end: Primitive };
25-
if (isFirstFilter) {
26-
isFirstFilter = false;
27-
} else {
28-
query += ' AND';
29-
}
30-
switch (operation) {
31-
case FilterOperation.Equals:
32-
query += ` ${column} = ?`;
33-
params.push(primitiveExpression);
34-
break;
35-
case FilterOperation.NotEquals:
36-
query += ` ${column} <> ?`;
37-
params.push(primitiveExpression);
38-
break;
39-
case FilterOperation.BeginsWith:
40-
query += ` ${column} LIKE ?`;
41-
params.push(`${expression}%`);
42-
break;
43-
case FilterOperation.EndsWith:
44-
query += ` ${column} LIKE ?`;
45-
params.push(`%${expression}`);
46-
break;
47-
case FilterOperation.Contains:
48-
query += ` ${column} LIKE ?`;
49-
params.push(`%${expression}%`);
50-
break;
51-
case FilterOperation.DoesNotContain:
52-
query += ` ${column} NOT LIKE ?`;
53-
params.push(`%${expression}%`);
54-
break;
55-
case FilterOperation.GreaterThan:
56-
query += ` ${column} > ?`;
57-
params.push(primitiveExpression);
58-
break;
59-
case FilterOperation.GreaterThanEquals:
60-
query += ` ${column} >= ?`;
61-
params.push(primitiveExpression);
62-
break;
63-
case FilterOperation.LessThan:
64-
query += ` ${column} < ?`;
65-
params.push(primitiveExpression);
66-
break;
67-
case FilterOperation.LessThanEquals:
68-
query += ` ${column} <= ?`;
69-
params.push(primitiveExpression);
70-
break;
71-
case FilterOperation.IsNull:
72-
query += ` ${column} IS NULL`;
73-
break;
74-
case FilterOperation.IsNotNull:
75-
query += ` ${column} IS NOT NULL`;
76-
break;
77-
case FilterOperation.Between:
78-
query += ` ${column} BETWEEN ? AND ?`;
79-
params.push(betweenExpression.start, betweenExpression.end);
80-
break;
81-
case FilterOperation.InList:
82-
query += ` ${column} IN (${arrayOfPrimitives.map(() => '?').join(',')})`;
83-
params.push(...arrayOfPrimitives);
84-
break;
85-
case FilterOperation.NotInList:
86-
query += ` ${column} NOT IN (${arrayOfPrimitives.map(() => '?').join(',')})`;
87-
params.push(...arrayOfPrimitives);
88-
break;
89-
case FilterOperation.Wildcard:
90-
query += ` ${column} LIKE ?`;
91-
params.push((expression?.toString() || "").replace(/\*/g, '%'));
92-
break;
93-
default:
94-
throw new Error(`Unsupported filter operation: ${operation}`);
95-
}
96-
97-
98-
} else if (isFilter(childFilter)) {
99-
const { logicalOperator, children } = childFilter;
100-
if (!children || children.length === 0) {
101-
continue;
102-
}
103-
if (isFirstFilter) {
104-
isFirstFilter = false;
105-
} else {
106-
query += ` ${logicalOperator}`;
107-
}
108-
query += ' (';
109-
query += buildWhereClause({ filter: childFilter },params, false);
110-
query += ' )';
111-
}
112-
}
113-
}
114-
115-
if (sorts) {
116-
let isFirstSort = true;
117-
for (const sort of sorts.values()) {
118-
if (sort.sortColumn) {
119-
if (isFirstSort) {
120-
query += ` ORDER BY ${sort.sortColumn} ${sort.isAscending ? 'ASC' : 'DESC'}`;
121-
isFirstSort = false;
122-
} else {
123-
query += `, ${sort.sortColumn} ${sort.isAscending ? 'ASC' : 'DESC'}`;
124-
}
125-
}
126-
}
127-
}
128-
129-
if (pagination) {
130-
query += ` LIMIT ${pagination.pageSize} OFFSET ${(pagination.currentPage - 1) * pagination.pageSize}`;
131-
} else if(defaultPageLimit) {
132-
query += ` LIMIT 100 OFFSET 0`;
133-
}
134-
135-
return query;
11+
return buildSqlWhereClause({ filter, pagination, sorts }, params, defaultPageLimit);
13612
};
13713

13814
export const getRowsFromSqlite = async<T>(query: string, params): Promise<T[]> => {

apps/nextjs-knex-react/shared/knex-builder.ts

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { FilterPageSortArguments, FilterOperation, FilterExpression, Filter } from '@euxdt/grid-core';
1+
import { FilterPageSortArguments, FilterOperation, FilterExpression, Filter, isFilter, isFilterExpression } from '@euxdt/grid-core';
22
import { Knex } from 'knex';
33

44
export type Primitive = string | number | Date | boolean;
@@ -99,11 +99,4 @@ export const buildKnexQuery = (qb: Knex.QueryBuilder, { filter, pagination, sort
9999
return queryBuilder;
100100
}
101101

102-
export const isFilterExpression = (filter: FilterExpression | Filter): filter is FilterExpression => {
103-
return 'col' in filter && 'operation' in filter && 'expression' in filter;
104-
}
105-
106-
export const isFilter = (filter: FilterExpression | Filter): filter is Filter => {
107-
return 'logicalOperator' in filter && 'children' in filter;
108-
}
109102

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,2 @@
11
export const SHARED = "shared";
2-
export * from "./adapters";
3-
export * from "./utils";
2+
export * from "./adapters";

libs/grid-shared/src/lib/shared/utils.ts

Lines changed: 0 additions & 10 deletions
This file was deleted.

0 commit comments

Comments
 (0)