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
43const sqlite3 = require ( 'sqlite3' ) . verbose ( ) ;
54
@@ -9,130 +8,7 @@ export interface Sqlite3Query {
98 params : Primitive [ ] ;
109}
1110export 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
13814export const getRowsFromSqlite = async < T > ( query : string , params ) : Promise < T [ ] > => {
0 commit comments