@zengrid/core 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +55 -0
- package/dist/README.md +55 -0
- package/dist/index.cjs.default.js +1 -0
- package/dist/index.cjs.js +9882 -0
- package/dist/index.cjs.mjs +2 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.esm.js +9847 -0
- package/dist/package.json +49 -0
- package/dist/src/a11y/aria-manager.d.ts +171 -0
- package/dist/src/a11y/aria-manager.d.ts.map +1 -0
- package/dist/src/a11y/focus-manager.d.ts +124 -0
- package/dist/src/a11y/focus-manager.d.ts.map +1 -0
- package/dist/src/a11y/index.d.ts +8 -0
- package/dist/src/a11y/index.d.ts.map +1 -0
- package/dist/src/data/data-accessor/array-accessor.d.ts +38 -0
- package/dist/src/data/data-accessor/array-accessor.d.ts.map +1 -0
- package/dist/src/data/data-accessor/column-store-accessor.d.ts +41 -0
- package/dist/src/data/data-accessor/column-store-accessor.d.ts.map +1 -0
- package/dist/src/data/data-accessor/data-accessor.interface.d.ts +41 -0
- package/dist/src/data/data-accessor/data-accessor.interface.d.ts.map +1 -0
- package/dist/src/data/data-accessor/index.d.ts +9 -0
- package/dist/src/data/data-accessor/index.d.ts.map +1 -0
- package/dist/src/data/data-accessor/sparse-matrix-accessor.d.ts +39 -0
- package/dist/src/data/data-accessor/sparse-matrix-accessor.d.ts.map +1 -0
- package/dist/src/data/data-manager.d.ts +161 -0
- package/dist/src/data/data-manager.d.ts.map +1 -0
- package/dist/src/data/data-source.interface.d.ts +82 -0
- package/dist/src/data/data-source.interface.d.ts.map +1 -0
- package/dist/src/data/grid-data-model.d.ts +102 -0
- package/dist/src/data/grid-data-model.d.ts.map +1 -0
- package/dist/src/data/index-map/index-map.d.ts +30 -0
- package/dist/src/data/index-map/index-map.d.ts.map +1 -0
- package/dist/src/data/index-map/index-map.interface.d.ts +49 -0
- package/dist/src/data/index-map/index-map.interface.d.ts.map +1 -0
- package/dist/src/data/index-map/index.d.ts +7 -0
- package/dist/src/data/index-map/index.d.ts.map +1 -0
- package/dist/src/data/index.d.ts +9 -0
- package/dist/src/data/index.d.ts.map +1 -0
- package/dist/src/editing/cell-editor.interface.d.ts +87 -0
- package/dist/src/editing/cell-editor.interface.d.ts.map +1 -0
- package/dist/src/editing/date-editor.d.ts +67 -0
- package/dist/src/editing/date-editor.d.ts.map +1 -0
- package/dist/src/editing/editor-manager.d.ts +141 -0
- package/dist/src/editing/editor-manager.d.ts.map +1 -0
- package/dist/src/editing/index.d.ts +15 -0
- package/dist/src/editing/index.d.ts.map +1 -0
- package/dist/src/editing/number-editor.d.ts +68 -0
- package/dist/src/editing/number-editor.d.ts.map +1 -0
- package/dist/src/editing/select-editor.d.ts +53 -0
- package/dist/src/editing/select-editor.d.ts.map +1 -0
- package/dist/src/editing/text-editor.d.ts +69 -0
- package/dist/src/editing/text-editor.d.ts.map +1 -0
- package/dist/src/events/event-emitter.d.ts +90 -0
- package/dist/src/events/event-emitter.d.ts.map +1 -0
- package/dist/src/events/grid-events.d.ts +277 -0
- package/dist/src/events/grid-events.d.ts.map +1 -0
- package/dist/src/events/index.d.ts +6 -0
- package/dist/src/events/index.d.ts.map +1 -0
- package/dist/src/features/autofill/autofill-manager.d.ts +103 -0
- package/dist/src/features/autofill/autofill-manager.d.ts.map +1 -0
- package/dist/src/features/autofill/index.d.ts +6 -0
- package/dist/src/features/autofill/index.d.ts.map +1 -0
- package/dist/src/features/column-resize/auto-fit-calculator.d.ts +52 -0
- package/dist/src/features/column-resize/auto-fit-calculator.d.ts.map +1 -0
- package/dist/src/features/column-resize/column-resize-manager.d.ts +114 -0
- package/dist/src/features/column-resize/column-resize-manager.d.ts.map +1 -0
- package/dist/src/features/column-resize/column-resize-manager.interface.d.ts +167 -0
- package/dist/src/features/column-resize/column-resize-manager.interface.d.ts.map +1 -0
- package/dist/src/features/column-resize/column-resize.styles.css +30 -0
- package/dist/src/features/column-resize/index.d.ts +15 -0
- package/dist/src/features/column-resize/index.d.ts.map +1 -0
- package/dist/src/features/column-resize/resize-constraint-manager.d.ts +52 -0
- package/dist/src/features/column-resize/resize-constraint-manager.d.ts.map +1 -0
- package/dist/src/features/column-resize/resize-handle-renderer.d.ts +41 -0
- package/dist/src/features/column-resize/resize-handle-renderer.d.ts.map +1 -0
- package/dist/src/features/column-resize/resize-preview.d.ts +32 -0
- package/dist/src/features/column-resize/resize-preview.d.ts.map +1 -0
- package/dist/src/features/column-resize/resize-state-manager.d.ts +75 -0
- package/dist/src/features/column-resize/resize-state-manager.d.ts.map +1 -0
- package/dist/src/features/column-resize/resize-strategies.d.ts +26 -0
- package/dist/src/features/column-resize/resize-strategies.d.ts.map +1 -0
- package/dist/src/features/column-resize/resize-test-helper.d.ts +71 -0
- package/dist/src/features/column-resize/resize-test-helper.d.ts.map +1 -0
- package/dist/src/features/column-resize/resize-zone-detector.d.ts +32 -0
- package/dist/src/features/column-resize/resize-zone-detector.d.ts.map +1 -0
- package/dist/src/features/copy-paste/clipboard-manager.d.ts +116 -0
- package/dist/src/features/copy-paste/clipboard-manager.d.ts.map +1 -0
- package/dist/src/features/copy-paste/index.d.ts +6 -0
- package/dist/src/features/copy-paste/index.d.ts.map +1 -0
- package/dist/src/features/filtering/adapters/adapter.interface.d.ts +100 -0
- package/dist/src/features/filtering/adapters/adapter.interface.d.ts.map +1 -0
- package/dist/src/features/filtering/adapters/graphql-adapter.d.ts +124 -0
- package/dist/src/features/filtering/adapters/graphql-adapter.d.ts.map +1 -0
- package/dist/src/features/filtering/adapters/index.d.ts +11 -0
- package/dist/src/features/filtering/adapters/index.d.ts.map +1 -0
- package/dist/src/features/filtering/adapters/rest-adapter.d.ts +108 -0
- package/dist/src/features/filtering/adapters/rest-adapter.d.ts.map +1 -0
- package/dist/src/features/filtering/adapters/sql-adapter.d.ts +123 -0
- package/dist/src/features/filtering/adapters/sql-adapter.d.ts.map +1 -0
- package/dist/src/features/filtering/adapters/types.d.ts +201 -0
- package/dist/src/features/filtering/adapters/types.d.ts.map +1 -0
- package/dist/src/features/filtering/column-filter.d.ts +117 -0
- package/dist/src/features/filtering/column-filter.d.ts.map +1 -0
- package/dist/src/features/filtering/filter-autocomplete.d.ts +78 -0
- package/dist/src/features/filtering/filter-autocomplete.d.ts.map +1 -0
- package/dist/src/features/filtering/filter-cache.d.ts +113 -0
- package/dist/src/features/filtering/filter-cache.d.ts.map +1 -0
- package/dist/src/features/filtering/filter-compiler.d.ts +66 -0
- package/dist/src/features/filtering/filter-compiler.d.ts.map +1 -0
- package/dist/src/features/filtering/filter-export-manager.d.ts +131 -0
- package/dist/src/features/filtering/filter-export-manager.d.ts.map +1 -0
- package/dist/src/features/filtering/filter-index-manager.d.ts +126 -0
- package/dist/src/features/filtering/filter-index-manager.d.ts.map +1 -0
- package/dist/src/features/filtering/filter-manager.d.ts +408 -0
- package/dist/src/features/filtering/filter-manager.d.ts.map +1 -0
- package/dist/src/features/filtering/filter-optimizer.d.ts +101 -0
- package/dist/src/features/filtering/filter-optimizer.d.ts.map +1 -0
- package/dist/src/features/filtering/filter-query-parser.d.ts +69 -0
- package/dist/src/features/filtering/filter-query-parser.d.ts.map +1 -0
- package/dist/src/features/filtering/index.d.ts +20 -0
- package/dist/src/features/filtering/index.d.ts.map +1 -0
- package/dist/src/features/filtering/range-filter-optimizer.d.ts +138 -0
- package/dist/src/features/filtering/range-filter-optimizer.d.ts.map +1 -0
- package/dist/src/features/filtering/substring-filter.d.ts +90 -0
- package/dist/src/features/filtering/substring-filter.d.ts.map +1 -0
- package/dist/src/features/filtering/types.d.ts +204 -0
- package/dist/src/features/filtering/types.d.ts.map +1 -0
- package/dist/src/features/formulas/formula-calculator.d.ts +151 -0
- package/dist/src/features/formulas/formula-calculator.d.ts.map +1 -0
- package/dist/src/features/formulas/index.d.ts +6 -0
- package/dist/src/features/formulas/index.d.ts.map +1 -0
- package/dist/src/features/hit-testing/index.d.ts +7 -0
- package/dist/src/features/hit-testing/index.d.ts.map +1 -0
- package/dist/src/features/hit-testing/spatial-hit-tester.d.ts +137 -0
- package/dist/src/features/hit-testing/spatial-hit-tester.d.ts.map +1 -0
- package/dist/src/features/loading/index.d.ts +5 -0
- package/dist/src/features/loading/index.d.ts.map +1 -0
- package/dist/src/features/loading/loading-indicator.d.ts +79 -0
- package/dist/src/features/loading/loading-indicator.d.ts.map +1 -0
- package/dist/src/features/loading/loading.styles.css +413 -0
- package/dist/src/features/pagination/index.d.ts +5 -0
- package/dist/src/features/pagination/index.d.ts.map +1 -0
- package/dist/src/features/pagination/pagination.styles.css +288 -0
- package/dist/src/features/pagination/paginator.d.ts +89 -0
- package/dist/src/features/pagination/paginator.d.ts.map +1 -0
- package/dist/src/features/selection/index.d.ts +7 -0
- package/dist/src/features/selection/index.d.ts.map +1 -0
- package/dist/src/features/selection/selection-manager.d.ts +167 -0
- package/dist/src/features/selection/selection-manager.d.ts.map +1 -0
- package/dist/src/features/sorting/index.d.ts +13 -0
- package/dist/src/features/sorting/index.d.ts.map +1 -0
- package/dist/src/features/sorting/row-sorter.interface.d.ts +63 -0
- package/dist/src/features/sorting/row-sorter.interface.d.ts.map +1 -0
- package/dist/src/features/sorting/single-column-sorter.d.ts +75 -0
- package/dist/src/features/sorting/single-column-sorter.d.ts.map +1 -0
- package/dist/src/features/sorting/sort-manager.d.ts +132 -0
- package/dist/src/features/sorting/sort-manager.d.ts.map +1 -0
- package/dist/src/features/undo-redo/index.d.ts +8 -0
- package/dist/src/features/undo-redo/index.d.ts.map +1 -0
- package/dist/src/features/undo-redo/undo-redo-manager.d.ts +215 -0
- package/dist/src/features/undo-redo/undo-redo-manager.d.ts.map +1 -0
- package/dist/src/grid.d.ts +412 -0
- package/dist/src/grid.d.ts.map +1 -0
- package/dist/src/i18n/index.d.ts +8 -0
- package/dist/src/i18n/index.d.ts.map +1 -0
- package/dist/src/i18n/locale-manager.d.ts +123 -0
- package/dist/src/i18n/locale-manager.d.ts.map +1 -0
- package/dist/src/i18n/rtl-support.d.ts +120 -0
- package/dist/src/i18n/rtl-support.d.ts.map +1 -0
- package/dist/src/index.d.ts +38 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/keyboard/index.d.ts +6 -0
- package/dist/src/keyboard/index.d.ts.map +1 -0
- package/dist/src/keyboard/keyboard-navigator.d.ts +171 -0
- package/dist/src/keyboard/keyboard-navigator.d.ts.map +1 -0
- package/dist/src/rendering/cache/index.d.ts +3 -0
- package/dist/src/rendering/cache/index.d.ts.map +1 -0
- package/dist/src/rendering/cache/renderer-cache.d.ts +100 -0
- package/dist/src/rendering/cache/renderer-cache.d.ts.map +1 -0
- package/dist/src/rendering/cache/renderer-cache.interface.d.ts +89 -0
- package/dist/src/rendering/cache/renderer-cache.interface.d.ts.map +1 -0
- package/dist/src/rendering/cell-pool/cell-pool.d.ts +36 -0
- package/dist/src/rendering/cell-pool/cell-pool.d.ts.map +1 -0
- package/dist/src/rendering/cell-pool/cell-pool.interface.d.ts +76 -0
- package/dist/src/rendering/cell-pool/cell-pool.interface.d.ts.map +1 -0
- package/dist/src/rendering/cell-pool/index.d.ts +6 -0
- package/dist/src/rendering/cell-pool/index.d.ts.map +1 -0
- package/dist/src/rendering/cell-positioner/cell-positioner.d.ts +46 -0
- package/dist/src/rendering/cell-positioner/cell-positioner.d.ts.map +1 -0
- package/dist/src/rendering/cell-positioner/cell-positioner.interface.d.ts +86 -0
- package/dist/src/rendering/cell-positioner/cell-positioner.interface.d.ts.map +1 -0
- package/dist/src/rendering/cell-positioner/index.d.ts +6 -0
- package/dist/src/rendering/cell-positioner/index.d.ts.map +1 -0
- package/dist/src/rendering/height-provider/height-provider.interface.d.ts +62 -0
- package/dist/src/rendering/height-provider/height-provider.interface.d.ts.map +1 -0
- package/dist/src/rendering/height-provider/index.d.ts +7 -0
- package/dist/src/rendering/height-provider/index.d.ts.map +1 -0
- package/dist/src/rendering/height-provider/uniform-height-provider.d.ts +31 -0
- package/dist/src/rendering/height-provider/uniform-height-provider.d.ts.map +1 -0
- package/dist/src/rendering/height-provider/variable-height-provider.d.ts +33 -0
- package/dist/src/rendering/height-provider/variable-height-provider.d.ts.map +1 -0
- package/dist/src/rendering/renderers/advanced-cell-renderer.d.ts +105 -0
- package/dist/src/rendering/renderers/advanced-cell-renderer.d.ts.map +1 -0
- package/dist/src/rendering/renderers/image-renderer.d.ts +60 -0
- package/dist/src/rendering/renderers/image-renderer.d.ts.map +1 -0
- package/dist/src/rendering/renderers/index.d.ts +13 -0
- package/dist/src/rendering/renderers/index.d.ts.map +1 -0
- package/dist/src/rendering/renderers/number-renderer.d.ts +71 -0
- package/dist/src/rendering/renderers/number-renderer.d.ts.map +1 -0
- package/dist/src/rendering/renderers/renderer-registry.d.ts +55 -0
- package/dist/src/rendering/renderers/renderer-registry.d.ts.map +1 -0
- package/dist/src/rendering/renderers/renderer.interface.d.ts +79 -0
- package/dist/src/rendering/renderers/renderer.interface.d.ts.map +1 -0
- package/dist/src/rendering/renderers/text-renderer.d.ts +20 -0
- package/dist/src/rendering/renderers/text-renderer.d.ts.map +1 -0
- package/dist/src/rendering/spatial-hit-tester.d.ts +108 -0
- package/dist/src/rendering/spatial-hit-tester.d.ts.map +1 -0
- package/dist/src/rendering/virtual-scroller/index.d.ts +6 -0
- package/dist/src/rendering/virtual-scroller/index.d.ts.map +1 -0
- package/dist/src/rendering/virtual-scroller/virtual-scroller.d.ts +56 -0
- package/dist/src/rendering/virtual-scroller/virtual-scroller.d.ts.map +1 -0
- package/dist/src/rendering/virtual-scroller/virtual-scroller.interface.d.ts +170 -0
- package/dist/src/rendering/virtual-scroller/virtual-scroller.interface.d.ts.map +1 -0
- package/dist/src/rendering/width-provider/index.d.ts +7 -0
- package/dist/src/rendering/width-provider/index.d.ts.map +1 -0
- package/dist/src/rendering/width-provider/uniform-width-provider.d.ts +31 -0
- package/dist/src/rendering/width-provider/uniform-width-provider.d.ts.map +1 -0
- package/dist/src/rendering/width-provider/variable-width-provider.d.ts +33 -0
- package/dist/src/rendering/width-provider/variable-width-provider.d.ts.map +1 -0
- package/dist/src/rendering/width-provider/width-provider.interface.d.ts +62 -0
- package/dist/src/rendering/width-provider/width-provider.interface.d.ts.map +1 -0
- package/dist/src/selection/hit-tester.d.ts +168 -0
- package/dist/src/selection/hit-tester.d.ts.map +1 -0
- package/dist/src/selection/hit-tester.interface.d.ts +108 -0
- package/dist/src/selection/hit-tester.interface.d.ts.map +1 -0
- package/dist/src/selection/index.d.ts +9 -0
- package/dist/src/selection/index.d.ts.map +1 -0
- package/dist/src/selection/range-utils.d.ts +219 -0
- package/dist/src/selection/range-utils.d.ts.map +1 -0
- package/dist/src/selection/range-utils.interface.d.ts +51 -0
- package/dist/src/selection/range-utils.interface.d.ts.map +1 -0
- package/dist/src/styles/grid.css +356 -0
- package/dist/src/styles.css +273 -0
- package/dist/src/touch/index.d.ts +6 -0
- package/dist/src/touch/index.d.ts.map +1 -0
- package/dist/src/touch/touch-handler.d.ts +167 -0
- package/dist/src/touch/touch-handler.d.ts.map +1 -0
- package/dist/src/types/index.d.ts +133 -0
- package/dist/src/types/index.d.ts.map +1 -0
- package/dist/src/types.d.ts +559 -0
- package/dist/src/types.d.ts.map +1 -0
- package/package.json +47 -0
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Filter Optimizer using Bloom Filter
|
|
3
|
+
*
|
|
4
|
+
* Provides fast filter membership checks to skip expensive scans.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* FilterOptimizer - Quick filter membership tests using Bloom Filter
|
|
8
|
+
*
|
|
9
|
+
* Uses probabilistic Bloom Filter to quickly determine if a value
|
|
10
|
+
* definitely does NOT exist, avoiding expensive column scans.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```typescript
|
|
14
|
+
* const optimizer = new FilterOptimizer();
|
|
15
|
+
*
|
|
16
|
+
* // Index column with 1 million values
|
|
17
|
+
* optimizer.indexColumn(0, products);
|
|
18
|
+
*
|
|
19
|
+
* // Quick check before expensive scan
|
|
20
|
+
* if (!optimizer.mightContain(0, 'iPhone')) {
|
|
21
|
+
* return []; // Definitely not in column - skip scan
|
|
22
|
+
* }
|
|
23
|
+
*
|
|
24
|
+
* // Bloom filter says it might exist - do actual scan
|
|
25
|
+
* const results = grid.scan(0, value => value.includes('iPhone'));
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
export declare class FilterOptimizer {
|
|
29
|
+
private columnFilters;
|
|
30
|
+
private columnStats;
|
|
31
|
+
/**
|
|
32
|
+
* Index column values for quick membership tests
|
|
33
|
+
*
|
|
34
|
+
* @param col - Column index
|
|
35
|
+
* @param values - All values in the column
|
|
36
|
+
* @param falsePositiveRate - Desired false positive rate (default 0.01 = 1%)
|
|
37
|
+
*/
|
|
38
|
+
indexColumn(col: number, values: any[], falsePositiveRate?: number): void;
|
|
39
|
+
/**
|
|
40
|
+
* Quick check if value might exist in column
|
|
41
|
+
*
|
|
42
|
+
* - Returns false: value definitely DOES NOT exist
|
|
43
|
+
* - Returns true: value MIGHT exist (needs actual check)
|
|
44
|
+
*
|
|
45
|
+
* @param col - Column index
|
|
46
|
+
* @param value - Value to check
|
|
47
|
+
* @returns true if value might exist, false if definitely doesn't
|
|
48
|
+
*/
|
|
49
|
+
mightContain(col: number, value: string): boolean;
|
|
50
|
+
/**
|
|
51
|
+
* Check if column is indexed
|
|
52
|
+
*
|
|
53
|
+
* @param col - Column index
|
|
54
|
+
* @returns true if column has bloom filter
|
|
55
|
+
*/
|
|
56
|
+
isIndexed(col: number): boolean;
|
|
57
|
+
/**
|
|
58
|
+
* Get false positive rate for a column
|
|
59
|
+
*
|
|
60
|
+
* @param col - Column index
|
|
61
|
+
* @returns Estimated false positive rate
|
|
62
|
+
*/
|
|
63
|
+
getFalsePositiveRate(col: number): number | null;
|
|
64
|
+
/**
|
|
65
|
+
* Get statistics about indexed column
|
|
66
|
+
*
|
|
67
|
+
* @param col - Column index
|
|
68
|
+
*/
|
|
69
|
+
getStats(col: number): {
|
|
70
|
+
uniqueValues: number;
|
|
71
|
+
falsePositiveRate: number;
|
|
72
|
+
} | null;
|
|
73
|
+
/**
|
|
74
|
+
* Clear filter for a column
|
|
75
|
+
*
|
|
76
|
+
* @param col - Column index
|
|
77
|
+
*/
|
|
78
|
+
clearColumn(col: number): void;
|
|
79
|
+
/**
|
|
80
|
+
* Clear all filters
|
|
81
|
+
*/
|
|
82
|
+
clearAll(): void;
|
|
83
|
+
/**
|
|
84
|
+
* Get all indexed columns
|
|
85
|
+
*
|
|
86
|
+
* @returns Array of column indices
|
|
87
|
+
*/
|
|
88
|
+
getIndexedColumns(): number[];
|
|
89
|
+
/**
|
|
90
|
+
* Get memory usage estimate (in bytes)
|
|
91
|
+
*
|
|
92
|
+
* Bloom filters are very space-efficient.
|
|
93
|
+
* For 10,000 unique values with 1% false positive rate:
|
|
94
|
+
* - Optimal size: ~1.2 KB
|
|
95
|
+
*
|
|
96
|
+
* @param col - Column index
|
|
97
|
+
* @returns Estimated memory usage in bytes
|
|
98
|
+
*/
|
|
99
|
+
getMemoryUsage(col: number): number | null;
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=filter-optimizer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filter-optimizer.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/src/features/filtering/filter-optimizer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,aAAa,CAAuC;IAC5D,OAAO,CAAC,WAAW,CAA+E;IAElG;;;;;;OAMG;IACH,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,iBAAiB,GAAE,MAAa,GAAG,IAAI;IAsB/E;;;;;;;;;OASG;IACH,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO;IAKjD;;;;;OAKG;IACH,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAI/B;;;;;OAKG;IACH,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAKhD;;;;OAIG;IACH,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG;QACrB,YAAY,EAAE,MAAM,CAAC;QACrB,iBAAiB,EAAE,MAAM,CAAC;KAC3B,GAAG,IAAI;IAIR;;;;OAIG;IACH,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAK9B;;OAEG;IACH,QAAQ,IAAI,IAAI;IAKhB;;;;OAIG;IACH,iBAAiB,IAAI,MAAM,EAAE;IAI7B;;;;;;;;;OASG;IACH,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;CAW3C"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import type { FilterQuery, FilterExpression, FilterModel } from '../../types';
|
|
2
|
+
/**
|
|
3
|
+
* FilterQueryParser - Parses SQL-like filter queries
|
|
4
|
+
*
|
|
5
|
+
* Converts SQL-like syntax to FilterExpression for both backend and frontend use
|
|
6
|
+
*
|
|
7
|
+
* Supported operators:
|
|
8
|
+
* - Comparison: =, !=, <, >, <=, >=
|
|
9
|
+
* - String: LIKE, NOT LIKE
|
|
10
|
+
* - Range: BETWEEN, NOT BETWEEN
|
|
11
|
+
* - List: IN, NOT IN
|
|
12
|
+
* - Null: IS NULL, IS NOT NULL
|
|
13
|
+
* - Logic: AND, OR, NOT, ( )
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```typescript
|
|
17
|
+
* const parser = new FilterQueryParser();
|
|
18
|
+
*
|
|
19
|
+
* // Simple query
|
|
20
|
+
* parser.parse({ sql: "age > 18" });
|
|
21
|
+
*
|
|
22
|
+
* // Parameterized query (recommended)
|
|
23
|
+
* parser.parse({
|
|
24
|
+
* sql: "age > :minAge AND status = :status",
|
|
25
|
+
* params: { minAge: 18, status: 'active' }
|
|
26
|
+
* });
|
|
27
|
+
*
|
|
28
|
+
* // Complex query
|
|
29
|
+
* parser.parse({
|
|
30
|
+
* sql: "age BETWEEN :min AND :max AND (name LIKE :search OR email LIKE :search)",
|
|
31
|
+
* params: { min: 18, max: 65, search: '%john%' }
|
|
32
|
+
* });
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
export declare class FilterQueryParser {
|
|
36
|
+
/**
|
|
37
|
+
* Set column name to index mapping
|
|
38
|
+
* Required for converting SQL field names to column indices
|
|
39
|
+
*/
|
|
40
|
+
setColumnMapping(_mapping: Record<string, number>): void;
|
|
41
|
+
/**
|
|
42
|
+
* Parse SQL-like filter query into FilterExpression
|
|
43
|
+
*/
|
|
44
|
+
parse(query: FilterQuery): FilterExpression;
|
|
45
|
+
/**
|
|
46
|
+
* Bind named parameters (:paramName) to their values
|
|
47
|
+
* Converts to positional placeholders (?)
|
|
48
|
+
*/
|
|
49
|
+
private bindNamedParameters;
|
|
50
|
+
/**
|
|
51
|
+
* Extract positional parameters from SQL
|
|
52
|
+
* Converts literal values to ? placeholders
|
|
53
|
+
*/
|
|
54
|
+
private extractPositionalParameters;
|
|
55
|
+
/**
|
|
56
|
+
* Check if a value is part of a SQL keyword
|
|
57
|
+
*/
|
|
58
|
+
private isPartOfKeyword;
|
|
59
|
+
/**
|
|
60
|
+
* Convert SQL query to FilterModels (for frontend filtering)
|
|
61
|
+
* This is a simplified conversion - complex queries may not convert perfectly
|
|
62
|
+
*/
|
|
63
|
+
parseToModels(query: FilterQuery, columnNames: string[]): FilterModel[];
|
|
64
|
+
/**
|
|
65
|
+
* Convert SQL operator to FilterOperator
|
|
66
|
+
*/
|
|
67
|
+
private sqlOperatorToFilterOperator;
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=filter-query-parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filter-query-parser.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/src/features/filtering/filter-query-parser.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,WAAW,EAAkB,MAAM,aAAa,CAAC;AAE9F;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,qBAAa,iBAAiB;IAI5B;;;OAGG;IACH,gBAAgB,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;IAKxD;;OAEG;IACH,KAAK,CAAC,KAAK,EAAE,WAAW,GAAG,gBAAgB;IAoB3C;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IAiB3B;;;OAGG;IACH,OAAO,CAAC,2BAA2B;IAyBnC;;OAEG;IACH,OAAO,CAAC,eAAe;IAKvB;;;OAGG;IACH,aAAa,CAAC,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,WAAW,EAAE;IAYvE;;OAEG;IACH,OAAO,CAAC,2BAA2B;CAepC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Filtering system for ZenGrid
|
|
3
|
+
*/
|
|
4
|
+
export { FilterCompiler } from './filter-compiler';
|
|
5
|
+
export type { FilterPredicate } from './filter-compiler';
|
|
6
|
+
export { ColumnFilter } from './column-filter';
|
|
7
|
+
export type { ColumnFilterOptions } from './column-filter';
|
|
8
|
+
export { FilterManager } from './filter-manager';
|
|
9
|
+
export type { FilterManagerOptions } from './filter-manager';
|
|
10
|
+
export { FilterAutocomplete } from './filter-autocomplete';
|
|
11
|
+
export { FilterOptimizer } from './filter-optimizer';
|
|
12
|
+
export { SubstringFilter } from './substring-filter';
|
|
13
|
+
export { FilterCache } from './filter-cache';
|
|
14
|
+
export { FilterIndexManager } from './filter-index-manager';
|
|
15
|
+
export { RangeFilterOptimizer } from './range-filter-optimizer';
|
|
16
|
+
export type { StandardFilterOperator, CustomOperator, FieldFilterCondition, FieldFilterGroup, FieldFilterState, } from './types';
|
|
17
|
+
export { FilterExportManager } from './filter-export-manager';
|
|
18
|
+
export type { FilterExportManagerOptions } from './filter-export-manager';
|
|
19
|
+
export * from './adapters';
|
|
20
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/src/features/filtering/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,YAAY,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,YAAY,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAE3D,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,YAAY,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAE7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAGrD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAGhE,YAAY,EACV,sBAAsB,EACtB,cAAc,EACd,oBAAoB,EACpB,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,YAAY,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AAG1E,cAAc,YAAY,CAAC"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Range Filter Optimizer using Segment Tree
|
|
3
|
+
*
|
|
4
|
+
* Provides O(log n) range queries for BETWEEN, MIN, MAX operations
|
|
5
|
+
* instead of O(n) linear scans.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Range query result
|
|
9
|
+
*/
|
|
10
|
+
interface RangeQueryResult {
|
|
11
|
+
/** Matching row indices */
|
|
12
|
+
rows: number[];
|
|
13
|
+
/** Statistics */
|
|
14
|
+
stats: {
|
|
15
|
+
min: number;
|
|
16
|
+
max: number;
|
|
17
|
+
sum: number;
|
|
18
|
+
avg: number;
|
|
19
|
+
count: number;
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* RangeFilterOptimizer - Fast range queries with Segment Tree
|
|
24
|
+
*
|
|
25
|
+
* Optimizes BETWEEN, MIN, MAX queries using segment trees.
|
|
26
|
+
* Provides O(log n) queries instead of O(n) scans.
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* ```typescript
|
|
30
|
+
* const optimizer = new RangeFilterOptimizer();
|
|
31
|
+
*
|
|
32
|
+
* // Index column with numeric values
|
|
33
|
+
* optimizer.indexColumn(0, values);
|
|
34
|
+
*
|
|
35
|
+
* // Query: price BETWEEN 100 AND 500
|
|
36
|
+
* const result = optimizer.queryRange(0, 100, 500);
|
|
37
|
+
* // O(log n) instead of O(n)
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
export declare class RangeFilterOptimizer {
|
|
41
|
+
private columnIndexes;
|
|
42
|
+
/**
|
|
43
|
+
* Index a numeric column for range queries
|
|
44
|
+
*
|
|
45
|
+
* @param col - Column index
|
|
46
|
+
* @param values - Array of numeric values (one per row)
|
|
47
|
+
*/
|
|
48
|
+
indexColumn(col: number, values: number[]): void;
|
|
49
|
+
/**
|
|
50
|
+
* Query rows within a range (BETWEEN operator)
|
|
51
|
+
*
|
|
52
|
+
* @param col - Column index
|
|
53
|
+
* @param min - Minimum value (inclusive)
|
|
54
|
+
* @param max - Maximum value (inclusive)
|
|
55
|
+
* @returns Query result with matching rows and statistics
|
|
56
|
+
*/
|
|
57
|
+
queryRange(col: number, min: number, max: number): RangeQueryResult | null;
|
|
58
|
+
/**
|
|
59
|
+
* Get MIN value in a range of rows
|
|
60
|
+
*
|
|
61
|
+
* @param col - Column index
|
|
62
|
+
* @param startRow - Start row index
|
|
63
|
+
* @param endRow - End row index
|
|
64
|
+
* @returns Minimum value in range
|
|
65
|
+
*/
|
|
66
|
+
getMin(col: number, startRow: number, endRow: number): number | null;
|
|
67
|
+
/**
|
|
68
|
+
* Get MAX value in a range of rows
|
|
69
|
+
*
|
|
70
|
+
* @param col - Column index
|
|
71
|
+
* @param startRow - Start row index
|
|
72
|
+
* @param endRow - End row index
|
|
73
|
+
* @returns Maximum value in range
|
|
74
|
+
*/
|
|
75
|
+
getMax(col: number, startRow: number, endRow: number): number | null;
|
|
76
|
+
/**
|
|
77
|
+
* Get SUM of values in a range of rows
|
|
78
|
+
*
|
|
79
|
+
* @param col - Column index
|
|
80
|
+
* @param startRow - Start row index
|
|
81
|
+
* @param endRow - End row index
|
|
82
|
+
* @returns Sum of values in range
|
|
83
|
+
*/
|
|
84
|
+
getSum(col: number, startRow: number, endRow: number): number | null;
|
|
85
|
+
/**
|
|
86
|
+
* Update a single value in the index
|
|
87
|
+
*
|
|
88
|
+
* @param col - Column index
|
|
89
|
+
* @param row - Row index
|
|
90
|
+
* @param value - New value
|
|
91
|
+
*/
|
|
92
|
+
update(col: number, row: number, value: number): void;
|
|
93
|
+
/**
|
|
94
|
+
* Rebuild sorted indices after multiple updates
|
|
95
|
+
*
|
|
96
|
+
* @param col - Column index
|
|
97
|
+
*/
|
|
98
|
+
rebuildSortedIndices(col: number): void;
|
|
99
|
+
/**
|
|
100
|
+
* Check if column is indexed
|
|
101
|
+
*
|
|
102
|
+
* @param col - Column index
|
|
103
|
+
* @returns true if column has range index
|
|
104
|
+
*/
|
|
105
|
+
isIndexed(col: number): boolean;
|
|
106
|
+
/**
|
|
107
|
+
* Clear index for a column
|
|
108
|
+
*
|
|
109
|
+
* @param col - Column index
|
|
110
|
+
*/
|
|
111
|
+
clearColumn(col: number): void;
|
|
112
|
+
/**
|
|
113
|
+
* Clear all indexes
|
|
114
|
+
*/
|
|
115
|
+
clearAll(): void;
|
|
116
|
+
/**
|
|
117
|
+
* Get statistics about indexed columns
|
|
118
|
+
*/
|
|
119
|
+
getStats(): {
|
|
120
|
+
indexedColumns: number;
|
|
121
|
+
totalValues: number;
|
|
122
|
+
memoryEstimateMB: number;
|
|
123
|
+
};
|
|
124
|
+
/**
|
|
125
|
+
* Binary search for leftmost position where value >= target
|
|
126
|
+
*/
|
|
127
|
+
private binarySearchLeft;
|
|
128
|
+
/**
|
|
129
|
+
* Binary search for rightmost position where value <= target
|
|
130
|
+
*/
|
|
131
|
+
private binarySearchRight;
|
|
132
|
+
/**
|
|
133
|
+
* Calculate statistics for matching rows
|
|
134
|
+
*/
|
|
135
|
+
private calculateRangeStats;
|
|
136
|
+
}
|
|
137
|
+
export {};
|
|
138
|
+
//# sourceMappingURL=range-filter-optimizer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"range-filter-optimizer.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/src/features/filtering/range-filter-optimizer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA8BH;;GAEG;AACH,UAAU,gBAAgB;IACxB,2BAA2B;IAC3B,IAAI,EAAE,MAAM,EAAE,CAAC;IAEf,iBAAiB;IACjB,KAAK,EAAE;QACL,GAAG,EAAE,MAAM,CAAC;QACZ,GAAG,EAAE,MAAM,CAAC;QACZ,GAAG,EAAE,MAAM,CAAC;QACZ,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;CACH;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,aAAa,CAA2C;IAEhE;;;;;OAKG;IACH,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI;IAyChD;;;;;;;OAOG;IACH,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI;IAmC1E;;;;;;;OAOG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAOpE;;;;;;;OAOG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAOpE;;;;;;;OAOG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAOpE;;;;;;OAMG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAiBrD;;;;OAIG;IACH,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAUvC;;;;;OAKG;IACH,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAI/B;;;;OAIG;IACH,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAI9B;;OAEG;IACH,QAAQ,IAAI,IAAI;IAIhB;;OAEG;IACH,QAAQ,IAAI;QACV,cAAc,EAAE,MAAM,CAAC;QACvB,WAAW,EAAE,MAAM,CAAC;QACpB,gBAAgB,EAAE,MAAM,CAAC;KAC1B;IAoBD;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAwBxB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAwBzB;;OAEG;IACH,OAAO,CAAC,mBAAmB;CA2B5B"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Substring Filter using Suffix Array
|
|
3
|
+
*
|
|
4
|
+
* Provides fast substring search ("contains") filtering for grid columns.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* SubstringFilter - Fast substring search using Suffix Array
|
|
8
|
+
*
|
|
9
|
+
* Indexes column values for O(m log n) substring search instead of O(n*m) linear scan.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```typescript
|
|
13
|
+
* const filter = new SubstringFilter();
|
|
14
|
+
*
|
|
15
|
+
* // Index column 0 with product names
|
|
16
|
+
* filter.indexColumn(0, [
|
|
17
|
+
* 'Apple iPhone 14',
|
|
18
|
+
* 'Samsung Galaxy S23',
|
|
19
|
+
* 'Microsoft Surface Pro'
|
|
20
|
+
* ]);
|
|
21
|
+
*
|
|
22
|
+
* // Find all rows containing "phone" (matches "iPhone")
|
|
23
|
+
* const rows = filter.filterBySubstring(0, 'phone');
|
|
24
|
+
* // [0] - Row 0 contains "phone" in "iPhone"
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
export declare class SubstringFilter {
|
|
28
|
+
private columnIndexes;
|
|
29
|
+
private columnMaps;
|
|
30
|
+
/**
|
|
31
|
+
* Index all values in a column for substring search
|
|
32
|
+
*
|
|
33
|
+
* @param col - Column index
|
|
34
|
+
* @param values - All values in the column
|
|
35
|
+
*/
|
|
36
|
+
indexColumn(col: number, values: any[]): void;
|
|
37
|
+
/**
|
|
38
|
+
* Find all rows where column value contains the substring
|
|
39
|
+
*
|
|
40
|
+
* @param col - Column index
|
|
41
|
+
* @param substring - Substring to search for
|
|
42
|
+
* @returns Array of row indices that match
|
|
43
|
+
*/
|
|
44
|
+
filterBySubstring(col: number, substring: string): number[];
|
|
45
|
+
/**
|
|
46
|
+
* Check if any row in the column contains the substring
|
|
47
|
+
*
|
|
48
|
+
* @param col - Column index
|
|
49
|
+
* @param substring - Substring to check
|
|
50
|
+
* @returns true if at least one row contains the substring
|
|
51
|
+
*/
|
|
52
|
+
contains(col: number, substring: string): boolean;
|
|
53
|
+
/**
|
|
54
|
+
* Count how many rows contain the substring
|
|
55
|
+
*
|
|
56
|
+
* @param col - Column index
|
|
57
|
+
* @param substring - Substring to count
|
|
58
|
+
* @returns Number of rows containing the substring
|
|
59
|
+
*/
|
|
60
|
+
count(col: number, substring: string): number;
|
|
61
|
+
/**
|
|
62
|
+
* Get statistics for a column index
|
|
63
|
+
*
|
|
64
|
+
* @param col - Column index
|
|
65
|
+
* @returns Statistics or null if not indexed
|
|
66
|
+
*/
|
|
67
|
+
getStats(col: number): {
|
|
68
|
+
rowCount: number;
|
|
69
|
+
totalChars: number;
|
|
70
|
+
textLength: number;
|
|
71
|
+
suffixCount: number;
|
|
72
|
+
memoryBytes: number;
|
|
73
|
+
hasLCP: boolean;
|
|
74
|
+
} | null;
|
|
75
|
+
/**
|
|
76
|
+
* Clear index for a column
|
|
77
|
+
*
|
|
78
|
+
* @param col - Column index
|
|
79
|
+
*/
|
|
80
|
+
clearColumn(col: number): void;
|
|
81
|
+
/**
|
|
82
|
+
* Clear all indexes
|
|
83
|
+
*/
|
|
84
|
+
clearAll(): void;
|
|
85
|
+
/**
|
|
86
|
+
* Binary search to find which row a position belongs to
|
|
87
|
+
*/
|
|
88
|
+
private findRowIndex;
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=substring-filter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"substring-filter.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/src/features/filtering/substring-filter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAkBH;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,aAAa,CAAuC;IAC5D,OAAO,CAAC,UAAU,CAAuC;IAEzD;;;;;OAKG;IACH,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,IAAI;IAiC7C;;;;;;OAMG;IACH,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE;IAyB3D;;;;;;OAMG;IACH,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO;IAKjD;;;;;;OAMG;IACH,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM;IAI7C;;;;;OAKG;IACH,QAAQ,CAAC,GAAG,EAAE,MAAM;;;;;;;;IAapB;;;;OAIG;IACH,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAM9B;;OAEG;IACH,QAAQ,IAAI,IAAI;IAQhB;;OAEG;IACH,OAAO,CAAC,YAAY;CAoBrB"}
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Field-Based Filter Types
|
|
3
|
+
*
|
|
4
|
+
* This module defines a new field-based filtering system that uses
|
|
5
|
+
* field names instead of column indices, making it easier for backends
|
|
6
|
+
* to consume filter parameters without complex mapping logic.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Standard filter operators
|
|
10
|
+
* Short, backend-friendly identifiers that map to common database operations
|
|
11
|
+
*/
|
|
12
|
+
export type StandardFilterOperator = 'eq' | 'neq' | 'gt' | 'gte' | 'lt' | 'lte' | 'contains' | 'notContains' | 'startsWith' | 'endsWith' | 'in' | 'notIn' | 'between' | 'isNull' | 'isNotNull' | 'regex';
|
|
13
|
+
/**
|
|
14
|
+
* Custom operator definition
|
|
15
|
+
* Allows registration of domain-specific operators
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```typescript
|
|
19
|
+
* const fuzzyOperator: CustomOperator = {
|
|
20
|
+
* id: 'fuzzy',
|
|
21
|
+
* label: 'Fuzzy Match',
|
|
22
|
+
* valueCount: 1,
|
|
23
|
+
* predicate: (cellValue, filterValue) => {
|
|
24
|
+
* return levenshtein(cellValue, filterValue) < 3;
|
|
25
|
+
* },
|
|
26
|
+
* sqlTemplate: "SIMILARITY(?, ?) > 0.7",
|
|
27
|
+
* graphqlKey: '_similar',
|
|
28
|
+
* restSuffix: '_fuzzy'
|
|
29
|
+
* };
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
export interface CustomOperator {
|
|
33
|
+
/**
|
|
34
|
+
* Unique operator identifier
|
|
35
|
+
*/
|
|
36
|
+
id: string;
|
|
37
|
+
/**
|
|
38
|
+
* Human-readable label for UI
|
|
39
|
+
*/
|
|
40
|
+
label: string;
|
|
41
|
+
/**
|
|
42
|
+
* Number of values required
|
|
43
|
+
* - 0: no values (e.g., isNull)
|
|
44
|
+
* - 1: single value (e.g., equals, contains)
|
|
45
|
+
* - 2: two values (e.g., between)
|
|
46
|
+
* - 'array': array of values (e.g., in)
|
|
47
|
+
*/
|
|
48
|
+
valueCount: 0 | 1 | 2 | 'array';
|
|
49
|
+
/**
|
|
50
|
+
* Frontend predicate function for filtering rows
|
|
51
|
+
* @param cellValue - The value from the cell
|
|
52
|
+
* @param filterValue - The filter value(s)
|
|
53
|
+
* @returns true if row matches filter
|
|
54
|
+
*/
|
|
55
|
+
predicate: (cellValue: any, filterValue: any) => boolean;
|
|
56
|
+
/**
|
|
57
|
+
* SQL template for backend queries
|
|
58
|
+
* Use ? for value placeholders
|
|
59
|
+
* @example "SIMILARITY(?, ?) > 0.7"
|
|
60
|
+
*/
|
|
61
|
+
sqlTemplate: string;
|
|
62
|
+
/**
|
|
63
|
+
* GraphQL key for the operator
|
|
64
|
+
* @example "_similar" for Hasura, "similar" for Prisma
|
|
65
|
+
*/
|
|
66
|
+
graphqlKey?: string;
|
|
67
|
+
/**
|
|
68
|
+
* REST suffix for query params
|
|
69
|
+
* @example "_fuzzy" results in "name_fuzzy=value"
|
|
70
|
+
*/
|
|
71
|
+
restSuffix?: string;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Field-based filter condition
|
|
75
|
+
*
|
|
76
|
+
* This is the NEW format sent to backends, using field names
|
|
77
|
+
* instead of column indices.
|
|
78
|
+
*
|
|
79
|
+
* @example
|
|
80
|
+
* ```typescript
|
|
81
|
+
* // Simple condition
|
|
82
|
+
* { field: 'age', operator: 'gt', value: 18 }
|
|
83
|
+
*
|
|
84
|
+
* // Between condition
|
|
85
|
+
* { field: 'price', operator: 'between', value: 100, valueTo: 500 }
|
|
86
|
+
*
|
|
87
|
+
* // In condition
|
|
88
|
+
* { field: 'status', operator: 'in', value: ['active', 'pending'] }
|
|
89
|
+
*
|
|
90
|
+
* // Null check
|
|
91
|
+
* { field: 'deletedAt', operator: 'isNull' }
|
|
92
|
+
* ```
|
|
93
|
+
*/
|
|
94
|
+
export interface FieldFilterCondition {
|
|
95
|
+
/**
|
|
96
|
+
* Field name from ColumnDef.field
|
|
97
|
+
*/
|
|
98
|
+
field: string;
|
|
99
|
+
/**
|
|
100
|
+
* Filter operator
|
|
101
|
+
*/
|
|
102
|
+
operator: StandardFilterOperator | string;
|
|
103
|
+
/**
|
|
104
|
+
* Filter value
|
|
105
|
+
* - undefined for isNull/isNotNull
|
|
106
|
+
* - single value for most operators
|
|
107
|
+
* - array for 'in'/'notIn'
|
|
108
|
+
*/
|
|
109
|
+
value?: any;
|
|
110
|
+
/**
|
|
111
|
+
* Secondary value for 'between' operator
|
|
112
|
+
*/
|
|
113
|
+
valueTo?: any;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Filter group with logic operator
|
|
117
|
+
*
|
|
118
|
+
* Allows combining multiple conditions with AND/OR logic
|
|
119
|
+
* and supports nesting for complex queries.
|
|
120
|
+
*
|
|
121
|
+
* @example
|
|
122
|
+
* ```typescript
|
|
123
|
+
* // Simple AND group
|
|
124
|
+
* {
|
|
125
|
+
* logic: 'AND',
|
|
126
|
+
* conditions: [
|
|
127
|
+
* { field: 'age', operator: 'gt', value: 18 },
|
|
128
|
+
* { field: 'status', operator: 'eq', value: 'active' }
|
|
129
|
+
* ]
|
|
130
|
+
* }
|
|
131
|
+
*
|
|
132
|
+
* // Nested groups: (age > 18 AND status = 'active') OR (role = 'admin')
|
|
133
|
+
* {
|
|
134
|
+
* logic: 'OR',
|
|
135
|
+
* groups: [
|
|
136
|
+
* {
|
|
137
|
+
* logic: 'AND',
|
|
138
|
+
* conditions: [
|
|
139
|
+
* { field: 'age', operator: 'gt', value: 18 },
|
|
140
|
+
* { field: 'status', operator: 'eq', value: 'active' }
|
|
141
|
+
* ]
|
|
142
|
+
* },
|
|
143
|
+
* {
|
|
144
|
+
* logic: 'AND',
|
|
145
|
+
* conditions: [
|
|
146
|
+
* { field: 'role', operator: 'eq', value: 'admin' }
|
|
147
|
+
* ]
|
|
148
|
+
* }
|
|
149
|
+
* ]
|
|
150
|
+
* }
|
|
151
|
+
* ```
|
|
152
|
+
*/
|
|
153
|
+
export interface FieldFilterGroup {
|
|
154
|
+
/**
|
|
155
|
+
* Logic operator between conditions/groups
|
|
156
|
+
*/
|
|
157
|
+
logic: 'AND' | 'OR';
|
|
158
|
+
/**
|
|
159
|
+
* Filter conditions in this group
|
|
160
|
+
*/
|
|
161
|
+
conditions: FieldFilterCondition[];
|
|
162
|
+
/**
|
|
163
|
+
* Nested filter groups for complex queries
|
|
164
|
+
*/
|
|
165
|
+
groups?: FieldFilterGroup[];
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Complete filter state in field-based format
|
|
169
|
+
*
|
|
170
|
+
* This is the top-level filter state that gets exported to backends.
|
|
171
|
+
*
|
|
172
|
+
* @example
|
|
173
|
+
* ```typescript
|
|
174
|
+
* const filterState: FieldFilterState = {
|
|
175
|
+
* root: {
|
|
176
|
+
* logic: 'AND',
|
|
177
|
+
* conditions: [
|
|
178
|
+
* { field: 'age', operator: 'gt', value: 18 },
|
|
179
|
+
* { field: 'status', operator: 'eq', value: 'active' }
|
|
180
|
+
* ]
|
|
181
|
+
* },
|
|
182
|
+
* activeFields: ['age', 'status'],
|
|
183
|
+
* timestamp: Date.now()
|
|
184
|
+
* };
|
|
185
|
+
* ```
|
|
186
|
+
*/
|
|
187
|
+
export interface FieldFilterState {
|
|
188
|
+
/**
|
|
189
|
+
* Root filter group
|
|
190
|
+
* null if no filters are active
|
|
191
|
+
*/
|
|
192
|
+
root: FieldFilterGroup | null;
|
|
193
|
+
/**
|
|
194
|
+
* Quick access to all active field names
|
|
195
|
+
* Useful for UI highlighting
|
|
196
|
+
*/
|
|
197
|
+
activeFields: string[];
|
|
198
|
+
/**
|
|
199
|
+
* Timestamp of last filter change
|
|
200
|
+
* Useful for caching and tracking updates
|
|
201
|
+
*/
|
|
202
|
+
timestamp: number;
|
|
203
|
+
}
|
|
204
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/src/features/filtering/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;GAGG;AACH,MAAM,MAAM,sBAAsB,GAE9B,IAAI,GACJ,KAAK,GAGL,IAAI,GACJ,KAAK,GACL,IAAI,GACJ,KAAK,GAGL,UAAU,GACV,aAAa,GACb,YAAY,GACZ,UAAU,GAGV,IAAI,GACJ,OAAO,GACP,SAAS,GAGT,QAAQ,GACR,WAAW,GAGX,OAAO,CAAC;AAEZ;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,WAAW,cAAc;IAC7B;;OAEG;IACH,EAAE,EAAE,MAAM,CAAC;IAEX;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;;;;;OAMG;IACH,UAAU,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC;IAEhC;;;;;OAKG;IACH,SAAS,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,KAAK,OAAO,CAAC;IAEzD;;;;OAIG;IACH,WAAW,EAAE,MAAM,CAAC;IAEpB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,WAAW,oBAAoB;IACnC;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,QAAQ,EAAE,sBAAsB,GAAG,MAAM,CAAC;IAE1C;;;;;OAKG;IACH,KAAK,CAAC,EAAE,GAAG,CAAC;IAEZ;;OAEG;IACH,OAAO,CAAC,EAAE,GAAG,CAAC;CACf;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;OAEG;IACH,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IAEpB;;OAEG;IACH,UAAU,EAAE,oBAAoB,EAAE,CAAC;IAEnC;;OAEG;IACH,MAAM,CAAC,EAAE,gBAAgB,EAAE,CAAC;CAC7B;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;OAGG;IACH,IAAI,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAE9B;;;OAGG;IACH,YAAY,EAAE,MAAM,EAAE,CAAC;IAEvB;;;OAGG;IACH,SAAS,EAAE,MAAM,CAAC;CACnB"}
|