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 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())
|
Loading…
x
Reference in New Issue
Block a user