feat: filter node

This commit is contained in:
root 2020-05-14 22:54:19 -05:00
parent 685678cd91
commit 884c900984
5 changed files with 553912 additions and 1 deletions

36
cli/index.js Normal file
View File

@ -0,0 +1,36 @@
import Table from '../core/entities/Table.js'
import Node from '../core/entities/Node.js'
import FilterNode from '../core/entities/nodes/FilterNode.js'
import testData from './testData.js'
const tableInput = {
id: 'XYZABC',
label: 'SC Total Receipts',
rows: testData
}
let receipts = {}
try {
receipts = new Table(tableInput)
} catch (err) {
console.log(err)
}
let filterNode = {}
try {
filterNode = new FilterNode({
id: 'ERTHJNHBGFDS',
label: 'Filter Node',
tables: receipts,
filterParams: {
siteName: 'Seewee Road DMS',
fieldMonitorUserCertificationNumber: '9YW6ZAY'
}
})
console.log(filterNode.tables[0].getRows().length)
console.log(filterNode.export().length)
} catch (err) {
console.log(err)
}

553712
cli/testData.js Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,55 @@
import Node from '../Node.js'
class FilterNode extends Node {
constructor (props) {
super (props)
this._assignProps(props)
}
addFilter = params => {
const validation = this._validateFilters(params)
if (validation.status === 'ERR') throw validation
else this.filterParams = {...this.filterParams, ...params}
}
export = () => {
let rows = this.tables.map(t => t.getRows() ).flat()
let filters = []
for (let key in this.filterParams) {
const filterMethod = (t) => { return t[key] === this.filterParams[key] }
filters.push(filterMethod)
}
filters.forEach(f => {
rows = rows.filter(f)
})
return rows
}
_assignProps = (props) => {
this.type = 'Filter'
this.filterParams = props.filterParams || []
}
_validateFilters = params => {
const err = {
status: 'ERR',
error: {
label: 'Filter Parameter are not valid',
messages: []
}
}
if (typeof params !== 'object') {
const paramsType = typeof params
err.error.messages.push(`Filter was of type ${paramsType} should be an object`)
}
if (err.error.messages.length > 0) return err
else return { status: 'OK' }
}
}
export default FilterNode

View File

@ -0,0 +1,106 @@
import FilterNode from '../../../core/entities/nodes/FilterNode.js'
import Table from '../../../core/entities/Table.js'
const exportRows = () => {
const expectedOutput = [
{ id: 'abc', data: 'row', contractor: 'AshBritt' },
{ id: 'XYZ', data: 'row', contractor: 'AshBritt' }
]
let table = {}
try {
table = new Table({
id: 'XYZ',
label: 'Test Table',
rows: [
{ id: 'abc', data: 'row', contractor: 'AshBritt' },
{ id: 'qwe', data: 'lh', contractor: 'AshBritt' },
{ id: 'XYZ', data: 'row', contractor: 'AshBritt' },
{ id: 'XYZ', data: 'row', contractor: 'HeyDay' },
]
})
} catch (err) {
return false
}
let filterNode = {}
try {
filterNode = new FilterNode({
id: 'ABC',
label: 'Test Node',
tables: [table],
filterParams: {
data: 'row',
contractor: 'AshBritt'
}
})
} catch (err) {
console.log(err)
return false
}
const filteredRows = filterNode.export()
if (JSON.stringify(filteredRows) === JSON.stringify(expectedOutput)) {
return true
} else {
return false
}
}
const addFilter = () => {
const expectedOutput = [
{ id: 'abc', data: 'row', contractor: 'AshBritt' },
{ id: 'XYZ', data: 'row', contractor: 'AshBritt' }
]
let table = {}
try {
table = new Table({
id: 'XYZ',
label: 'Test Table',
rows: [
{ id: 'abc', data: 'row', contractor: 'AshBritt' },
{ id: 'qwe', data: 'lh', contractor: 'AshBritt' },
{ id: 'XYZ', data: 'row', contractor: 'AshBritt' },
{ id: 'XYZ', data: 'row', contractor: 'HeyDay' },
]
})
} catch (err) {
return false
}
let filterNode = {}
try {
filterNode = new FilterNode({
id: 'ABC',
label: 'Test Node',
tables: [table],
filterParams: {
data: 'row',
}
})
} catch (err) {
console.log(err)
return false
}
try {
filterNode.addFilter({ contractor: 'AshBritt' })
} catch (err) {
console.log(err)
return false
}
const filteredRows = filterNode.export()
if (JSON.stringify(filteredRows) === JSON.stringify(expectedOutput)) {
return true
} else {
return false
}
}
export default [
{ name: 'Entity | FilterNode Export Rows', test: exportRows },
{ name: 'Entity | FilterNode Add Filter', test: addFilter },
]

View File

@ -2,6 +2,7 @@ import ProgressBar from 'progress'
import tableTests from '../tests/core/tableTests.js' import tableTests from '../tests/core/tableTests.js'
import nodeTests from '../tests/core/nodeTests.js' import nodeTests from '../tests/core/nodeTests.js'
import filterNodeTests from '../tests/core/nodes/filterNodeTests.js'
function runTestsAndReturnFailures (tests) { function runTestsAndReturnFailures (tests) {
const testTotalCount = tests.length const testTotalCount = tests.length
@ -37,7 +38,8 @@ function init (tests) {
const testsArray = [ const testsArray = [
tableTests, tableTests,
nodeTests nodeTests,
filterNodeTests
] ]
init (testsArray.flat()) init (testsArray.flat())