feat: filter node
This commit is contained in:
parent
685678cd91
commit
884c900984
36
cli/index.js
Normal file
36
cli/index.js
Normal 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
553712
cli/testData.js
Normal file
File diff suppressed because it is too large
Load Diff
55
core/entities/nodes/FilterNode.js
Normal file
55
core/entities/nodes/FilterNode.js
Normal 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
|
106
tests/core/nodes/filterNodeTests.js
Normal file
106
tests/core/nodes/filterNodeTests.js
Normal 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 },
|
||||
]
|
@ -2,6 +2,7 @@ import ProgressBar from 'progress'
|
||||
|
||||
import tableTests from '../tests/core/tableTests.js'
|
||||
import nodeTests from '../tests/core/nodeTests.js'
|
||||
import filterNodeTests from '../tests/core/nodes/filterNodeTests.js'
|
||||
|
||||
function runTestsAndReturnFailures (tests) {
|
||||
const testTotalCount = tests.length
|
||||
@ -37,7 +38,8 @@ function init (tests) {
|
||||
|
||||
const testsArray = [
|
||||
tableTests,
|
||||
nodeTests
|
||||
nodeTests,
|
||||
filterNodeTests
|
||||
]
|
||||
|
||||
init (testsArray.flat())
|
Loading…
x
Reference in New Issue
Block a user