From fe7e04f61b5245f856dae5612f53d2eac2112859 Mon Sep 17 00:00:00 2001
From: Sebastian Bittrich <bittrich@hs-mittweida.de>
Date: Fri, 7 Jun 2019 16:56:04 -0700
Subject: [PATCH] lowercase string parameters, filtering directive object

---
 src/mol-io/writer/_spec/cif.spec.ts | 32 +++++++++++++++++++++--------
 src/mol-io/writer/cif/encoder.ts    | 23 ++++++++++++++++++++-
 2 files changed, 46 insertions(+), 9 deletions(-)

diff --git a/src/mol-io/writer/_spec/cif.spec.ts b/src/mol-io/writer/_spec/cif.spec.ts
index b0c3bfc61..0b5a8de6c 100644
--- a/src/mol-io/writer/_spec/cif.spec.ts
+++ b/src/mol-io/writer/_spec/cif.spec.ts
@@ -78,18 +78,34 @@ const filter_aware_encoder1 = CifWriter.createEncoder({
     binary: true,
     binaryAutoClassifyEncoding: true
 });
-filter_aware_encoder1.setFilter(C.Category.whitelistBlacklistFilter(['atom_site'], // allow only category atom_site
-    [], // blacklist no categories
-    ['atom_site.Cartn_x', 'atom_site.Cartn_y'], // for atom_site: allow only Cartn_x and Cartn_y
-    [])); // blacklist no fields
+filter_aware_encoder1.setFilter(C.Category.filterOf([
+    { // allow only category atom_site
+        categoryName: 'atom_site',
+        behavior: 'whitelist'
+    }, { // for atom_site: allow only Cartn_x and Cartn_y
+        categoryName: 'atom_site',
+        columnName: 'Cartn_x',
+        behavior: 'whitelist'
+    }, {
+        categoryName: 'atom_site',
+        columnName: 'Cartn_y',
+        behavior: 'whitelist'
+    }
+]));
 
 const filter_aware_encoder2 = CifWriter.createEncoder({
     binary: true
 });
-filter_aware_encoder2.setFilter(C.Category.whitelistBlacklistFilter([],
-    ['atom_site'], // ignore atom_site category
-    [],
-    ['other_fields.field2'])); // exclude field2
+filter_aware_encoder2.setFilter(C.Category.filterOf([
+    { // ignore atom_site category
+        categoryName: 'atom_site',
+        behavior: 'blacklist'
+    }, { // exclude field2
+        categoryName: 'other_fields',
+        columnName: 'field2',
+        behavior: 'blacklist'
+    }
+]));
 
 describe('filtering-config', () => {
     const decoded1 = process(filter_aware_encoder1);
diff --git a/src/mol-io/writer/cif/encoder.ts b/src/mol-io/writer/cif/encoder.ts
index 331e4184f..7a2daef68 100644
--- a/src/mol-io/writer/cif/encoder.ts
+++ b/src/mol-io/writer/cif/encoder.ts
@@ -132,7 +132,28 @@ export namespace Category {
         includeField(categoryName: string, fieldName: string): boolean,
     }
 
-    export function whitelistBlacklistFilter(cat_whitelist: String[], cat_blacklist: String[], field_whitelist: String[], field_blacklist: String[]): Filter {
+    export interface FilteringDirective {
+        categoryName: string,
+        columnName?: string,
+        behavior: FilteringBehavior
+    }
+
+    export type FilteringBehavior = 'whitelist' | 'blacklist';
+
+    export function filterOf(directives: FilteringDirective[]): Filter {
+        const cat_whitelist: string[] = [];
+        const cat_blacklist: string[] = [];
+        const field_whitelist: string[] = [];
+        const field_blacklist: string[] = [];
+
+        for (const d of directives) {
+            const field = d.columnName;
+            const name = field ? d.categoryName + '.' + d.columnName : d.categoryName;
+            const list = d.behavior === 'whitelist' ? (field ? field_whitelist : cat_whitelist) : (field ? field_blacklist : cat_blacklist);
+
+            list[list.length] = name;
+        }
+
         const wlcatcol = field_whitelist.map(it => it.split('.')[0]);
         // blacklist has higher priority
         return {
-- 
GitLab