field.ts 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. /**
  2. * Copyright (c) 2017-2018 mol* contributors, licensed under MIT, See LICENSE file for more info.
  3. *
  4. * @author David Sehnal <david.sehnal@gmail.com>
  5. * @author Alexander Rose <alexander.rose@weirdbyte.de>
  6. */
  7. import { Column, ColumnHelpers } from 'mol-data/db'
  8. import * as Data from '../data-model'
  9. import { EncodedColumn, decode } from '../../../common/binary-cif'
  10. import { parseInt as fastParseInt, parseFloat as fastParseFloat } from '../../common/text/number-parser'
  11. export default function Field(column: EncodedColumn): Data.Field {
  12. const mask = column.mask ? decode(column.mask) as number[] : void 0;
  13. const data = decode(column.data);
  14. const isNumeric = ColumnHelpers.isTypedArray(data);
  15. const str: Data.Field['str'] = isNumeric
  16. ? mask
  17. ? row => mask[row] === Column.ValueKind.Present ? '' + data[row] : ''
  18. : row => '' + data[row]
  19. : mask
  20. ? row => mask[row] === Column.ValueKind.Present ? data[row] : ''
  21. : row => data[row];
  22. const int: Data.Field['int'] = isNumeric
  23. ? row => data[row]
  24. : row => { const v = data[row]; return fastParseInt(v, 0, v.length); };
  25. const float: Data.Field['float'] = isNumeric
  26. ? row => data[row]
  27. : row => { const v = data[row]; return fastParseFloat(v, 0, v.length); };
  28. const list: Data.Field['list'] = mask
  29. ? row => mask[row] === Column.ValueKind.Present ? data[row] : []
  30. : row => data[row];
  31. const valueKind: Data.Field['valueKind'] = mask
  32. ? row => mask[row]
  33. : row => Column.ValueKind.Present;
  34. const rowCount = data.length;
  35. return {
  36. '@array': data,
  37. isDefined: true,
  38. rowCount,
  39. str,
  40. int,
  41. float,
  42. list,
  43. valueKind,
  44. areValuesEqual: (rowA, rowB) => data[rowA] === data[rowB],
  45. toStringArray: params => ColumnHelpers.createAndFillArray(rowCount, str, params),
  46. toIntArray: isNumeric
  47. ? params => ColumnHelpers.typedArrayWindow(data, params)
  48. : params => ColumnHelpers.createAndFillArray(rowCount, int, params),
  49. toFloatArray: isNumeric
  50. ? params => ColumnHelpers.typedArrayWindow(data, params)
  51. : params => ColumnHelpers.createAndFillArray(rowCount, float, params),
  52. toListArray: params => ColumnHelpers.createAndFillArray(rowCount, list, params)
  53. };
  54. }