aboutsummaryrefslogtreecommitdiff
path: root/src/client/northstar/core
diff options
context:
space:
mode:
authorbob <bcz@cs.brown.edu>2019-03-26 13:56:50 -0400
committerbob <bcz@cs.brown.edu>2019-03-26 13:56:50 -0400
commitb9d23e5adde2da01708cc8501ca375726d232d06 (patch)
treed6619061e76d95dfa1a355219af146471f09f9bb /src/client/northstar/core
parent8335f0ba0b780a0ed0619e52076f051f122e4865 (diff)
some filtering
Diffstat (limited to 'src/client/northstar/core')
-rw-r--r--src/client/northstar/core/filter/FilterModel.ts48
-rw-r--r--src/client/northstar/core/filter/IBaseFilterConsumer.ts4
2 files changed, 49 insertions, 3 deletions
diff --git a/src/client/northstar/core/filter/FilterModel.ts b/src/client/northstar/core/filter/FilterModel.ts
index 01bf2a809..a9c79d245 100644
--- a/src/client/northstar/core/filter/FilterModel.ts
+++ b/src/client/northstar/core/filter/FilterModel.ts
@@ -1,8 +1,13 @@
import { ValueComparison } from "./ValueComparision";
import { Utils } from "../../utils/Utils";
-import { IBaseFilterProvider } from "./IBaseFilterProvider";
+import { IBaseFilterProvider, instanceOfIBaseFilterProvider } from "./IBaseFilterProvider";
import { BaseOperation } from "../../operations/BaseOperation";
import { FilterOperand } from "./FilterOperand";
+import { HistogramField } from "../../../../fields/HistogramField";
+import { KeyStore } from "../../../../fields/KeyStore";
+import { filter } from "bluebird";
+import { FieldWaiting } from "../../../../fields/Field";
+import { Document } from "../../../../fields/Document";
export class FilterModel {
public ValueComparisons: ValueComparison[];
@@ -38,6 +43,47 @@ export class FilterModel {
let ret = filters.filter(f => f !== "").join(" && ");
return ret;
}
+ public static GetFilterModelsRecursive(baseOperation: IBaseFilterProvider, visitedFilterProviders: Set<IBaseFilterProvider>, filterModels: FilterModel[], isFirst: boolean): string {
+ let ret = "";
+ visitedFilterProviders.add(baseOperation);
+ let filtered = baseOperation.FilterModels.filter(fm => fm && fm.ValueComparisons.length > 0);
+ if (!isFirst && filtered.length > 0) {
+ filterModels.push(...filtered);
+ ret = "(" + baseOperation.FilterModels.filter(fm => fm != null).map(fm => fm.ToPythonString()).join(" || ") + ")";
+ }
+ if (Utils.isBaseFilterConsumer(baseOperation) && baseOperation.Links) {
+ let children = new Array<string>();
+ let linkedGraphNodes = baseOperation.Links;
+ linkedGraphNodes.map(linkVm => {
+ let filterDoc = linkVm.Get(KeyStore.LinkedFromDocs);
+ if (filterDoc && filterDoc != FieldWaiting && filterDoc instanceof Document) {
+ let filterHistogram = filterDoc.GetT(KeyStore.Data, HistogramField);
+ if (filterHistogram && filterHistogram != FieldWaiting) {
+ if (!visitedFilterProviders.has(filterHistogram.Data)) {
+ let child = FilterModel.GetFilterModelsRecursive(filterHistogram.Data, visitedFilterProviders, filterModels, false);
+ if (child !== "") {
+ // if (linkVm.IsInverted) {
+ // child = "! " + child;
+ // }
+ children.push(child);
+ }
+ }
+ }
+ }
+ });
+
+ let childrenJoined = children.join(baseOperation.FilterOperand === FilterOperand.AND ? " && " : " || ");
+ if (children.length > 0) {
+ if (ret !== "") {
+ ret = "(" + ret + " && (" + childrenJoined + "))";
+ }
+ else {
+ ret = "(" + childrenJoined + ")";
+ }
+ }
+ }
+ return ret;
+ }
// public static GetFilterModelsRecursive(baseOperation: BaseOperation,
// visitedFilterProviders: Set<IBaseFilterProvider>, filterModels: FilterModel[], isFirst: boolean): string {
diff --git a/src/client/northstar/core/filter/IBaseFilterConsumer.ts b/src/client/northstar/core/filter/IBaseFilterConsumer.ts
index 3eb32b6db..93f66a154 100644
--- a/src/client/northstar/core/filter/IBaseFilterConsumer.ts
+++ b/src/client/northstar/core/filter/IBaseFilterConsumer.ts
@@ -1,10 +1,10 @@
import { FilterOperand } from '../filter/FilterOperand'
import { IEquatable } from '../../utils/IEquatable'
-import { IBaseFilterProvider } from './IBaseFilterProvider';
+import { Document } from "../../../../fields/Document";
export interface IBaseFilterConsumer extends IEquatable {
FilterOperand: FilterOperand;
- Links: IBaseFilterProvider[];
+ Links: Document[];
}
export function instanceOfIBaseFilterConsumer(object: any): object is IBaseFilterConsumer {