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