diff --git a/src/mol-base/collections/_spec/table.spec.ts b/src/mol-base/collections/_spec/table.spec.ts index 35eaacb85e3695341f292e91f6c2444063380ac5..81d1733cc8e5293c86fd9f0628f9114e22b127a0 100644 --- a/src/mol-base/collections/_spec/table.spec.ts +++ b/src/mol-base/collections/_spec/table.spec.ts @@ -83,11 +83,12 @@ describe('table', () => { x: Column.ofArray({ array: [10, -1], type: Column.Type.int }), n: Column.ofArray({ array: ['row1', 'row2'], type: Column.Type.str }), }); - const s = { x: Column.Type.int }; - const picked = Table.pickColumns(s, t); - expect(picked._columns).toEqual(['x']); + const s = { x: Column.Type.int, y: Column.Type.int }; + const picked = Table.pickColumns(s, t, { y: Column.ofArray({ array: [3, 4], type: Column.Type.int })}); + expect(picked._columns).toEqual(['x', 'y']); expect(picked._rowCount).toEqual(2); expect(picked.x.toArray()).toEqual([10, -1]); + expect(picked.y.toArray()).toEqual([3, 4]); }); it('sort', () => { diff --git a/src/mol-base/collections/table.ts b/src/mol-base/collections/table.ts index a7f7aed5af70b183ff39dd91460f0c2ab046b246..087edc66b7f8f054432c0f24d7bc510fac41d6d0 100644 --- a/src/mol-base/collections/table.ts +++ b/src/mol-base/collections/table.ts @@ -15,13 +15,18 @@ namespace Table { export type Columns<S extends Schema> = { [C in keyof S]: Column<S[C]['T']> } export type Row<S extends Schema> = { [C in keyof S]: S[C]['T'] } export type Arrays<S extends Schema> = { [C in keyof S]: ArrayLike<S[C]['T']> } + export type PartialTable<S extends Table.Schema> = { readonly _rowCount: number, readonly _columns: ReadonlyArray<string> } & { [C in keyof S]?: Column<S[C]['T']> } - export function pickColumns<S extends Schema, T extends S>(schema: S, table: Table<T>): Table<S> { + export function pickColumns<S extends Schema>(schema: S, table: PartialTable<S>, guard: Partial<Columns<S>> = {}): Table<S> { const ret = Object.create(null); const keys = Object.keys(schema); ret._rowCount = table._rowCount; ret._columns = keys; - for (const k of keys) ret[k] = table[k]; + for (const k of keys) { + if (!!table[k]) ret[k] = table[k]; + else if (!!guard[k]) ret[k] = guard[k]; + else throw Error(`Cannot find column '${k}'.`); + } return ret; } diff --git a/src/mol-data/model.ts b/src/mol-data/model.ts index 3572e7618c382d3c067b0c5b290c42b9e60f4595..a9e450a0affa6b279eaccead06ddcc39de8eddb2 100644 --- a/src/mol-data/model.ts +++ b/src/mol-data/model.ts @@ -6,7 +6,7 @@ import * as Formats from './model/formats' //import CommonProperties from './model/properties/common' -import HierarchyProperties from './model/properties/hierarchy' +import MacromoleculeTree from './model/properties/macromolecule-tree' import Conformation from './model/properties/conformation' import Segmentation from '../mol-base/collections/integer/segmentation' @@ -23,7 +23,7 @@ interface Model extends Readonly<{ sourceData: Formats.RawData, //common: CommonProperties, - macromolecule: HierarchyProperties, + macromolecule: MacromoleculeTree, conformation: Conformation, // used for diffing. diff --git a/src/mol-data/model/properties/hierarchy.ts b/src/mol-data/model/properties/macromolecule-tree.ts similarity index 95% rename from src/mol-data/model/properties/hierarchy.ts rename to src/mol-data/model/properties/macromolecule-tree.ts index 5d54f59ba5995e11418fcb9add0a4721e72d31d1..73728868eb0acb092fe9c4dc3abb40d6347292d4 100644 --- a/src/mol-data/model/properties/hierarchy.ts +++ b/src/mol-data/model/properties/macromolecule-tree.ts @@ -8,10 +8,10 @@ import Column from '../../../mol-base/collections/column' import Table from '../../../mol-base/collections/table' import { Schema as mmCIF } from '../../../mol-io/reader/cif/schema/mmcif' +const _esCache = Object.create(null); export interface ElementSymbol extends String { '@type': 'element-symbol' } export function ElementSymbol(s: string): ElementSymbol { - // TODO: optimize? - return s.toUpperCase() as any; + return _esCache[s] || (_esCache[s] = s.toUpperCase()); } export const AtomsSchema = {