Ver Fonte

CifField creation optimizations

Alexander Rose há 5 anos atrás
pai
commit
60ba0de219
2 ficheiros alterados com 17 adições e 8 exclusões
  1. 3 2
      src/mol-data/db/column.ts
  2. 14 6
      src/mol-io/reader/cif/data-model.ts

+ 3 - 2
src/mol-data/db/column.ts

@@ -73,6 +73,7 @@ namespace Column {
         rowCount: number,
         schema: T,
         valueKind?: (row: number) => ValueKind,
+        areValuesEqual?: (rowA: number, rowB: number) => boolean
     }
 
     export interface ArraySpec<T extends Schema> {
@@ -247,7 +248,7 @@ function constColumn<T extends Column.Schema>(v: T['T'], rowCount: number, schem
     }
 }
 
-function lambdaColumn<T extends Column.Schema>({ value, valueKind, rowCount, schema }: Column.LambdaSpec<T>): Column<T['T']> {
+function lambdaColumn<T extends Column.Schema>({ value, valueKind, areValuesEqual, rowCount, schema }: Column.LambdaSpec<T>): Column<T['T']> {
     return {
         schema: schema,
         __array: void 0,
@@ -260,7 +261,7 @@ function lambdaColumn<T extends Column.Schema>({ value, valueKind, rowCount, sch
             for (let i = 0, _i = array.length; i < _i; i++) array[i] = value(i + start);
             return array;
         },
-        areValuesEqual: (rowA, rowB) => value(rowA) === value(rowB)
+        areValuesEqual: areValuesEqual ? areValuesEqual : (rowA, rowB) => value(rowA) === value(rowB)
     }
 }
 

+ 14 - 6
src/mol-io/reader/cif/data-model.ts

@@ -134,7 +134,7 @@ export namespace CifField {
             float,
             valueKind,
             areValuesEqual: (rowA, rowB) => values[rowA] === values[rowB],
-            toStringArray: params => ColumnHelpers.createAndFillArray(rowCount, str, params),
+            toStringArray: params => params ? ColumnHelpers.createAndFillArray(rowCount, str, params) : values as string[],
             toIntArray: params => ColumnHelpers.createAndFillArray(rowCount, int, params),
             toFloatArray: params => ColumnHelpers.createAndFillArray(rowCount, float, params)
         }
@@ -146,6 +146,14 @@ export namespace CifField {
         const float: CifField['float'] = row => values[row];
         const valueKind: CifField['valueKind'] = row => Column.ValueKind.Present;
 
+        const toFloatArray = (params: Column.ToArrayParams<number>) => {
+            if (!params || params.array && values instanceof params.array) {
+                return values as number[]
+            } else {
+                return ColumnHelpers.createAndFillArray(rowCount, float, params)
+            }
+        }
+
         return {
             __array: void 0,
             binaryEncoding: void 0,
@@ -157,8 +165,8 @@ export namespace CifField {
             valueKind,
             areValuesEqual: (rowA, rowB) => values[rowA] === values[rowB],
             toStringArray: params => ColumnHelpers.createAndFillArray(rowCount, str, params),
-            toIntArray: params => ColumnHelpers.createAndFillArray(rowCount, float, params),
-            toFloatArray: params => ColumnHelpers.createAndFillArray(rowCount, float, params)
+            toIntArray: toFloatArray,
+            toFloatArray
         }
     }
 
@@ -216,11 +224,11 @@ export namespace CifField {
             case 'float':
             case 'int':
                 str = row => { return '' + column.value(row); };
-                int = row => column.value(row);
-                float = row => column.value(row);
+                int = column.value;
+                float = column.value;
                 break
             case 'str':
-                str = row => column.value(row);
+                str = column.value;
                 int = row => { const v = column.value(row); return fastParseInt(v, 0, v.length) || 0; };
                 float = row => { const v = column.value(row); return fastParseFloat(v, 0, v.length) || 0; };
                 break