@dra2020/baseclient 1.0.166 → 1.0.167

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.
@@ -65,4 +65,5 @@ export declare class FilterExpr {
65
65
  asStringClause(clause: Clause): string;
66
66
  testClause(o: any, types: any, clause: Clause, prop?: string, relation?: TokType): boolean;
67
67
  }
68
+ export declare function cacheFilterExpr(o: any, types: any): void;
68
69
  export {};
package/lib/all/all.ts CHANGED
@@ -15,8 +15,8 @@ import * as OT from '../ot-js/all';
15
15
  export { OT };
16
16
  import * as OTE from '../ot-editutil/all';
17
17
  export { OTE };
18
- import { FilterExpr } from '../filterexpr/all';
19
- export { FilterExpr }
18
+ import { FilterExpr, cacheFilterExpr } from '../filterexpr/all';
19
+ export { FilterExpr, cacheFilterExpr }
20
20
  import * as G from '../geo/all';
21
21
  export { G };
22
22
  import * as Emit from '../emit/all';
@@ -677,42 +677,55 @@ export class FilterExpr
677
677
 
678
678
  testClause(o: any, types: any, clause: Clause, prop?: string, relation?: TokType): boolean
679
679
  {
680
- if (clause == null) return true;
681
- switch (clause.op.tt)
682
- {
683
- case TokType.Text:
684
- for (let p in o) if (o.hasOwnProperty(p) && (prop == null || p.toLowerCase() === prop))
680
+ const filterProp = (p: string) => {
681
+ let s = toString(o[p]);
682
+ if (s)
685
683
  {
686
- let s = toString(o[p]);
687
- if (s)
684
+ let t = types ? types[p] : undefined;
685
+ if (t === 'skip')
686
+ return false;
687
+ if (t && t === 'date')
688
+ s = wordyDate(s);
689
+ s = s.toLowerCase();
690
+ if (relation === undefined)
688
691
  {
689
- let t = types ? types[p] : undefined;
690
- if (t === 'skip')
691
- continue;
692
- if (t && t === 'date')
693
- s = wordyDate(s);
694
- s = s.toLowerCase();
695
- if (relation === undefined)
692
+ if (s.indexOf(clause.op.text) >= 0)
693
+ return true;
694
+ }
695
+ else
696
+ {
697
+ let op2: any = isNaN(Number(clause.op.text)) ? clause.op.text : Number(clause.op.text);
698
+ let op1: any = typeof op2 === 'number' ? Number(s) : s;
699
+ switch (relation)
696
700
  {
697
- if (s.indexOf(clause.op.text) >= 0)
698
- return true;
699
- }
700
- else
701
- {
702
- let op2: any = isNaN(Number(clause.op.text)) ? clause.op.text : Number(clause.op.text);
703
- let op1: any = typeof op2 === 'number' ? Number(s) : s;
704
- switch (relation)
705
- {
706
- case TokType.Equal: return op1 === op2;
707
- case TokType.LessThan: return op1 < op2;
708
- case TokType.LessThanEqual: return op1 <= op2;
709
- case TokType.GreaterThanEqual: return op1 >= op2;
710
- case TokType.GreaterThan: return op1 > op2;
711
- case TokType.NotEqual: return op1 !== op2;
712
- }
701
+ case TokType.Equal: return op1 === op2;
702
+ case TokType.LessThan: return op1 < op2;
703
+ case TokType.LessThanEqual: return op1 <= op2;
704
+ case TokType.GreaterThanEqual: return op1 >= op2;
705
+ case TokType.GreaterThan: return op1 > op2;
706
+ case TokType.NotEqual: return op1 !== op2;
713
707
  }
714
708
  }
715
709
  }
710
+ };
711
+
712
+ if (clause == null) return true;
713
+ switch (clause.op.tt)
714
+ {
715
+ case TokType.Text:
716
+ if (o._filtercache)
717
+ {
718
+ if (prop == null)
719
+ return o._filtercache.indexOf(clause.op.text) >= 0;
720
+ else
721
+ return filterProp(prop);
722
+ }
723
+ else
724
+ {
725
+ for (let p in o)
726
+ if ((prop == null || p === prop) && filterProp(p))
727
+ return true;
728
+ }
716
729
  return false;
717
730
 
718
731
  case TokType.Colon:
@@ -743,3 +756,28 @@ export class FilterExpr
743
756
  // NOTREACHED
744
757
  }
745
758
  }
759
+
760
+ export function cacheFilterExpr(o: any, types: any): void
761
+ {
762
+ if (o)
763
+ {
764
+ delete o._filtercache;
765
+ let a: string[] = [];
766
+ for (let p in o)
767
+ {
768
+ let s: string;
769
+ let t = types ? types[p] : undefined;
770
+ if (t === 'skip')
771
+ s = '';
772
+ else
773
+ {
774
+ s = toString(o[p]);
775
+ if (t === 'date')
776
+ s = wordyDate(s);
777
+ s = s.toLowerCase();
778
+ }
779
+ a.push(s);
780
+ }
781
+ o._filtercache = a.join('|'); // insert separator to reduce likelihood of spurious matches that cross property values
782
+ }
783
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dra2020/baseclient",
3
- "version": "1.0.166",
3
+ "version": "1.0.167",
4
4
  "description": "Utility functions for Javascript projects.",
5
5
  "main": "dist/baseclient.js",
6
6
  "types": "./dist/all/all.d.ts",