From 5a874967284459f88fc9759bdffb0ba6906abb5a Mon Sep 17 00:00:00 2001
From: Alexander Rose <alex.rose@rcsb.org>
Date: Thu, 15 Mar 2018 19:21:14 -0700
Subject: [PATCH] added Column.copyToArray and Table.concat helpers

---
 src/mol-data/db.ts        |  2 +-
 src/mol-data/db/column.ts | 13 +++++++++++++
 src/mol-data/db/table.ts  | 26 ++++++++++++++++++++++++++
 src/mol-io/writer/cif.ts  |  2 +-
 4 files changed, 41 insertions(+), 2 deletions(-)

diff --git a/src/mol-data/db.ts b/src/mol-data/db.ts
index 8ae56bde7..e783dac4f 100644
--- a/src/mol-data/db.ts
+++ b/src/mol-data/db.ts
@@ -10,6 +10,6 @@ import Table from './db/table'
 import Column from './db/column'
 import * as ColumnHelpers from './db/column-helpers'
 
-type DatabaseCollection = { [name: string]: Database<Database.Schema> }
+type DatabaseCollection<T extends Database.Schema> = { [name: string]: Database<T> }
 
 export { DatabaseCollection, Database, Table, Column, ColumnHelpers }
\ No newline at end of file
diff --git a/src/mol-data/db/column.ts b/src/mol-data/db/column.ts
index af668d4f5..163cdcb3e 100644
--- a/src/mol-data/db/column.ts
+++ b/src/mol-data/db/column.ts
@@ -150,6 +150,19 @@ namespace Column {
         if (!c.isDefined) return Undefined(c.rowCount, c.schema) as any as Column<T>;
         return arrayColumn({ array: c.toArray({ array }), schema: c.schema, valueKind: c.valueKind });
     }
+
+    export function copyToArray<T>(c: Column<T>, array: ArrayLike<T>, offset = 0) {
+        if (!c.isDefined) return;
+        const cArray = c['@array']
+        if (cArray) {
+            // TODO Index signature of 'ArrayLike<T>' only permits reading
+            for (let i = 0, _i = cArray.length; i < _i; i++) (array[offset + i] as any) = cArray[i];
+        } else {
+            // TODO Index signature of 'ArrayLike<T>' only permits reading
+            for (let i = 0, _i = c.rowCount; i < _i; i++) (array[offset + i] as any) = c.value(i);
+        }
+
+    }
 }
 
 export default Column;
diff --git a/src/mol-data/db/table.ts b/src/mol-data/db/table.ts
index 222d71d2e..cac162233 100644
--- a/src/mol-data/db/table.ts
+++ b/src/mol-data/db/table.ts
@@ -100,6 +100,32 @@ namespace Table {
         return ret as Table<R>;
     }
 
+    export function concat<S extends R, R extends Schema>(tables: Table<S>[], schema: R) {
+        const ret = Object.create(null);
+        const columns = Object.keys(schema);
+        ret._rowCount = 0
+        for (const table of tables) {
+            ret._rowCount += table._rowCount
+        }
+        const arrays: any = {}
+        for (const column of columns) {
+            arrays[column] = new Array(ret._rowCount)
+        }
+        ret._columns = columns;
+        ret._schema = schema;
+        let offset = 0
+        for (const table of tables) {
+            for (const k of columns) {
+                Column.copyToArray(table[k], arrays[k], offset)
+            }
+            offset += table._rowCount
+        }
+        for (const k of columns) {
+            ret[k] = Column.ofArray({ array: arrays[k], schema: schema[k] })
+        }
+        return ret as Table<R>;
+    }
+
     export function columnToArray<S extends Schema>(table: Table<S>, name: keyof S, array?: Column.ArrayCtor<any>) {
         (table as Columns<S>)[name] = Column.asArrayColumn((table as Columns<S>)[name], array);
     }
diff --git a/src/mol-io/writer/cif.ts b/src/mol-io/writer/cif.ts
index 36c5128fd..10438f5d6 100644
--- a/src/mol-io/writer/cif.ts
+++ b/src/mol-io/writer/cif.ts
@@ -29,7 +29,7 @@ export function writeDatabase(encoder: CIFEncoder, name: string, database: Datab
     }
 }
 
-export function writeDatabaseCollection(encoder: CIFEncoder, collection: DatabaseCollection) {
+export function writeDatabaseCollection(encoder: CIFEncoder, collection: DatabaseCollection<Database.Schema>) {
     for (const name of Object.keys(collection)) {
         writeDatabase(encoder, name, collection[name])
     }
-- 
GitLab