From 8b1552d344a1ce42a36e8db66a98c8d9a8c2f9f9 Mon Sep 17 00:00:00 2001
From: David Sehnal <david.sehnal@gmail.com>
Date: Tue, 3 Oct 2017 14:39:44 +0200
Subject: [PATCH] Added stringEquals to column

---
 src/reader/cif/{binary-field.ts => binary/field.ts}   |  0
 src/reader/cif/{binary-parser.ts => binary/parser.ts} |  0
 src/reader/cif/index.ts                               |  7 +++++--
 src/reader/cif/schema.ts                              |  1 +
 src/reader/cif/{text-field.ts => text/field.ts}       | 10 +++++-----
 src/reader/cif/{text-parser.ts => text/parser.ts}     |  8 ++++----
 src/reader/common/column.ts                           |  4 +++-
 src/reader/common/text/column/fixed.ts                |  1 +
 src/reader/common/text/column/token.ts                | 10 ++++++++++
 src/reader/spec/cif.spec.ts                           |  2 +-
 src/script.ts                                         |  2 +-
 11 files changed, 31 insertions(+), 14 deletions(-)
 rename src/reader/cif/{binary-field.ts => binary/field.ts} (100%)
 rename src/reader/cif/{binary-parser.ts => binary/parser.ts} (100%)
 rename src/reader/cif/{text-field.ts => text/field.ts} (89%)
 rename src/reader/cif/{text-parser.ts => text/parser.ts} (99%)

diff --git a/src/reader/cif/binary-field.ts b/src/reader/cif/binary/field.ts
similarity index 100%
rename from src/reader/cif/binary-field.ts
rename to src/reader/cif/binary/field.ts
diff --git a/src/reader/cif/binary-parser.ts b/src/reader/cif/binary/parser.ts
similarity index 100%
rename from src/reader/cif/binary-parser.ts
rename to src/reader/cif/binary/parser.ts
diff --git a/src/reader/cif/index.ts b/src/reader/cif/index.ts
index c7ba6c3d5..c3882b9e8 100644
--- a/src/reader/cif/index.ts
+++ b/src/reader/cif/index.ts
@@ -4,12 +4,15 @@
  * @author David Sehnal <david.sehnal@gmail.com>
  */
 
-import parseText from './text-parser'
+import parseText from './text/parser'
+import { Block } from './data-model'
 import { apply as applySchema } from './schema'
 import mmCIF from './schema/mmcif'
 
 export default {
     parseText,
     applySchema,
-    schema: { mmCIF }
+    schema: {
+        mmCIF: (block: Block) => applySchema(mmCIF, block)
+    }
 }
\ No newline at end of file
diff --git a/src/reader/cif/schema.ts b/src/reader/cif/schema.ts
index aea1576e9..f6c058f58 100644
--- a/src/reader/cif/schema.ts
+++ b/src/reader/cif/schema.ts
@@ -71,6 +71,7 @@ export namespace Field {
             rowCount: field.rowCount,
             value,
             isValueDefined: row => presence(row) === Data.ValuePresence.Present,
+            stringEquals: field.stringEquals,
             areValuesEqual: field.areValuesEqual,
             toArray
         };
diff --git a/src/reader/cif/text-field.ts b/src/reader/cif/text/field.ts
similarity index 89%
rename from src/reader/cif/text-field.ts
rename to src/reader/cif/text/field.ts
index c67cc8cf7..7f0951fb1 100644
--- a/src/reader/cif/text-field.ts
+++ b/src/reader/cif/text/field.ts
@@ -4,11 +4,11 @@
  * @author David Sehnal <david.sehnal@gmail.com>
  */
 
-import * as Column from '../common/column'
-import * as TokenColumn from '../common/text/column/token'
-import { Tokens } from '../common/text/tokenizer'
-import * as Data from './data-model'
-import { parseInt as fastParseInt, parseFloat as fastParseFloat } from '../common/text/number-parser'
+import * as Column from '../../common/column'
+import * as TokenColumn from '../../common/text/column/token'
+import { Tokens } from '../../common/text/tokenizer'
+import * as Data from '../data-model'
+import { parseInt as fastParseInt, parseFloat as fastParseFloat } from '../../common/text/number-parser'
 
 export default function CifTextField(tokens: Tokens, rowCount: number): Data.Field {
     const { data, indices } = tokens;
diff --git a/src/reader/cif/text-parser.ts b/src/reader/cif/text/parser.ts
similarity index 99%
rename from src/reader/cif/text-parser.ts
rename to src/reader/cif/text/parser.ts
index 4e37ddb56..606fc02f7 100644
--- a/src/reader/cif/text-parser.ts
+++ b/src/reader/cif/text/parser.ts
@@ -22,10 +22,10 @@
  *
  */
 
-import * as Data from './data-model'
-import Field from './text-field'
-import { Tokens, TokenBuilder } from '../common/text/tokenizer'
-import Result from '../result'
+import * as Data from '../data-model'
+import Field from './field'
+import { Tokens, TokenBuilder } from '../../common/text/tokenizer'
+import Result from '../../result'
 
 /**
  * Types of supported mmCIF tokens.
diff --git a/src/reader/common/column.ts b/src/reader/common/column.ts
index 1c27a911e..5f9fb03cd 100644
--- a/src/reader/common/column.ts
+++ b/src/reader/common/column.ts
@@ -27,6 +27,7 @@ export interface Column<T> {
     value(row: number): T,
     isValueDefined(row: number): boolean,
     toArray(params?: ToArrayParams): ReadonlyArray<T>,
+    stringEquals(row: number, value: string): boolean,
     areValuesEqual(rowA: number, rowB: number): boolean
 }
 
@@ -42,7 +43,8 @@ export function UndefinedColumn<T extends ColumnType>(rowCount: number, type: T)
             for (let i = 0, _i = array.length; i < _i; i++) array[i] = value(0)
             return array;
         },
-        areValuesEqual() { return true; }
+        stringEquals(row, value) { return !value; },
+        areValuesEqual(rowA, rowB) { return true; }
     }
 }
 
diff --git a/src/reader/common/text/column/fixed.ts b/src/reader/common/text/column/fixed.ts
index 7caf97e35..84a0f561c 100644
--- a/src/reader/common/text/column/fixed.ts
+++ b/src/reader/common/text/column/fixed.ts
@@ -47,6 +47,7 @@ export function FixedColumn<T extends ColumnType>(lines: Tokens, offset: number,
         value,
         isValueDefined(row) { return true; },
         toArray(params) { return createAndFillArray(rowCount, value, params); },
+        stringEquals(row, v) { return value(row) === v; },
         areValuesEqual(rowA, rowB) {
             return value(rowA) === value(rowB);
         }
diff --git a/src/reader/common/text/column/token.ts b/src/reader/common/text/column/token.ts
index c78ccc794..0c5bb682f 100644
--- a/src/reader/common/text/column/token.ts
+++ b/src/reader/common/text/column/token.ts
@@ -35,6 +35,16 @@ export function TokenColumn<T extends ColumnType>(tokens: Tokens, type: T): Colu
         value,
         isValueDefined(row) { return true; },
         toArray(params) { return createAndFillArray(rowCount, value, params); },
+        stringEquals(row, v) {
+            const s = indices[2 * row];
+            const value = v || '';
+            const len = value.length;
+            if (len !== indices[2 * row + 1] - s) return false;
+            for (let i = 0; i < len; i++) {
+                if (data.charCodeAt(i + s) !== value.charCodeAt(i)) return false;
+            }
+            return true;
+        },
         areValuesEqual: areValuesEqualProvider(tokens)
     };
 }
diff --git a/src/reader/spec/cif.spec.ts b/src/reader/spec/cif.spec.ts
index 8a9cf8277..6e3824bd8 100644
--- a/src/reader/spec/cif.spec.ts
+++ b/src/reader/spec/cif.spec.ts
@@ -5,7 +5,7 @@
  */
 
 import * as Data from '../cif/data-model'
-import TextField from '../cif/text-field'
+import TextField from '../cif/text/field'
 import * as Schema from '../cif/schema'
 
 const columnData = `123abc`;
diff --git a/src/script.ts b/src/script.ts
index 06615a362..0ac94deb9 100644
--- a/src/script.ts
+++ b/src/script.ts
@@ -94,7 +94,7 @@ export function _cif() {
         console.log(atom_site.getField('Cartn_x')!.float(0));
         //console.log(atom_site.getField('label_atom_id')!.toStringArray());
 
-        const mmcif = CIF.applySchema(CIF.schema.mmCIF, data);
+        const mmcif = CIF.schema.mmCIF(data);
         console.log(mmcif.atom_site.Cartn_x.value(0));
         console.log(mmcif.entity.type.toArray());
         console.log(mmcif.pdbx_struct_oper_list.matrix.value(0));
-- 
GitLab