UNPKG

datamodel

Version:

Relational algebra compliant in-memory tabular data store

404 lines (398 loc) 12.9 kB
/* global describe, it */ /* eslint-disable no-unused-expressions */ import { expect } from 'chai'; import { fullOuterJoin, leftOuterJoin, rightOuterJoin } from './outer-join'; import DataModel from '../index' ; import InvalidAwareTypes from '../invalid-aware-types'; describe('Testing Outer Join', () => { const data1 = [ { id: 1, profit: 10, sales: 20, first: 'Hey', second: 'Jude' }, { id: 2, profit: 20, sales: 25, first: 'Hey', second: 'Wood' }, { id: 3, profit: 10, sales: 20, first: 'White', second: 'the sun' }, { id: 4, profit: 15, sales: 25, first: 'White', second: 'walls' }, ]; const data2 = [ { id: 1, netprofit: 10, netsales: 200, _first: 'Hello', _second: 'Jude' }, { id: 4, netprofit: 200, netsales: 250, _first: 'Bollo', _second: 'Wood' }, ]; const schema1 = [ { name: 'id', type: 'dimension' }, { name: 'profit', type: 'measure', defAggFn: 'avg' }, { name: 'sales', type: 'measure' }, { name: 'first', type: 'dimension' }, { name: 'second', type: 'dimension' }, ]; const schema2 = [ { name: 'id', type: 'dimension' }, { name: 'netprofit', type: 'measure', defAggFn: 'avg' }, { name: 'netsales', type: 'measure' }, { name: '_first', type: 'dimension' }, { name: '_second', type: 'dimension' }, ]; const data23 = new DataModel(data1, schema1, { name: 'ModelA' }); const data24 = new DataModel(data2, schema2, { name: 'ModelB' }); describe('#leftOuterJoin', () => { it('should return left join', () => { let expectedResult = { schema: [ { name: 'ModelA.id', type: 'dimension', subtype: 'categorical' }, { name: 'profit', type: 'measure', subtype: 'continuous', defAggFn: 'avg' }, { name: 'sales', type: 'measure', subtype: 'continuous', }, { name: 'first', type: 'dimension', subtype: 'categorical' }, { name: 'second', type: 'dimension', subtype: 'categorical' }, { name: 'ModelB.id', type: 'dimension', subtype: 'categorical' }, { name: 'netprofit', type: 'measure', subtype: 'continuous', defAggFn: 'avg' }, { name: 'netsales', type: 'measure', subtype: 'continuous', }, { name: '_first', type: 'dimension', subtype: 'categorical' }, { name: '_second', type: 'dimension', subtype: 'categorical' } ], data: [ [ '1', 10, 20, 'Hey', 'Jude', '1', 10, 200, 'Hello', 'Jude' ], [ '2', 20, 25, 'Hey', 'Wood', InvalidAwareTypes.NULL, InvalidAwareTypes.NULL, InvalidAwareTypes.NULL, InvalidAwareTypes.NULL, InvalidAwareTypes.NULL ], [ '3', 10, 20, 'White', 'the sun', InvalidAwareTypes.NULL, InvalidAwareTypes.NULL, InvalidAwareTypes.NULL, InvalidAwareTypes.NULL, InvalidAwareTypes.NULL ], [ '4', 15, 25, 'White', 'walls', '4', 200, 250, 'Bollo', 'Wood' ] ], uids: [ 0, 1, 2, 3 ] }; expect(leftOuterJoin(data23, data24, (dmFields1, dmFields2) => dmFields1.id.value === dmFields2.id.value).getData()) .to.deep.equal(expectedResult); }); }); describe('#rightOuterJoin', () => { it('should return right join', () => { let expectedResult = { schema: [ { name: 'ModelB.id', type: 'dimension', subtype: 'categorical' }, { name: 'netprofit', type: 'measure', subtype: 'continuous', defAggFn: 'avg' }, { name: 'netsales', type: 'measure', subtype: 'continuous', }, { name: '_first', type: 'dimension', subtype: 'categorical' }, { name: '_second', type: 'dimension', subtype: 'categorical' }, { name: 'ModelA.id', type: 'dimension', subtype: 'categorical' }, { name: 'profit', type: 'measure', subtype: 'continuous', defAggFn: 'avg' }, { name: 'sales', type: 'measure', subtype: 'continuous', }, { name: 'first', type: 'dimension', subtype: 'categorical' }, { name: 'second', type: 'dimension', subtype: 'categorical' } ], data: [ [ '1', 10, 200, 'Hello', 'Jude', '1', 10, 20, 'Hey', 'Jude' ], [ '4', 200, 250, 'Bollo', 'Wood', '4', 15, 25, 'White', 'walls' ] ], uids: [ 0, 1 ] }; expect(rightOuterJoin(data23, data24, (dmFields1, dmFields2) => dmFields1.id.value === dmFields2.id.value).getData()) .to.deep.equal(expectedResult); }); }); describe('#fullOuterJoin', () => { it('should return full join', () => { let expectedResult = { schema: [ { name: 'ModelA.id', type: 'dimension', subtype: 'categorical' }, { name: 'profit', type: 'measure', subtype: 'continuous', defAggFn: 'avg' }, { name: 'sales', type: 'measure', subtype: 'continuous', }, { name: 'first', type: 'dimension', subtype: 'categorical' }, { name: 'second', type: 'dimension', subtype: 'categorical' }, { name: 'ModelB.id', type: 'dimension', subtype: 'categorical' }, { name: 'netprofit', type: 'measure', subtype: 'continuous', defAggFn: 'avg' }, { name: 'netsales', type: 'measure', subtype: 'continuous', }, { name: '_first', type: 'dimension', subtype: 'categorical' }, { name: '_second', type: 'dimension', subtype: 'categorical' } ], data: [ [ '1', 10, 20, 'Hey', 'Jude', '1', 10, 200, 'Hello', 'Jude' ], [ '2', 20, 25, 'Hey', 'Wood', InvalidAwareTypes.NULL, InvalidAwareTypes.NULL, InvalidAwareTypes.NULL, InvalidAwareTypes.NULL, InvalidAwareTypes.NULL ], [ '3', 10, 20, 'White', 'the sun', InvalidAwareTypes.NULL, InvalidAwareTypes.NULL, InvalidAwareTypes.NULL, InvalidAwareTypes.NULL, InvalidAwareTypes.NULL ], [ '4', 15, 25, 'White', 'walls', '4', 200, 250, 'Bollo', 'Wood' ] ], uids: [ 0, 1, 2, 3 ] }; expect(fullOuterJoin(data23, data24, (dmFields1, dmFields2) => dmFields1.id.value === dmFields2.id.value).getData()) .to.deep.equal(expectedResult); }); }); });