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