From bf82d822de07eb94d4aa288e120953d3b72d8fe1 Mon Sep 17 00:00:00 2001 From: gowtham Date: Thu, 30 Jan 2020 10:41:32 +0530 Subject: [PATCH 01/24] Added additional property in DecisionTable --- common/models/decision-table.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/common/models/decision-table.json b/common/models/decision-table.json index 18a901d..e1f09bc 100644 --- a/common/models/decision-table.json +++ b/common/models/decision-table.json @@ -29,6 +29,10 @@ "documentName" : { "type" : "string", "description" : "Name of the file uploaded" + }, + "dtDesignerData":{ + "type":"object", + "description":"Decision Table JSON used by the rule-designer" } }, "oeValidations": [], From b1e15ceb76573a0709243ee1fb2d5b54b135dbb5 Mon Sep 17 00:00:00 2001 From: gowtham Date: Thu, 30 Jan 2020 14:59:57 +0530 Subject: [PATCH 02/24] Removed decisionRules property from hidden fields. --- common/models/decision-table.json | 2 +- test/decision-table-tests.spec.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/common/models/decision-table.json b/common/models/decision-table.json index e1f09bc..61eb9b1 100644 --- a/common/models/decision-table.json +++ b/common/models/decision-table.json @@ -39,7 +39,7 @@ "validations": [], "acls": [], "methods": {}, - "hidden": ["decisionRules", "documentData", "documentName"], + "hidden": ["documentData", "documentName"], "mixins" : { "VersionMixin" : true } diff --git a/test/decision-table-tests.spec.js b/test/decision-table-tests.spec.js index 51540ad..6c2cc19 100644 --- a/test/decision-table-tests.spec.js +++ b/test/decision-table-tests.spec.js @@ -118,7 +118,7 @@ describe('DecisionTable Model Tests', () => { // expect('length' in results).to.equal.true; // console.log(results.length) expect(results.length >= 1, 'no items in the returned data').to.be.true; - var nonExpectantFields = ['decisionRules', 'documentName', 'documentData']; + var nonExpectantFields = ['documentName', 'documentData']; results.forEach(item => { nonExpectantFields.forEach(field => expect(item.__data, `Object has "${field}" as property`).to.have.property(field)); }); @@ -166,7 +166,7 @@ describe('DecisionTable Model Tests', () => { var getResponse = JSON.parse(data2); // console.log('getResponse:', getResponse); getResponse.forEach(item => { - expect(item).to.not.have.property('decisionRules'); + // expect(item).to.not.have.property('decisionRules'); expect(item).to.not.have.property('documentData'); expect(item).to.not.have.property('documentName'); }); From a70ce1c6682a74010fbd881bf59c3a10808a8be9 Mon Sep 17 00:00:00 2001 From: gowtham Date: Fri, 31 Jan 2020 13:57:09 +0530 Subject: [PATCH 03/24] Fixed missing parameter for remote methods --- common/models/decision-graph.js | 5 +++++ common/models/decision-table.js | 10 ++++++++++ 2 files changed, 15 insertions(+) diff --git a/common/models/decision-graph.js b/common/models/decision-graph.js index bad50f5..59b7ad9 100644 --- a/common/models/decision-graph.js +++ b/common/models/decision-graph.js @@ -87,6 +87,11 @@ module.exports = function (DecisionGraph) { accepts: [{ arg: 'inputData', type: 'object', http: { source: 'body' }, required: true, description: 'The JSON containing the graph node data to validate' + }, + { + arg: 'options', + type: 'object', + http: 'optionsFromRequest' } ], http: { diff --git a/common/models/decision-table.js b/common/models/decision-table.js index c3ef187..6b02958 100644 --- a/common/models/decision-table.js +++ b/common/models/decision-table.js @@ -191,6 +191,11 @@ module.exports = function decisionTableFn(decisionTable) { source: 'path' }, description: 'record id of the corresponding decision or rule name' + }, + { + arg: 'options', + type: 'object', + http: 'optionsFromRequest' } ], http: { @@ -211,6 +216,11 @@ module.exports = function decisionTableFn(decisionTable) { accepts: [{ arg: 'inputData', type: 'object', http: { source: 'body' }, required: true, description: 'The JSON containing the document data to parse' + }, + { + arg: 'options', + type: 'object', + http: 'optionsFromRequest' } ], http: { From fd9cd6c439b6e79e7bbe56d879f45b73b5ca416d Mon Sep 17 00:00:00 2001 From: Arshad11 Date: Tue, 4 Feb 2020 14:46:35 +0530 Subject: [PATCH 04/24] handling of wrong service name in decision-service --- common/models/decision-service.js | 8 +++++++- test/decision-service-tests.spec.js | 31 +++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/common/models/decision-service.js b/common/models/decision-service.js index 01d0b55..70a81b1 100644 --- a/common/models/decision-service.js +++ b/common/models/decision-service.js @@ -100,7 +100,7 @@ module.exports = function (DecisionService) { DecisionService.findOne({ where: { name: name } }, options, (err, result) => { if (err) { cb(err); - } else { + } else if (result) { var decisions = result.decisions; result['decision-graph'](options, (err, graph) => { if (err) { @@ -130,6 +130,12 @@ module.exports = function (DecisionService) { .catch(cb); } }); + } else { + var err1 = new Error( + 'No Service found for ServiceName ' + name + ); + err1.retriable = false; + cb(err1); } }); }; diff --git a/test/decision-service-tests.spec.js b/test/decision-service-tests.spec.js index 9c297ae..326d183 100644 --- a/test/decision-service-tests.spec.js +++ b/test/decision-service-tests.spec.js @@ -77,6 +77,37 @@ describe('DecisionService Model Tests', () => { }); }); + it('should fail when you invoke a service with a wrong service name', function (done) { + var payload = { + 'Applicant data': { + Age: 51, + MaritalStatus: 'M', + EmploymentStatus: 'EMPLOYED', + 'ExistingCustomer': false, + 'Monthly': { + 'Income': 10000, + 'Repayments': 2500, + 'Expenses': 3000 + } + }, + 'Requested product': { + ProductType: 'STANDARD LOAN', + Rate: 0.08, + Term: 36, + Amount: 100000 + }, + 'Bureau data': { + Bankrupt: false, + CreditScore: 600 + } + }; + DecisionService.invoke('wrongService', payload, testContext, function(err) { + expect(err).to.exist; + expect(err.message).to.equal('No Service found for ServiceName wrongService') + done(); + }); + }); + it('should invoke a service and give the correct result', function (done) { var payload = { 'Applicant data': { From f9c4d3d4f7da2c920937075c6fa8aaf7fc01d891 Mon Sep 17 00:00:00 2001 From: Sumeet Date: Tue, 18 Feb 2020 18:06:35 +0530 Subject: [PATCH 05/24] Added Decision Tree Model --- common/models/decision-tree.js | 230 +++++++++++++++++++++++ common/models/decision-tree.json | 40 ++++ server/model-config.json | 4 + test/decision-tree-tests.spec.js | 153 +++++++++++++++ test/test-data/DecisionTableData.json | 260 ++++++++++++++++++++++++++ test/test-data/DecisionTreeData.json | 61 ++++++ 6 files changed, 748 insertions(+) create mode 100644 common/models/decision-tree.js create mode 100644 common/models/decision-tree.json create mode 100644 test/decision-tree-tests.spec.js create mode 100644 test/test-data/DecisionTableData.json create mode 100644 test/test-data/DecisionTreeData.json diff --git a/common/models/decision-tree.js b/common/models/decision-tree.js new file mode 100644 index 0000000..8a8bc2e --- /dev/null +++ b/common/models/decision-tree.js @@ -0,0 +1,230 @@ +/** + * + * ©2016-2017 EdgeVerve Systems Limited (a fully owned Infosys subsidiary), + * Bangalore, India. All Rights Reserved. + * + */ + +var logger = require('oe-logger'); +var assert = require('assert'); +var log = logger('decision-tree'); +var util = require('util'); +var loopback = require('loopback'); +const vm = require('vm'); + + +module.exports = function (decisionTree) { + + decisionTree.observe('before save', function decisionTreeBeforeSave(ctx, next) { + var data = ctx.__data || ctx.instance || ctx.data; + try { + var decisionTreeConnectionArray = JSON.parse(JSON.stringify(data.connections)); + var from_array = []; + var to_array = []; + + decisionTreeConnectionArray.forEach(function (item) { + from_array.push(item.from); + to_array.push(item.to); + }); + + for (var i in from_array) { + if (!to_array.includes(from_array[i])) { + data.rootNodeId = from_array[i]; + } + } + next(); + + } catch (err) { + log.error(ctx.options, 'Error - Unable to process decision tree data -', err); + next(new Error('Decision tree data provided could not be parsed, please provide proper data')); + } + }); + + decisionTree.remoteMethod('exec', { + description: 'execute a business rule', + accessType: 'WRITE', + accepts: [ + { + arg: 'name', + type: 'string', + required: true, + http: { + source: 'path' + }, + description: 'Name of the Decision Tree to be fetched from db for rule engine' + }, + { + arg: 'data', + type: 'object', + required: true, + http: { + source: 'body' + }, + description: 'An object on which business rules should be applied' + }, + { + arg: 'options', + type: 'object', + http: 'optionsFromRequest' + } + ], + http: { + verb: 'post', + path: '/exec/:name' + }, + returns: { + arg: 'data', + type: 'object', + root: true + } + }); + + decisionTree.exec = function decisionTreeExec( + name, + data, + options, + callback + ) { + // var businessRuleEngine = 'evBusinessRule'; + if (typeof callback === 'undefined') { + if (typeof options === 'function') { + // execrule (documentName, data, callback) + callback = options; + options = {}; + } + } + + data = data || {}; + options = options || {}; + callback = callback || utils.createPromiseCallback(); + + assert( + typeof name === 'string', + 'The decision tree name argument must be string' + ); + assert( + typeof data === 'object', + 'The data argument must be an object or array' + ); + assert( + typeof options === 'object', + 'The options argument must be an object' + ); + assert( + typeof callback === 'function', + 'The callback argument must be a function' + ); + + decisionTree.find( + { + where: { + name: name + } + }, + options, + function decisionTreeFind(err, decisionTreeData) { + if (err) { + callback(err); + } else if (decisionTreeData.length) { + var root = ''; + var nodes = []; + var connections = []; + + if (decisionTreeData[0].rootNodeId !== null) { + root = decisionTreeData[0].rootNodeId; + } + if (decisionTreeData[0].nodes !== null) { + nodes = decisionTreeData[0].nodes; + } + if (decisionTreeData[0].connections !== null) { + connections = decisionTreeData[0].connections; + } + traverseDecisionTree(root, nodes, connections, data, {}, options, callback); + + } else { + var err1 = new Error( + 'No Name found for Tree Name ' + name + ); + err1.retriable = false; + callback(err1); + } + } + ); + }; + + + + + function traverseDecisionTree(root, nodes, connections, payload, result, options, done) { + var updatedPayload = {}; + for (var k in nodes) { + var ob = nodes[k]; + + if (ob.id === root) { + var rootName = ob.name; + if (ob.nodeType !== 'DECISION_TABLE') { + updatedPayload = payload; + for (var i in connections) { + + var obj = connections[i]; + if (root === obj.from) { + if (obj.condition === "" || obj.condition === null) { + return traverseDecisionTree(obj.to, nodes, connections, updatedPayload, result, options, done); + } + else { + var isValid = evaluateCondition(updatedPayload, obj.condition); + if (isValid) { + + return traverseDecisionTree(obj.to, nodes, connections, updatedPayload, result, options, done); + } + } + } + } + } + else + if (ob.nodeType === 'DECISION_TABLE') { + var DecisionTreeModel = loopback.getModel('DecisionTable', options); + DecisionTreeModel.exec(rootName, payload, options, function (err, res) { + if (err) { + log.error(options, err.message); + } + updatedPayload = Object.assign(payload, res); + result = Object.assign(result, res); + + for (var i in connections) { + var obj = connections[i]; + if (root === obj.from) { + if (obj.condition === "" || obj.condition === null) { + + return traverseDecisionTree(obj.to, nodes, connections, updatedPayload, result, options, done); + } + else { + var isValid = evaluateCondition(updatedPayload, obj.condition); + if (isValid) { + return traverseDecisionTree(obj.to, nodes, connections, updatedPayload, result, options, done); + } + } + } + } + + return done(null, result); + }); + } + } + } + } + + function evaluateCondition(payload, condition) { + + /* var sandbox = { + payload: payload + };*/ + var sandbox = payload; + var context = new vm.createContext(sandbox); + var compiledScript = new vm.Script("this.output = (" + condition + ");"); + compiledScript.runInContext(context); + return context.output; + + } + +}; diff --git a/common/models/decision-tree.json b/common/models/decision-tree.json new file mode 100644 index 0000000..eef9f72 --- /dev/null +++ b/common/models/decision-tree.json @@ -0,0 +1,40 @@ +{ + "name": "DecisionTree", + "base": "BaseEntity", + "description": "This model is used for storing decision tree", + "options": { + "validateUpsert": true, + "isFrameworkModel": true + }, + "properties": { + "name": { + "type": "string", + "required": true, + "unique": true, + "id": true + }, + "nodes": { + "type": ["object"], + "description": "Decision Tree Nodes", + "required" : false + }, + "connections": { + "type": ["object"], + "description": "Decision Tree Connections", + "required" : false + }, + "rootNodeId": { + "type": "string", + "description": "Root Node id of decision tree" + } + }, + "oeValidations": [], + "validations": [], + "acls": [], + "methods": {}, + "hidden": ["rootNodeId"], + "mixins" : { + "VersionMixin" : false + } + +} \ No newline at end of file diff --git a/server/model-config.json b/server/model-config.json index 5589a0a..e579a3c 100644 --- a/server/model-config.json +++ b/server/model-config.json @@ -19,5 +19,9 @@ "EnrichmentRule" : { "public": true, "dataSource" : "db" + }, + "DecisionTree": { + "public": true, + "dataSource": "db" } } diff --git a/test/decision-tree-tests.spec.js b/test/decision-tree-tests.spec.js new file mode 100644 index 0000000..58669a6 --- /dev/null +++ b/test/decision-tree-tests.spec.js @@ -0,0 +1,153 @@ +var chai = require('chai'); +chai.use(require('chai-things')); +var loopback = require('loopback'); +var expect = chai.expect; +var fs = require('fs'); +var path = require('path'); +var bootstrapped = require('./bootstrapper'); +var http = require('http'); +var clone = require('deepcopy'); + +var decisionTableData = require('./test-data/DecisionTableData.json'); +var decisionTreeData = require('./test-data/DecisionTreeData.json'); + + +var payload_1 = { + "userName":"user1", + "amount": 3000, + "type":"PERSONAL_LOAN", + "experience" : 5 , + "monthlyIncome":1000 +} + +var payload_2 = { + "userName":"user2", + "amount": 3000, + "type":"PERSONAL_LOAN", + "experience" : 5 , + "totalOtherIncome":100, + "monthlyIncome":100, + "employmentType":"FULL_TIME" + +} + + +describe('DecisionTree Model Tests', () => { + var DecisionTree; + var BaseUser; + var testContext = { + ctx: { + tenantId: 'test-tenant' + } + }; + + before('wait for boot', function (done) { + // this.timeout(8000) + bootstrapped.then(() => { + DecisionTree = loopback.findModel('DecisionTree'); + DecisionTable = loopback.findModel('DecisionTable'); + + expect(DecisionTable).to.not.be.undefined; + expect(DecisionTree).to.not.be.undefined; + done(); + }) + .catch(done); + }); + + it('should insert a decision table json directly', function (done) { + + DecisionTable.create(decisionTableData, testContext, (err) => { + if (err) { + done(err); + } else { + done(); + } + }); + }); + + it('should insert a decision tree json directly', function (done) { + + DecisionTree.create(decisionTreeData, testContext, (err) => { + if (err) { + done(err); + } else { + done(); + } + }); + }); + + it('should assert that a find() operation should fetch properties which are hidden', done => { + DecisionTree.find({}, testContext, (err, results) => { + if (err) { + done(err); + } else { + expect(Array.isArray(results)).to.equal.true; + expect(results.length >= 1, 'no items in the returned data').to.be.true; + + var nonExpectantFields = ['rootNodeId']; + results.forEach(item => { + nonExpectantFields.forEach(field => expect(item.__data, `Object has "${field}" as property`).to.have.property(field)); + }); + done(); + } + }); + }); + + it('should check for correct root node result', done => { + DecisionTree.find({}, testContext, (err, results) => { + if (err) { + done(err); + } else { + expect(Array.isArray(results)).to.equal.true; + expect(results.length >= 1).to.be.true; + expect(results[0].rootNodeId).to.eql('n-rkljn4byr'); + done(); + } + }); + }); + + + it('should execute a decision tree and give the correct result for payload_1', function (done) { + + DecisionTree.exec('TestTree', payload_1, testContext, (err, result) => { + if (err) { + done(err); + } else { + expect(result).to.eql({ + "location": "US", + "preApproved": false, + "eligibility": 3000 + }); + done(); + } + }); + }); + + + it('should execute a decision tree and give the correct result for payload_2', function (done) { + + DecisionTree.exec('TestTree', payload_2, testContext, (err, result) => { + if (err) { + done(err); + } else { + expect(result).to.eql({ + "location": "FR", + "preApproved": false, + "eligibility": 800 + }); + done(); + } + }); + }); + + it('Should fail to execute decision tree as decision tree data is not proper', function (done) { + DecisionTree.exec('invalidDecisionTreeName', {}, testContext, function (err, res) { + expect(err).not.to.be.undefined; + expect(err.message).to.equal('No Name found for Tree Name invalidDecisionTreeName'); + done(); + }); + }); + + + +}); \ No newline at end of file diff --git a/test/test-data/DecisionTableData.json b/test/test-data/DecisionTableData.json new file mode 100644 index 0000000..eaf47e1 --- /dev/null +++ b/test/test-data/DecisionTableData.json @@ -0,0 +1,260 @@ +[ + { + "name": "eligibility_USA", + "decisionRules": "{\"inputExpressionList\":[\"amount\",\"type\",\"experience\"],\"outputs\":[\"eligibility\",\"preApproved\"],\"hitPolicy\":\"F\",\"ruleList\":[[\"<= 1000\",\"\\\"PERSONAL_LOAN\\\"\",\"> 6\",\"amount\",\"TRUE\"],[\"<=1000\",\"\\\"PERSONAL_LOAN\\\"\",\"-\",\"if amount < (monthlyIncome*6) then amount else (monthlyIncome*6)\",\"FALSE\"],[\"> 1000\",\"\\\"PERSONAL_LOAN\\\"\",\"-\",\"if amount < (monthlyIncome*6) then amount else (monthlyIncome*6)\",\"FALSE\"],[\"-\",\"\\\"HOME_LOAN\\\"\",\"-\",\"if amount < (monthlyIncome*72) then amount else (monthlyIncome*72)\",\"FALSE\"],[\"-\",\"\\\"CAR_LOAN\\\"\",\"-\",\"if amount < (monthlyIncome*12) then amount else (monthlyIncome*12)\",\"FALSE\"]],\"inputValues\":[\"<= 1000,<=1000,> 1000,-\",\"\\\"PERSONAL_LOAN\\\",\\\"HOME_LOAN\\\",\\\"CAR_LOAN\\\"\",\"> 6,-\"],\"outputValues\":[\"amount,if amount < (monthlyIncome*6) then amount else (monthlyIncome*6),if amount < (monthlyIncome*72) then amount else (monthlyIncome*72),if amount < (monthlyIncome*12) then amount else (monthlyIncome*12)\",\"TRUE,FALSE\"],\"context\":null}", + "dtDesignerData": { + "name": "", + "inputExpressionList": [ + { + "label": "amount", + "expr": "amount", + "type": "string", + "values": "<= 1000,<=1000,> 1000,-" + }, + { + "label": "type", + "expr": "type", + "type": "string", + "values": "\"PERSONAL_LOAN\",\"HOME_LOAN\",\"CAR_LOAN\"" + }, + { + "label": "experience", + "expr": "experience", + "type": "string", + "values": "> 6,-" + } + ], + "outputs": [ + { + "label": "eligibility", + "expr": "eligibility", + "type": "string", + "values": "amount,if amount < (monthlyIncome*6) then amount else (monthlyIncome*6),if amount < (monthlyIncome*72) then amount else (monthlyIncome*72),if amount < (monthlyIncome*12) then amount else (monthlyIncome*12)" + }, + { + "label": "preApproved", + "expr": "preApproved", + "type": "string", + "values": "TRUE,FALSE" + } + ], + "hitPolicy": "F", + "ruleList": [ + [ + "<= 1000", + "\"PERSONAL_LOAN\"", + "> 6", + "amount", + "TRUE" + ], + [ + "<=1000", + "\"PERSONAL_LOAN\"", + "-", + "if amount < (monthlyIncome*6) then amount else (monthlyIncome*6)", + "FALSE" + ], + [ + "> 1000", + "\"PERSONAL_LOAN\"", + "-", + "if amount < (monthlyIncome*6) then amount else (monthlyIncome*6)", + "FALSE" + ], + [ + "-", + "\"HOME_LOAN\"", + "-", + "if amount < (monthlyIncome*72) then amount else (monthlyIncome*72)", + "FALSE" + ], + [ + "-", + "\"CAR_LOAN\"", + "-", + "if amount < (monthlyIncome*12) then amount else (monthlyIncome*12)", + "FALSE" + ] + ] + }, + "id": "5e32af1955bfd8ff5423a44a", + "_version": "9be0913d-f095-4421-a547-62b0c1487241" + }, + { + "name": "eligibility_FR", + "decisionRules": "{\"inputExpressionList\":[\"amount\",\"type\",\"experience\",\"employmentType\"],\"outputs\":[\"eligibility\",\"preApproved\"],\"hitPolicy\":\"F\",\"ruleList\":[[\"<= 2000\",\"\\\"PERSONAL_LOAN\\\"\",\"> 6\",\"\\\"FULL_TIME\\\"\",\"amount\",\"TRUE\"],[\"<=2000\",\"\\\"PERSONAL_LOAN\\\"\",\"-\",\"\\\"FULL_TIME\\\"\",\"if amount < (monthlyIncome*6 + totalOtherIncome*2) then amount else (monthlyIncome*6 + totalOtherIncome*2)\",\"FALSE\"],[\"> 2000\",\"\\\"PERSONAL_LOAN\\\"\",\"-\",\"\\\"FULL_TIME\\\"\",\"if amount < (monthlyIncome*6 + totalOtherIncome*2) then amount else (monthlyIncome*6 + totalOtherIncome*2)\",\"FALSE\"],[\"-\",\"\\\"PERSONAL_LOAN\\\"\",\"-\",\"\\\"PART_TIME\\\"\",\"if amount < (monthlyIncome*2 + totalOtherIncome*2) then amount else (monthlyIncome*2 + totalOtherIncome*2)\",\"FALSE\"],[\"-\",\"\\\"PERSONAL_LOAN\\\"\",\"-\",\"\\\"SELF_EMPLOYED\\\"\",\"if amount < (monthlyIncome + totalOtherIncome*2) then amount else (monthlyIncome + totalOtherIncome*2)\",\"FALSE\"],[\"-\",\"\\\"CAR_LOAN\\\"\",\"-\",\"\\\"FULL_TIME\\\"\",\"if amount < 6*(monthlyIncome*6 + totalOtherIncome*2) then amount else 6*(monthlyIncome*6 + totalOtherIncome*2)\",\"FALSE\"],[\"-\",\"\\\"CAR_LOAN\\\"\",\"-\",\"\\\"PART_TIME\\\"\",\"if amount < 6*(monthlyIncome*4 + totalOtherIncome*2) then amount else 6*(monthlyIncome*4 + totalOtherIncome*2)\",\"FALSE\"],[\"-\",\"\\\"CAR_LOAN\\\"\",\"-\",\"\\\"SELF_EMPLOYED\\\"\",\"if amount < 6*(monthlyIncome*2 + totalOtherIncome*2) then amount else 6*(monthlyIncome*2 + totalOtherIncome*2)\",\"FALSE\"],[\"-\",\"\\\"HOME_LOAN\\\"\",\"-\",\"\\\"FULL_TIME\\\"\",\"if amount < 12*(monthlyIncome*6 + totalOtherIncome*2) then amount else 12*(monthlyIncome*6 + totalOtherIncome*2)\",\"FALSE\"],[\"-\",\"\\\"HOME_LOAN\\\"\",\"-\",\"\\\"PART_TIME\\\"\",\"if amount < 12*(monthlyIncome*4 + totalOtherIncome*2) then amount else 12*(monthlyIncome*4 + totalOtherIncome*2)\",\"FALSE\"],[\"-\",\"\\\"HOME_LOAN\\\"\",\"-\",\"\\\"SELF_EMPLOYED\\\"\",\"if amount < 12*(monthlyIncome*2 + totalOtherIncome*2) then amount else 12*(monthlyIncome*2 + totalOtherIncome*2)\",\"FALSE\"]],\"inputValues\":[\"<= 2000,<=2000,> 2000,-\",\"\\\"PERSONAL_LOAN\\\",\\\"CAR_LOAN\\\",\\\"HOME_LOAN\\\"\",\"> 6,-\",\"\\\"FULL_TIME\\\",\\\"PART_TIME\\\",\\\"SELF_EMPLOYED\\\"\"],\"outputValues\":[\"amount,if amount < (monthlyIncome*6 + totalOtherIncome*2) then amount else (monthlyIncome*6 + totalOtherIncome*2),if amount < (monthlyIncome*2 + totalOtherIncome*2) then amount else (monthlyIncome*2 + totalOtherIncome*2),if amount < (monthlyIncome + totalOtherIncome*2) then amount else (monthlyIncome + totalOtherIncome*2),if amount < 6*(monthlyIncome*6 + totalOtherIncome*2) then amount else 6*(monthlyIncome*6 + totalOtherIncome*2),if amount < 6*(monthlyIncome*4 + totalOtherIncome*2) then amount else 6*(monthlyIncome*4 + totalOtherIncome*2),if amount < 6*(monthlyIncome*2 + totalOtherIncome*2) then amount else 6*(monthlyIncome*2 + totalOtherIncome*2),if amount < 12*(monthlyIncome*6 + totalOtherIncome*2) then amount else 12*(monthlyIncome*6 + totalOtherIncome*2),if amount < 12*(monthlyIncome*4 + totalOtherIncome*2) then amount else 12*(monthlyIncome*4 + totalOtherIncome*2),if amount < 12*(monthlyIncome*2 + totalOtherIncome*2) then amount else 12*(monthlyIncome*2 + totalOtherIncome*2)\",\"TRUE,FALSE\"],\"context\":null}", + "dtDesignerData": { + "name": "", + "inputExpressionList": [ + { + "label": "amount", + "expr": "amount", + "type": "string", + "values": "<= 2000,<=2000,> 2000,-" + }, + { + "label": "type", + "expr": "type", + "type": "string", + "values": "\"PERSONAL_LOAN\",\"CAR_LOAN\",\"HOME_LOAN\"" + }, + { + "label": "experience", + "expr": "experience", + "type": "string", + "values": "> 6,-" + }, + { + "label": "employmentType", + "expr": "employmentType", + "type": "string", + "values": "\"FULL_TIME\",\"PART_TIME\",\"SELF_EMPLOYED\"" + } + ], + "outputs": [ + { + "label": "eligibility", + "expr": "eligibility", + "type": "string", + "values": "amount,if amount < (monthlyIncome*6 + totalOtherIncome*2) then amount else (monthlyIncome*6 + totalOtherIncome*2),if amount < (monthlyIncome*2 + totalOtherIncome*2) then amount else (monthlyIncome*2 + totalOtherIncome*2),if amount < (monthlyIncome + totalOtherIncome*2) then amount else (monthlyIncome + totalOtherIncome*2),if amount < 6*(monthlyIncome*6 + totalOtherIncome*2) then amount else 6*(monthlyIncome*6 + totalOtherIncome*2),if amount < 6*(monthlyIncome*4 + totalOtherIncome*2) then amount else 6*(monthlyIncome*4 + totalOtherIncome*2),if amount < 6*(monthlyIncome*2 + totalOtherIncome*2) then amount else 6*(monthlyIncome*2 + totalOtherIncome*2),if amount < 12*(monthlyIncome*6 + totalOtherIncome*2) then amount else 12*(monthlyIncome*6 + totalOtherIncome*2),if amount < 12*(monthlyIncome*4 + totalOtherIncome*2) then amount else 12*(monthlyIncome*4 + totalOtherIncome*2),if amount < 12*(monthlyIncome*2 + totalOtherIncome*2) then amount else 12*(monthlyIncome*2 + totalOtherIncome*2)" + }, + { + "label": "preApproved", + "expr": "preApproved", + "type": "string", + "values": "TRUE,FALSE" + } + ], + "hitPolicy": "F", + "ruleList": [ + [ + "<= 2000", + "\"PERSONAL_LOAN\"", + "> 6", + "\"FULL_TIME\"", + "amount", + "TRUE" + ], + [ + "<=2000", + "\"PERSONAL_LOAN\"", + "-", + "\"FULL_TIME\"", + "if amount < (monthlyIncome*6 + totalOtherIncome*2) then amount else (monthlyIncome*6 + totalOtherIncome*2)", + "FALSE" + ], + [ + "> 2000", + "\"PERSONAL_LOAN\"", + "-", + "\"FULL_TIME\"", + "if amount < (monthlyIncome*6 + totalOtherIncome*2) then amount else (monthlyIncome*6 + totalOtherIncome*2)", + "FALSE" + ], + [ + "-", + "\"PERSONAL_LOAN\"", + "-", + "\"PART_TIME\"", + "if amount < (monthlyIncome*2 + totalOtherIncome*2) then amount else (monthlyIncome*2 + totalOtherIncome*2)", + "FALSE" + ], + [ + "-", + "\"PERSONAL_LOAN\"", + "-", + "\"SELF_EMPLOYED\"", + "if amount < (monthlyIncome + totalOtherIncome*2) then amount else (monthlyIncome + totalOtherIncome*2)", + "FALSE" + ], + [ + "-", + "\"CAR_LOAN\"", + "-", + "\"FULL_TIME\"", + "if amount < 6*(monthlyIncome*6 + totalOtherIncome*2) then amount else 6*(monthlyIncome*6 + totalOtherIncome*2)", + "FALSE" + ], + [ + "-", + "\"CAR_LOAN\"", + "-", + "\"PART_TIME\"", + "if amount < 6*(monthlyIncome*4 + totalOtherIncome*2) then amount else 6*(monthlyIncome*4 + totalOtherIncome*2)", + "FALSE" + ], + [ + "-", + "\"CAR_LOAN\"", + "-", + "\"SELF_EMPLOYED\"", + "if amount < 6*(monthlyIncome*2 + totalOtherIncome*2) then amount else 6*(monthlyIncome*2 + totalOtherIncome*2)", + "FALSE" + ], + [ + "-", + "\"HOME_LOAN\"", + "-", + "\"FULL_TIME\"", + "if amount < 12*(monthlyIncome*6 + totalOtherIncome*2) then amount else 12*(monthlyIncome*6 + totalOtherIncome*2)", + "FALSE" + ], + [ + "-", + "\"HOME_LOAN\"", + "-", + "\"PART_TIME\"", + "if amount < 12*(monthlyIncome*4 + totalOtherIncome*2) then amount else 12*(monthlyIncome*4 + totalOtherIncome*2)", + "FALSE" + ], + [ + "-", + "\"HOME_LOAN\"", + "-", + "\"SELF_EMPLOYED\"", + "if amount < 12*(monthlyIncome*2 + totalOtherIncome*2) then amount else 12*(monthlyIncome*2 + totalOtherIncome*2)", + "FALSE" + ] + ] + }, + "id": "5e32af7c55bfd8ff5423a44c", + "_version": "3cb2aaf6-3b45-4922-9642-30bee2fff72e" + }, + { + "name": "UserLocation", + "decisionRules": "{\"inputExpressionList\":[\"userName\"],\"outputs\":[\"location\"],\"hitPolicy\":\"U\",\"ruleList\":[[\"\\\"user1\\\"\",\"\\\"US\\\"\"],[\"\\\"user2\\\"\",\"\\\"FR\\\"\"]],\"inputValues\":[\"\"],\"outputValues\":[\"\"],\"context\":null}", + "dtDesignerData": { + "name": "", + "inputExpressionList": [ + { + "label": "userName", + "expr": "userName", + "type": "string", + "values": "" + } + ], + "outputs": [ + { + "label": "location", + "expr": "location", + "type": "string", + "values": "" + } + ], + "hitPolicy": "U", + "ruleList": [ + [ + "\"user1\"", + "\"US\"" + ], + [ + "\"user2\"", + "\"FR\"" + ] + ] + }, + "id": "5e3be26b88e4540c0923d769", + "_oldVersion": "417966e9-807d-4552-a9b9-eb6b13c28c6b", + "_version": "5de5a8ec-3fc7-40c1-b93d-d2db3efd6139" + } + ] \ No newline at end of file diff --git a/test/test-data/DecisionTreeData.json b/test/test-data/DecisionTreeData.json new file mode 100644 index 0000000..3af0072 --- /dev/null +++ b/test/test-data/DecisionTreeData.json @@ -0,0 +1,61 @@ +{ + "name" : "TestTree", + "nodes" : [ + { + "id" : "n-rkljn4byr", + "name" : "UserLocation", + "nodeType" : "DECISION_TABLE", + "x" : 574, + "y" : 8, + "data" : {}, + "skipFeel" : true + }, + { + "id" : "n-fub5yhz6f", + "name" : "Decision Gate 2", + "nodeType" : "DECISION_GATE", + "x" : 574, + "y" : 168, + "data" : {}, + "skipFeel" : true + }, + { + "id" : "n-rze21y6nh", + "name" : "eligibility_USA", + "nodeType" : "DECISION_TABLE", + "x" : 327, + "y" : 425, + "data" : {}, + "skipFeel" : true + }, + { + "id" : "n-rbnxnuxst", + "name" : "eligibility_FR", + "nodeType" : "DECISION_TABLE", + "x" : 856, + "y" : 432, + "data" : {}, + "skipFeel" : true + } + ], + "connections" : [ + { + "from" : "n-rkljn4byr", + "to" : "n-fub5yhz6f", + "id" : "c-1ghbvmu02", + "condition" : "" + }, + { + "from" : "n-fub5yhz6f", + "to" : "n-rze21y6nh", + "id" : "c-ebty0cye", + "condition" : "location === \"US\"" + }, + { + "from" : "n-fub5yhz6f", + "to" : "n-rbnxnuxst", + "id" : "c-appxa5hi2u", + "condition" : "location == \"FR\"" + } + ] +} \ No newline at end of file From 3da9648b637a7c40780d19c5864e54950d6cb0ab Mon Sep 17 00:00:00 2001 From: Sumeet Date: Thu, 20 Feb 2020 16:12:37 +0530 Subject: [PATCH 06/24] modified decision-tree.js --- common/models/decision-tree.js | 161 +++++++++++++++++-------------- test/decision-tree-tests.spec.js | 2 +- 2 files changed, 87 insertions(+), 76 deletions(-) diff --git a/common/models/decision-tree.js b/common/models/decision-tree.js index 8a8bc2e..a78dd04 100644 --- a/common/models/decision-tree.js +++ b/common/models/decision-tree.js @@ -19,21 +19,25 @@ module.exports = function (decisionTree) { var data = ctx.__data || ctx.instance || ctx.data; try { var decisionTreeConnectionArray = JSON.parse(JSON.stringify(data.connections)); - var from_array = []; var to_array = []; - decisionTreeConnectionArray.forEach(function (item) { - from_array.push(item.from); to_array.push(item.to); }); - - for (var i in from_array) { - if (!to_array.includes(from_array[i])) { - data.rootNodeId = from_array[i]; + var rootNodeArray = decisionTreeConnectionArray.filter(function (node) { + if (!to_array.includes(node.from)) { + return true; } + }); + if (rootNodeArray.length > 1) { + next(new Error('Decision tree should not have more than one root node')); + } + if (rootNodeArray.length > 0) { + data.rootNodeId = rootNodeArray[0].from; + } + if (data.rootNodeId === undefined || data.rootNodeId === '' || data.rootNodeId === null) { + next(new Error('Decision tree root node should not be empty or null')); } next(); - } catch (err) { log.error(ctx.options, 'Error - Unable to process decision tree data -', err); next(new Error('Decision tree data provided could not be parsed, please provide proper data')); @@ -85,10 +89,8 @@ module.exports = function (decisionTree) { options, callback ) { - // var businessRuleEngine = 'evBusinessRule'; if (typeof callback === 'undefined') { if (typeof options === 'function') { - // execrule (documentName, data, callback) callback = options; options = {}; } @@ -129,21 +131,30 @@ module.exports = function (decisionTree) { var root = ''; var nodes = []; var connections = []; - - if (decisionTreeData[0].rootNodeId !== null) { + + if (decisionTreeData[0].rootNodeId !== null && decisionTreeData[0].rootNodeId !== undefined && decisionTreeData[0].rootNodeId !== '') { root = decisionTreeData[0].rootNodeId; } - if (decisionTreeData[0].nodes !== null) { + if (decisionTreeData[0].nodes.length > 0) { nodes = decisionTreeData[0].nodes; } - if (decisionTreeData[0].connections !== null) { + if (decisionTreeData[0].connections.length > 0) { connections = decisionTreeData[0].connections; } - traverseDecisionTree(root, nodes, connections, data, {}, options, callback); + if (nodes.length > 0) { + traverseDecisionTree(root, nodes, connections, data, {}, options, callback); + } + else { + var err1 = new Error( + 'No Nodes found for TreeName ' + name + ); + err1.retriable = false; + callback(err1); + } } else { var err1 = new Error( - 'No Name found for Tree Name ' + name + 'No Tree found for TreeName ' + name ); err1.retriable = false; callback(err1); @@ -152,79 +163,79 @@ module.exports = function (decisionTree) { ); }; - - - function traverseDecisionTree(root, nodes, connections, payload, result, options, done) { - var updatedPayload = {}; - for (var k in nodes) { - var ob = nodes[k]; - - if (ob.id === root) { - var rootName = ob.name; - if (ob.nodeType !== 'DECISION_TABLE') { - updatedPayload = payload; - for (var i in connections) { - - var obj = connections[i]; - if (root === obj.from) { - if (obj.condition === "" || obj.condition === null) { - return traverseDecisionTree(obj.to, nodes, connections, updatedPayload, result, options, done); - } - else { - var isValid = evaluateCondition(updatedPayload, obj.condition); - if (isValid) { + try { + var updatedPayload = {}; - return traverseDecisionTree(obj.to, nodes, connections, updatedPayload, result, options, done); - } - } - } - } + var node = nodes.filter(function (node) { + return node.id === root; + }); + + var rootName = node[0].name; + if (node[0].nodeType !== 'DECISION_TABLE') { + updatedPayload = payload; + var filteredConnections = connections.filter(function (connection) { + return connection.from === root; + }); + if (filteredConnections.length > 0) { + traverseDecisionTreeUtil(nodes, filteredConnections, connections, updatedPayload, result, options, done); } - else - if (ob.nodeType === 'DECISION_TABLE') { - var DecisionTreeModel = loopback.getModel('DecisionTable', options); - DecisionTreeModel.exec(rootName, payload, options, function (err, res) { + else { + return done(null, result); + } + } + else + if (node[0].nodeType === 'DECISION_TABLE') { + var DecisionTreeModel = loopback.getModel('DecisionTable', options); + DecisionTreeModel.exec(rootName, payload, options, function (err, res) { + if (err) { + log.error(options, err.message); + } + updatedPayload = Object.assign(payload, res); + result = Object.assign(result, res); + var filteredConnections = connections.filter(function (connection) { + return connection.from === root; + }); + if (filteredConnections.length > 0) { + traverseDecisionTreeUtil(nodes, filteredConnections, connections, updatedPayload, result, options, done); + } + else if (err) { - log.error(options, err.message); + return done(err, null); } - updatedPayload = Object.assign(payload, res); - result = Object.assign(result, res); - - for (var i in connections) { - var obj = connections[i]; - if (root === obj.from) { - if (obj.condition === "" || obj.condition === null) { - - return traverseDecisionTree(obj.to, nodes, connections, updatedPayload, result, options, done); - } - else { - var isValid = evaluateCondition(updatedPayload, obj.condition); - if (isValid) { - return traverseDecisionTree(obj.to, nodes, connections, updatedPayload, result, options, done); - } - } - } + else { + return done(null, result); } - return done(null, result); - }); - } - } + }); + } + + } catch (error) { + console.log(error); } + } - function evaluateCondition(payload, condition) { + function traverseDecisionTreeUtil(nodes, currrentNodeConnections, connections, payload, result, options, done) { + var node = currrentNodeConnections.find(function (node) { + if (node.condition === "" || node.condition === null) { + return true; + } + else { + var isValid = evaluateCondition(payload, node.condition); + if (isValid) { + return true; + } + } + }); + return traverseDecisionTree(node.to, nodes, connections, payload, result, options, done); + } - /* var sandbox = { - payload: payload - };*/ - var sandbox = payload; - var context = new vm.createContext(sandbox); + function evaluateCondition(payload, condition) { + var context = new vm.createContext(payload); var compiledScript = new vm.Script("this.output = (" + condition + ");"); compiledScript.runInContext(context); return context.output; - } }; diff --git a/test/decision-tree-tests.spec.js b/test/decision-tree-tests.spec.js index 58669a6..f9811cd 100644 --- a/test/decision-tree-tests.spec.js +++ b/test/decision-tree-tests.spec.js @@ -143,7 +143,7 @@ describe('DecisionTree Model Tests', () => { it('Should fail to execute decision tree as decision tree data is not proper', function (done) { DecisionTree.exec('invalidDecisionTreeName', {}, testContext, function (err, res) { expect(err).not.to.be.undefined; - expect(err.message).to.equal('No Name found for Tree Name invalidDecisionTreeName'); + expect(err.message).to.equal('No Tree found for TreeName invalidDecisionTreeName'); done(); }); }); From d78b64879ff17f2d21bd27d2b5c179f2f42b5fa3 Mon Sep 17 00:00:00 2001 From: Sumeet Date: Thu, 20 Feb 2020 17:00:33 +0530 Subject: [PATCH 07/24] modified decision-tree.js --- common/models/decision-tree.js | 397 +++++++++++++++------------------ 1 file changed, 182 insertions(+), 215 deletions(-) diff --git a/common/models/decision-tree.js b/common/models/decision-tree.js index a78dd04..0a8230b 100644 --- a/common/models/decision-tree.js +++ b/common/models/decision-tree.js @@ -8,234 +8,201 @@ var logger = require('oe-logger'); var assert = require('assert'); var log = logger('decision-tree'); -var util = require('util'); var loopback = require('loopback'); const vm = require('vm'); module.exports = function (decisionTree) { - - decisionTree.observe('before save', function decisionTreeBeforeSave(ctx, next) { - var data = ctx.__data || ctx.instance || ctx.data; - try { - var decisionTreeConnectionArray = JSON.parse(JSON.stringify(data.connections)); - var to_array = []; - decisionTreeConnectionArray.forEach(function (item) { - to_array.push(item.to); - }); - var rootNodeArray = decisionTreeConnectionArray.filter(function (node) { - if (!to_array.includes(node.from)) { - return true; - } - }); - if (rootNodeArray.length > 1) { - next(new Error('Decision tree should not have more than one root node')); - } - if (rootNodeArray.length > 0) { - data.rootNodeId = rootNodeArray[0].from; - } - if (data.rootNodeId === undefined || data.rootNodeId === '' || data.rootNodeId === null) { - next(new Error('Decision tree root node should not be empty or null')); - } - next(); - } catch (err) { - log.error(ctx.options, 'Error - Unable to process decision tree data -', err); - next(new Error('Decision tree data provided could not be parsed, please provide proper data')); + decisionTree.observe('before save', function decisionTreeBeforeSave(ctx, next) { + var data = ctx.__data || ctx.instance || ctx.data; + try { + var decisionTreeConnectionArray = JSON.parse(JSON.stringify(data.connections)); + var toArray = []; + decisionTreeConnectionArray.forEach(function (item) { + toArray.push(item.to); + }); + var rootNodeArray = decisionTreeConnectionArray.filter(function (node) { + if (!toArray.includes(node.from)) { + return true; } - }); - - decisionTree.remoteMethod('exec', { - description: 'execute a business rule', - accessType: 'WRITE', - accepts: [ - { - arg: 'name', - type: 'string', - required: true, - http: { - source: 'path' - }, - description: 'Name of the Decision Tree to be fetched from db for rule engine' - }, - { - arg: 'data', - type: 'object', - required: true, - http: { - source: 'body' - }, - description: 'An object on which business rules should be applied' - }, - { - arg: 'options', - type: 'object', - http: 'optionsFromRequest' - } - ], + }); + if (rootNodeArray.length > 1) { + next(new Error('Decision tree should not have more than one root node')); + } + if (rootNodeArray[0].from === '' || rootNodeArray[0].from === null) { + next(new Error('Decision tree root node should not be empty or null')); + } + if (rootNodeArray.length > 0) { + data.rootNodeId = rootNodeArray[0].from; + } + next(); + } catch (err) { + log.error(ctx.options, 'Error - Unable to process decision tree data -', err); + next(new Error('Decision tree data provided could not be parsed, please provide proper data')); + } + }); + + decisionTree.remoteMethod('exec', { + description: 'execute a business rule', + accessType: 'WRITE', + accepts: [ + { + arg: 'name', + type: 'string', + required: true, http: { - verb: 'post', - path: '/exec/:name' + source: 'path' }, - returns: { - arg: 'data', - type: 'object', - root: true - } - }); + description: 'Name of the Decision Tree to be fetched from db for rule engine' + }, + { + arg: 'data', + type: 'object', + required: true, + http: { + source: 'body' + }, + description: 'An object on which business rules should be applied' + }, + { + arg: 'options', + type: 'object', + http: 'optionsFromRequest' + } + ], + http: { + verb: 'post', + path: '/exec/:name' + }, + returns: { + arg: 'data', + type: 'object', + root: true + } + }); + + decisionTree.exec = function decisionTreeExec( + name, + data, + options, + callback + ) { + if (typeof callback === 'undefined') { + if (typeof options === 'function') { + callback = options; + options = {}; + } + } - decisionTree.exec = function decisionTreeExec( - name, - data, - options, - callback - ) { - if (typeof callback === 'undefined') { - if (typeof options === 'function') { - callback = options; - options = {}; - } + data = data || {}; + options = options || {}; + + assert( + typeof name === 'string', + 'The decision tree name argument must be string' + ); + assert( + typeof data === 'object', + 'The data argument must be an object or array' + ); + assert( + typeof options === 'object', + 'The options argument must be an object' + ); + assert( + typeof callback === 'function', + 'The callback argument must be a function' + ); + + decisionTree.find( + { + where: { + name: name } - - data = data || {}; - options = options || {}; - callback = callback || utils.createPromiseCallback(); - - assert( - typeof name === 'string', - 'The decision tree name argument must be string' - ); - assert( - typeof data === 'object', - 'The data argument must be an object or array' - ); - assert( - typeof options === 'object', - 'The options argument must be an object' - ); - assert( - typeof callback === 'function', - 'The callback argument must be a function' - ); - - decisionTree.find( - { - where: { - name: name - } - }, - options, - function decisionTreeFind(err, decisionTreeData) { - if (err) { - callback(err); - } else if (decisionTreeData.length) { - var root = ''; - var nodes = []; - var connections = []; - - if (decisionTreeData[0].rootNodeId !== null && decisionTreeData[0].rootNodeId !== undefined && decisionTreeData[0].rootNodeId !== '') { - root = decisionTreeData[0].rootNodeId; - } - if (decisionTreeData[0].nodes.length > 0) { - nodes = decisionTreeData[0].nodes; - } - if (decisionTreeData[0].connections.length > 0) { - connections = decisionTreeData[0].connections; - } - if (nodes.length > 0) { - traverseDecisionTree(root, nodes, connections, data, {}, options, callback); - } - else { - var err1 = new Error( - 'No Nodes found for TreeName ' + name - ); - err1.retriable = false; - callback(err1); - } - - } else { - var err1 = new Error( - 'No Tree found for TreeName ' + name - ); - err1.retriable = false; - callback(err1); - } - } - ); - }; - - function traverseDecisionTree(root, nodes, connections, payload, result, options, done) { - try { - var updatedPayload = {}; - - var node = nodes.filter(function (node) { - return node.id === root; - }); - - var rootName = node[0].name; - if (node[0].nodeType !== 'DECISION_TABLE') { - updatedPayload = payload; - var filteredConnections = connections.filter(function (connection) { - return connection.from === root; - }); - if (filteredConnections.length > 0) { - traverseDecisionTreeUtil(nodes, filteredConnections, connections, updatedPayload, result, options, done); - } - else { - return done(null, result); - } - } - else - if (node[0].nodeType === 'DECISION_TABLE') { - var DecisionTreeModel = loopback.getModel('DecisionTable', options); - DecisionTreeModel.exec(rootName, payload, options, function (err, res) { - if (err) { - log.error(options, err.message); - } - updatedPayload = Object.assign(payload, res); - result = Object.assign(result, res); - var filteredConnections = connections.filter(function (connection) { - return connection.from === root; - }); - if (filteredConnections.length > 0) { - traverseDecisionTreeUtil(nodes, filteredConnections, connections, updatedPayload, result, options, done); - } - else - if (err) { - return done(err, null); - } - else { - return done(null, result); - } - - }); - } - - } catch (error) { - console.log(error); + }, + options, + function decisionTreeFind(err, decisionTreeData) { + if (err) { + callback(err); + } else if (decisionTreeData.length) { + var rootId = ''; + var nodes = []; + var connections = []; + + rootId = decisionTreeData[0].rootNodeId; + if (decisionTreeData[0].nodes.length > 0) { + nodes = decisionTreeData[0].nodes; + } + if (decisionTreeData[0].connections.length > 0) { + connections = decisionTreeData[0].connections; + } + if (nodes.length > 0) { + traverseDecisionTree(rootId, nodes, connections, data, {}, options, callback); + } + } else { + var err1 = new Error( + 'No Tree found for TreeName ' + name + ); + err1.retriable = false; + callback(err1); } - - } - - function traverseDecisionTreeUtil(nodes, currrentNodeConnections, connections, payload, result, options, done) { - var node = currrentNodeConnections.find(function (node) { - if (node.condition === "" || node.condition === null) { - return true; - } - else { - var isValid = evaluateCondition(payload, node.condition); - if (isValid) { - return true; - } - } + } + ); + }; + + function traverseDecisionTree(rootId, nodes, connections, payload, result, options, done) { + try { + var updatedPayload = {}; + var curnode = nodes.find(function (node) { + return node.id === rootId; + }); + var filteredConnections = connections.filter(function (connection) { + return connection.from === rootId; + }); + var rootName = curnode.name; + if (curnode.nodeType !== 'DECISION_TABLE') { + if (filteredConnections.length > 0) { + traverseDecisionTreeUtil(nodes, filteredConnections, connections, payload, result, options, done); + } else { + return done(null, result); + } + } else + if (curnode.nodeType === 'DECISION_TABLE') { + var DecisionTreeModel = loopback.getModel('DecisionTable', options); + DecisionTreeModel.exec(rootName, payload, options, function (err, res) { + if (err) { + log.error(options, err.message); + } + updatedPayload = Object.assign(payload, res); + result = Object.assign(result, res); + if (filteredConnections.length > 0) { + traverseDecisionTreeUtil(nodes, filteredConnections, connections, updatedPayload, result, options, done); + } else { + return done(null, result); + } }); - return traverseDecisionTree(node.to, nodes, connections, payload, result, options, done); + } + } catch (error) { + log.error(error); } + } - function evaluateCondition(payload, condition) { - var context = new vm.createContext(payload); - var compiledScript = new vm.Script("this.output = (" + condition + ");"); - compiledScript.runInContext(context); - return context.output; - } + function traverseDecisionTreeUtil(nodes, currrentNodeConnections, connections, payload, result, options, done) { + var node = currrentNodeConnections.find(function (node) { + if (node.condition === '' || node.condition === null) { + return true; + } + return !!evaluateCondition(payload, node.condition); + }); + return traverseDecisionTree(node.to, nodes, connections, payload, result, options, done); + } + + function evaluateCondition(payload, condition) { + // eslint-disable-next-line + var context = new vm.createContext(payload); + var compiledScript = new vm.Script('this.output = (' + condition + ');'); + compiledScript.runInContext(context); + return context.output; + } }; From 747bfa89e76550d73d192d94a045bf7f2c8d1d57 Mon Sep 17 00:00:00 2001 From: Sumeet Date: Sat, 22 Feb 2020 14:50:21 +0530 Subject: [PATCH 08/24] Modified decision-tree.js --- common/models/decision-tree.js | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/common/models/decision-tree.js b/common/models/decision-tree.js index 0a8230b..6c5bc45 100644 --- a/common/models/decision-tree.js +++ b/common/models/decision-tree.js @@ -11,18 +11,17 @@ var log = logger('decision-tree'); var loopback = require('loopback'); const vm = require('vm'); - module.exports = function (decisionTree) { decisionTree.observe('before save', function decisionTreeBeforeSave(ctx, next) { var data = ctx.__data || ctx.instance || ctx.data; try { - var decisionTreeConnectionArray = JSON.parse(JSON.stringify(data.connections)); - var toArray = []; - decisionTreeConnectionArray.forEach(function (item) { - toArray.push(item.to); - }); + var decisionTreeConnectionArray = data.connections; + let toSet = new Set(); var rootNodeArray = decisionTreeConnectionArray.filter(function (node) { - if (!toArray.includes(node.from)) { + decisionTreeConnectionArray.forEach(element => { + toSet.add(element.to); + }); + if (!toSet.has(node.from)) { return true; } }); From 2138c69d21ff4737e927424ff25850b2440d52a7 Mon Sep 17 00:00:00 2001 From: Sumeet Date: Mon, 24 Feb 2020 14:31:55 +0530 Subject: [PATCH 09/24] updated readme.md file --- README.md | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index a9f833e..2a73e0f 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ ## Introduction This oe-cloud module implements the business rule functionality. The most common way to represent a rule is via **decision tables**. -We additionally allow rules to be represented hierarchially via a concept called **decision graphs and services**. Both are accessed +We additionally allow rules to be represented hierarchially via a concept called **decision graphs, decision services and tree**. All are accessed through different APIs. This module extensively makes use of js-feel business rule engine. @@ -19,6 +19,8 @@ oe-cloud module on its own. Alternatively, you can work with excel files for rep they will not give you the visual experience required, and, it becomes tedious to understand the relationship between various decision elements. However, decision graphs and services provide for a powerful and complex rule representations. +There is a way to execute a chain of decision rules via a concept called **decision tree**. Decision Tree uses the tree representation to solve the problem in which each node is either a *decision table* or *decision gate*. Based on the branch conditions, rules are executed. This can be invoked through `DecisionTree.exec` remote method. + ## How are rules actually implemented? We currently make use of js-feel javascript DMN based rule engine to execute decisions. @@ -93,6 +95,26 @@ with the payload and the name of the rule #### Example +### 3. Decision Tree + +To insert a decision tree, we post JSON as follows to the **DecisionTree** model. + +``` +[ + { + "name": "", + "nodes": "", + "connections": "" + } +] +``` +> Note: If done via HTTP, we do a POST to `/api/DecisionTrees/` + +To execute this, we call the `DecisionTree.exec` remote method or make a POST to `/api/DecisionTrees/exec` +with the payload and the name of the tree. + + + ## Towards standardization Most of the work we have done above, while not fully standards compliant, have worked for us. But we do want to move towards From fe7b580f8d066c0c173f59a9761fef04f9544623 Mon Sep 17 00:00:00 2001 From: Sumeet Date: Mon, 24 Feb 2020 16:10:16 +0530 Subject: [PATCH 10/24] updated readme.md and decision-tree.js --- README.md | 89 ++++++++++++++++++++++- common/models/decision-tree.js | 20 ++--- test/test-data/decision-tree-example.png | Bin 0 -> 111531 bytes 3 files changed, 98 insertions(+), 11 deletions(-) create mode 100644 test/test-data/decision-tree-example.png diff --git a/README.md b/README.md index 2a73e0f..8c3c245 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ ## Introduction This oe-cloud module implements the business rule functionality. The most common way to represent a rule is via **decision tables**. -We additionally allow rules to be represented hierarchially via a concept called **decision graphs, decision services and tree**. All are accessed +We additionally allow rules to be represented hierarchially via a concept called **decision graphs, decision services and decision tree**. All are accessed through different APIs. This module extensively makes use of js-feel business rule engine. @@ -113,6 +113,93 @@ To insert a decision tree, we post JSON as follows to the **DecisionTree** model To execute this, we call the `DecisionTree.exec` remote method or make a POST to `/api/DecisionTrees/exec` with the payload and the name of the tree. +#### Example + +Post below data to `/api/DecisionTrees/` + +```` +[ + { + "name": "TestTree", + "nodes": [ + { + "id": "n-rkljn4byr", + "name": "UserLocation", + "nodeType": "DECISION_TABLE", + "x": 574, + "y": 8, + "data": {}, + "skipFeel": true + }, + { + "id": "n-fub5yhz6f", + "name": "Decision Gate 2", + "nodeType": "DECISION_GATE", + "x": 574, + "y": 168, + "data": {}, + "skipFeel": true + }, + { + "id": "n-rze21y6nh", + "name": "eligibility_USA", + "nodeType": "DECISION_TABLE", + "x": 327, + "y": 425, + "data": {}, + "skipFeel": true + }, + { + "id": "n-rbnxnuxst", + "name": "eligibility_FR", + "nodeType": "DECISION_TABLE", + "x": 856, + "y": 432, + "data": {}, + "skipFeel": true + } + ], + "connections": [ + { + "from": "n-rkljn4byr", + "to": "n-fub5yhz6f", + "id": "c-1ghbvmu02", + "condition": "" + }, + { + "from": "n-fub5yhz6f", + "to": "n-rze21y6nh", + "id": "c-ebty0cye", + "condition": "location === \"US\"" + }, + { + "from": "n-fub5yhz6f", + "to": "n-rbnxnuxst", + "id": "c-appxa5hi2u", + "condition": "location == \"FR\"" + } + ] + } +] +```` + +`Graphical representation of above posted model` + ![decision-tree-graphical-representation](./test/test-data/decision-tree-example.png) + + To execute this, we call the `DecisionTree.exec` remote method or make a POST to `/api/DecisionTrees/exec` +with the payload and the name of the tree. + +Below data can be used as payload to execute the decision tree and `TestTree` can be used as a name for the above posted data. + +```` +{ + "userName":"user1", + "amount": 3000, + "type":"PERSONAL_LOAN", + "experience" : 5 , + "monthlyIncome":1000 +} +```` ## Towards standardization diff --git a/common/models/decision-tree.js b/common/models/decision-tree.js index 6c5bc45..5f50af7 100644 --- a/common/models/decision-tree.js +++ b/common/models/decision-tree.js @@ -16,15 +16,16 @@ module.exports = function (decisionTree) { var data = ctx.__data || ctx.instance || ctx.data; try { var decisionTreeConnectionArray = data.connections; - let toSet = new Set(); - var rootNodeArray = decisionTreeConnectionArray.filter(function (node) { - decisionTreeConnectionArray.forEach(element => { - toSet.add(element.to); + var rootNodeArray = decisionTreeConnectionArray.filter((cxn, idx) => { + let isJoined = decisionTreeConnectionArray.some((cxn2, id) => { + if (idx === id) { + return false; + } + return cxn2.to === cxn.from; }); - if (!toSet.has(node.from)) { - return true; - } + return !isJoined; }); + if (rootNodeArray.length > 1) { next(new Error('Decision tree should not have more than one root node')); } @@ -165,8 +166,7 @@ module.exports = function (decisionTree) { } else { return done(null, result); } - } else - if (curnode.nodeType === 'DECISION_TABLE') { + } else if (curnode.nodeType === 'DECISION_TABLE') { var DecisionTreeModel = loopback.getModel('DecisionTable', options); DecisionTreeModel.exec(rootName, payload, options, function (err, res) { if (err) { @@ -199,7 +199,7 @@ module.exports = function (decisionTree) { function evaluateCondition(payload, condition) { // eslint-disable-next-line - var context = new vm.createContext(payload); + var context = new vm.createContext(payload); var compiledScript = new vm.Script('this.output = (' + condition + ');'); compiledScript.runInContext(context); return context.output; diff --git a/test/test-data/decision-tree-example.png b/test/test-data/decision-tree-example.png new file mode 100644 index 0000000000000000000000000000000000000000..a2f21e6599e22b9fa8f2834e7fa0addb03fa5874 GIT binary patch literal 111531 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 iSO{oKC@KQs` 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%0Dw^Rzik|u)je3XBO00ECwgF&^xyu4~HJkkj4 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 Date: Mon, 24 Feb 2020 16:17:12 +0530 Subject: [PATCH 11/24] updated readme.md file --- README.md | 5 +++-- test/test-data/decision-tree-example.png | Bin 111531 -> 28463 bytes 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 8c3c245..4519252 100644 --- a/README.md +++ b/README.md @@ -183,8 +183,9 @@ Post below data to `/api/DecisionTrees/` ] ```` -`Graphical representation of above posted model` - ![decision-tree-graphical-representation](./test/test-data/decision-tree-example.png) + Graphical representation of above posted model + +![decision-tree-graphical-representation](./test/test-data/decision-tree-example.png) To execute this, we call the `DecisionTree.exec` remote method or make a POST to `/api/DecisionTrees/exec` with the payload and the name of the tree. diff --git a/test/test-data/decision-tree-example.png b/test/test-data/decision-tree-example.png index a2f21e6599e22b9fa8f2834e7fa0addb03fa5874..718b6e694c5ac6d3a67253cbd18c056d88e62158 100644 GIT binary patch literal 28463 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 literal 111531 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 iSO{oKC@KQs` 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%0Dw^Rzik|u)je3XBO00ECwgF&^xyu4~HJkkj4 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 Date: Mon, 2 Mar 2020 14:34:06 +0530 Subject: [PATCH 12/24] modified parseExcel remote method to parse context csv --- .gitlab-ci.yml | 2 +- common/models/decision-table.js | 31 ++++++++++++++++++++++++++++--- test/decision-table-tests.spec.js | 20 ++++++++++++++------ 3 files changed, 43 insertions(+), 10 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 6edad61..1e48ef3 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -108,7 +108,7 @@ oracletest: # - export DB_NAME=${CI_JOB_ID}_pg # - time npm install git+http://evgit/oecloud.io/oe-connector-oracle.git#master --no-optional - time npm install --no-optional - - mv /oracledb node_modules/ + # - mv /oracledb node_modules/ - node test/oracle-utility.js # - export ORACLE_USERNAME=${group}"_"${project} # - export ORACLE_USERNAME=$(echo $ORACLE_USERNAME | tr '[:lower:]' '[:upper:]') diff --git a/common/models/decision-table.js b/common/models/decision-table.js index 6b02958..6293326 100644 --- a/common/models/decision-table.js +++ b/common/models/decision-table.js @@ -42,7 +42,7 @@ module.exports = function decisionTableFn(decisionTable) { log.error(ctx.options, 'Error - Unable to process decision table data -', err); next(new Error('Decision table data provided could not be parsed, please provide proper data')); } - } else if ( 'decisionRules' in data) { + } else if ('decisionRules' in data) { next(); } else { next(new Error('Data being posted is incorrect. Either an excel file was expected for property - documentData, or, a parsed decision table object was expected for property - decisionRules')); @@ -168,7 +168,7 @@ module.exports = function decisionTableFn(decisionTable) { options = options || {}; cb = cb || utils.createPromiseCallback(); - decisionTable.findOne({ where: { id: recordId }}, options, function dtFineOneCb(err, result) { + decisionTable.findOne({ where: { id: recordId } }, options, function dtFineOneCb(err, result) { if (err) { return cb(err); } @@ -179,6 +179,30 @@ module.exports = function decisionTableFn(decisionTable) { }); }; + const getFormattedValue = str => str.replace(/\"{2,}/g, '\"').replace(/^\"|\"$/g, ''); + + function parseContext(commaSepString) { + const csv = commaSepString.split('\n'); + let context = {}; + let i = 1; + + for (; i < csv.length; i += 1) { + const arr = csv[i].split(delimiter).filter(String); + if (arr.length > 0 && arr[0] === 'RuleTable') { + break; + } else if (arr.length > 0) { + const count = arr[1].split('"').length - 1; + if (count > 0) { + arr[1] = getFormattedValue(arr[1]); + } + context[arr[0]] = arr[1]; + } + } + // context = Object.keys(context).length > 0 ? JSON.stringify(context).replace(/"/g, '').replace(/\\/g, '"') : ''; + // return context.length > 0 ? context : null; + return context; + } + decisionTable.remoteMethod('document', { description: 'retrieve the excel file document of the corresponding decision (as base64 only)', accessType: 'READ', @@ -257,6 +281,7 @@ module.exports = function decisionTableFn(decisionTable) { var sheet = workbook.Sheets[workbook.SheetNames[0]]; var csv = XLSX.utils.sheet_to_csv(sheet, { FS: delimiter }); var decisionRules = dTable.csv_to_decision_table(csv); - cb(null, decisionRules); + var contextObj = parseContext(csv); + cb(null, { decisionRules, contextObj }); }; }; diff --git a/test/decision-table-tests.spec.js b/test/decision-table-tests.spec.js index 6c2cc19..5c36465 100644 --- a/test/decision-table-tests.spec.js +++ b/test/decision-table-tests.spec.js @@ -222,15 +222,22 @@ describe('DecisionTable Model Tests', () => { it('should be able to retrieve the parsed representation of an excel file containing a decision table', done => { var fileContents = fs.readFileSync(path.join(__dirname, 'business-rule-data/DecisionTable.json'), {encoding: 'utf8'}); var data = JSON.parse(fileContents); - var {name, document: { documentData } } = data[0]; - name += 1; + // var {name, document: { documentData } } = data[3]; + var testData = data[3]; + var { document, name } = testData; + var { documentData } = document; + + var expectedContext = { + "getAmount" : "function(a,b,c,d) if d > a then min([d - a, b - a])*c else 0" + } + DecisionTable.parseExcel({documentData}, testContext, (err, result) => { if (err) { done(err); return; - } + } - DecisionTable.findOne({ where: { name }}, testContext, (err, output) => { + DecisionTable.create({ name, ...document }, testContext, (err, output) => { if (err) { done(err); } else { @@ -238,9 +245,10 @@ describe('DecisionTable Model Tests', () => { expect(typeof result).to.equal('object'); rulesObject = JSON.parse(output.decisionRules); // expect(Object.keys(result).every( key => result[key] === rulesObject[key] )).to.be.true; - expect(result).to.deep.equal(rulesObject); + expect(result.decisionRules).to.deep.equal(rulesObject); + expect(result.contextObj).to.deep.equal(expectedContext); done(); - } + } }); }); }); From f85171e638c2dfb5555294d82e74b951e01fa55a Mon Sep 17 00:00:00 2001 From: deostroll Date: Mon, 2 Mar 2020 14:41:39 +0530 Subject: [PATCH 13/24] version bump : 2.2.0 - updated ci oracle script - parseExcel remote method now returns the parsed decision table context (if it exists) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6542e67..33d2aa3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "oe-business-rule", - "version": "2.1.0", + "version": "2.2.0", "description": "oe-cloud modularization project aka oecloud.io", "engines": { "node": ">=6" From 4166797d0781699aca00b5cbe8f1d52ec2c02dd0 Mon Sep 17 00:00:00 2001 From: deostroll Date: Thu, 2 Apr 2020 23:53:14 +0530 Subject: [PATCH 14/24] support for payload update in enrichment logic --- lib/enrichment-helpers.js | 4 +--- test/payload-enrichment-tests.spec.js | 24 ++++++++++++++++++++++++ 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/lib/enrichment-helpers.js b/lib/enrichment-helpers.js index ae7fe85..bbc3bec 100644 --- a/lib/enrichment-helpers.js +++ b/lib/enrichment-helpers.js @@ -55,9 +55,7 @@ function EnrichmentRuleBootFactory(EnrichmentRule, app) { cb(err); } else { Object.keys(result).forEach(key => { - if (!(key in payload)) { - payload[key] = result[key]; - } + payload[key] = result[key]; }); delete payload.options; cb(); diff --git a/test/payload-enrichment-tests.spec.js b/test/payload-enrichment-tests.spec.js index 289d7ce..d7e8c81 100644 --- a/test/payload-enrichment-tests.spec.js +++ b/test/payload-enrichment-tests.spec.js @@ -173,4 +173,28 @@ describe('Payload Enrichment Tests', () => { } }); }); + + it('should successfully update a property based on a business rule', done => { + var toInsert = { + status: 'entered', + age: 50, + husband_name: 'Robin', + email: 'jango@gmail.com' + }; + + testModel.create(toInsert, testContext, function (err, res) { + if (err) { + // console.error("model-rule-test Error ", err); + done(err); + } else { + expect(res).not.to.be.null; + expect(res).not.to.be.undefined; + expect(res.sex).to.be.equal('F'); + expect(res.married).to.be.equal(true); + expect(res.phone).to.be.equal(1234); + expect(res.email).to.be.equal('abc'); + done(); + } + }); + }); }); From ae81e9f1bb157973fe225187b05e7eddf331f503 Mon Sep 17 00:00:00 2001 From: deostroll Date: Fri, 3 Apr 2020 23:51:37 +0530 Subject: [PATCH 15/24] support for getExcel download --- common/models/decision-table.js | 44 +++++++++++++++ lib/excel-helper.js | 56 +++++++++++++++++++ test/decision-table-tests.spec.js | 93 +++++++++++++++++++++++++++---- 3 files changed, 181 insertions(+), 12 deletions(-) create mode 100644 lib/excel-helper.js diff --git a/common/models/decision-table.js b/common/models/decision-table.js index 6293326..4634b4f 100644 --- a/common/models/decision-table.js +++ b/common/models/decision-table.js @@ -13,6 +13,8 @@ var assert = require('assert'); // var loopback = require('loopback'); var logger = require('oe-logger'); var log = logger('decision-table'); +var { generateExcelBuffer } = require('../../lib/excel-helper'); + // var getError = require('oe-cloud/lib/error-utils').getValidationError; var delimiter = '&SP'; @@ -284,4 +286,46 @@ module.exports = function decisionTableFn(decisionTable) { var contextObj = parseContext(csv); cb(null, { decisionRules, contextObj }); }; + + + //remote method declaration for getExcel + decisionTable.remoteMethod('getExcel', { + description: 'Generates an excel file response, given a json description for a decision table from the rule designer', + accessType: 'WRITE', + isStatic : true, + accepts: [ + { + arg: 'dtJson', + type: 'object', + http: { source: 'body' }, + required: true, + description: "The JSON containing the decision table description from rule designer" + } + ], + http: { + verb: 'POST', + path: '/getExcel' + }, + returns : [ + { + type: 'file', + root: true, + arg: 'body' + }, + { + arg: 'Content-Type', + type: 'string', + http: { target: 'header' } + } + ] + }); + + decisionTable.getExcel = function (dtJson, options, cb) { + try { + let buff = generateExcelBuffer(dtJson); + cb(null, buff, 'application/octet-stream') + } catch (error) { + cb(error) + } + }; }; diff --git a/lib/excel-helper.js b/lib/excel-helper.js new file mode 100644 index 0000000..f6d5684 --- /dev/null +++ b/lib/excel-helper.js @@ -0,0 +1,56 @@ +const XLSX = require('xlsx'); +module.exports = { + generateExcelBuffer(jsonDesc) { + let { name, contextArray, inputExpressionList, outputs, hitPolicy, ruleList } = jsonDesc; + let aoa = []; + + //decision name + aoa.push([name]); + + //context + contextArray.forEach(({ key, value }) => { + aoa.push([key, value]); + }); + + //table header - inputs + let inputsList = inputExpressionList.reduce((carrier, item) => { + carrier.row1.push('Condition'); + carrier.row2.push(item.expr); + carrier.row3.push(item.values); + if(!carrier.row3HasValues) { + carrier.row3HasValues = !!item.values; + } + return carrier; + }, { row1: [], row2: [], row3: [], row3HasValues: false }); + + //table header - outputs + let collatedHeadersList = outputs.reduce((carrier, item) => { + carrier.row1.push('Action'); + carrier.row2.push(item.expr); + carrier.row3.push(item.values); + if(!carrier.row3HasValues) { + carrier.row3HasValues = !!item.values; + } + return carrier; + }, { ...inputsList }); + + //writing table header + aoa.push(['RuleTable', ...collatedHeadersList.row1]); + aoa.push([ hitPolicy, ...collatedHeadersList.row2 ]); + if(collatedHeadersList.row3HasValues) { + aoa.push(['', ...collatedHeadersList.row3]); + } + + //table rules list + ruleList.forEach((ruleRow, idx) => { + aoa.push([ idx + 1, ...ruleRow]); + }); + + //create the workbook and worksheet + let wb = XLSX.utils.book_new(); + let ws = XLSX.utils.aoa_to_sheet(aoa); + XLSX.utils.book_append_sheet(wb, ws, name); + + return XLSX.write(wb, { type: 'buffer'}); + } +} \ No newline at end of file diff --git a/test/decision-table-tests.spec.js b/test/decision-table-tests.spec.js index 5c36465..9744b40 100644 --- a/test/decision-table-tests.spec.js +++ b/test/decision-table-tests.spec.js @@ -89,10 +89,10 @@ describe('DecisionTable Model Tests', () => { }); var decisonFileName; var decisionName; - it('should insert a decision from an excel file which is valid', done =>{ - var fileContents = fs.readFileSync(path.join(__dirname, 'business-rule-data/DecisionTable.json'), {encoding: 'utf8'}); + it('should insert a decision from an excel file which is valid', done => { + var fileContents = fs.readFileSync(path.join(__dirname, 'business-rule-data/DecisionTable.json'), { encoding: 'utf8' }); var data = JSON.parse(fileContents); - var { name, document: { documentData, documentName }} = data[0]; + var { name, document: { documentData, documentName } } = data[0]; name += '1'; decisionName = name; var record = { name, documentData, documentName }; @@ -153,7 +153,7 @@ describe('DecisionTable Model Tests', () => { var loginReq = http.request(loginSpec, loginRes => { expect(loginRes.statusCode).to.equal(200); var data = ''; - loginRes.on('data', d=> data += d.toString('utf8')); + loginRes.on('data', d => data += d.toString('utf8')); loginRes.on('end', () => { var authToken = JSON.parse(data).id; accessToken = authToken; @@ -171,7 +171,7 @@ describe('DecisionTable Model Tests', () => { expect(item).to.not.have.property('documentName'); }); // recordId = getResponse[0].id; //since there is only one at this point... - recordId = getResponse.filter(x => x.name === decisionName )[0].id; + recordId = getResponse.filter(x => x.name === decisionName)[0].id; expect(recordId).to.be.defined; done(); }); @@ -220,7 +220,7 @@ describe('DecisionTable Model Tests', () => { }).timeout(120000); it('should be able to retrieve the parsed representation of an excel file containing a decision table', done => { - var fileContents = fs.readFileSync(path.join(__dirname, 'business-rule-data/DecisionTable.json'), {encoding: 'utf8'}); + var fileContents = fs.readFileSync(path.join(__dirname, 'business-rule-data/DecisionTable.json'), { encoding: 'utf8' }); var data = JSON.parse(fileContents); // var {name, document: { documentData } } = data[3]; var testData = data[3]; @@ -228,14 +228,14 @@ describe('DecisionTable Model Tests', () => { var { documentData } = document; var expectedContext = { - "getAmount" : "function(a,b,c,d) if d > a then min([d - a, b - a])*c else 0" + "getAmount": "function(a,b,c,d) if d > a then min([d - a, b - a])*c else 0" } - - DecisionTable.parseExcel({documentData}, testContext, (err, result) => { + + DecisionTable.parseExcel({ documentData }, testContext, (err, result) => { if (err) { done(err); return; - } + } DecisionTable.create({ name, ...document }, testContext, (err, output) => { if (err) { @@ -248,13 +248,13 @@ describe('DecisionTable Model Tests', () => { expect(result.decisionRules).to.deep.equal(rulesObject); expect(result.contextObj).to.deep.equal(expectedContext); done(); - } + } }); }); }); it('should insert a decision table json directly (for rule designer use case)', done => { - var inputData = {'name': 'TestTable', 'decisionRules': '{"inputExpressionList":["input"],"outputs":["output"],"outputValues":[""],"ruleList":[["\\"yes\\"","true"],["\\"no\\"","false"]],"hitPolicy":"U","inputValues":[""]}'}; + var inputData = { 'name': 'TestTable', 'decisionRules': '{"inputExpressionList":["input"],"outputs":["output"],"outputValues":[""],"ruleList":[["\\"yes\\"","true"],["\\"no\\"","false"]],"hitPolicy":"U","inputValues":[""]}' }; DecisionTable.create(inputData, testContext, (err) => { if (err) { done(err); @@ -263,4 +263,73 @@ describe('DecisionTable Model Tests', () => { } }); }); + + it('should download an excel file when supplied a json description of a data table (designer use case)', function (done) { + var dtDesc = { + "name": "My table", + "inputExpressionList": [ + { + "label": "Eligibility", + "expr": "eligibility", + "type": "number", + "values": "" + }, + { + "label": "Loan Type", + "expr": "loanType", + "type": "string", + "values": "" + } + ], + "outputs": [ + { + "label": "valid", + "expr": "Valid", + "type": "boolean", + "values": "" + } + ], + "hitPolicy": "U", + "ruleList": [ + [ + "<=100", + "-", + "true" + ], + [ + ">100", + "\"CAR_LOAN\"", + "false" + ], + [ + ">100", + "-", + "true" + ] + ], + "contextArray": [ + { + "key": "exp", + "value": "customer.experience" + }, + { + "key": "eligibility", + "value": "myFunc(exp,customer.amount)" + } + ] + }; + + DecisionTable.getExcel(dtDesc, testContext, function(err, buffer, contentType){ + if(err) { + done(err) + } + else { + // console.dir(resp); + expect(buffer).to.be.instanceOf(Buffer); + expect(contentType).to.be.equal('application/octet-stream'); + done(); + } + }); + + }); }); From cd4827ca3504d884fd1432a1c677fe658372cbad Mon Sep 17 00:00:00 2001 From: deostroll Date: Fri, 3 Apr 2020 23:53:25 +0530 Subject: [PATCH 16/24] lint fixes --- common/models/decision-table.js | 12 ++++++------ lib/excel-helper.js | 22 +++++++++++----------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/common/models/decision-table.js b/common/models/decision-table.js index 4634b4f..7365caf 100644 --- a/common/models/decision-table.js +++ b/common/models/decision-table.js @@ -288,25 +288,25 @@ module.exports = function decisionTableFn(decisionTable) { }; - //remote method declaration for getExcel + // remote method declaration for getExcel decisionTable.remoteMethod('getExcel', { description: 'Generates an excel file response, given a json description for a decision table from the rule designer', accessType: 'WRITE', - isStatic : true, + isStatic: true, accepts: [ { arg: 'dtJson', type: 'object', http: { source: 'body' }, required: true, - description: "The JSON containing the decision table description from rule designer" + description: 'The JSON containing the decision table description from rule designer' } ], http: { verb: 'POST', path: '/getExcel' }, - returns : [ + returns: [ { type: 'file', root: true, @@ -323,9 +323,9 @@ module.exports = function decisionTableFn(decisionTable) { decisionTable.getExcel = function (dtJson, options, cb) { try { let buff = generateExcelBuffer(dtJson); - cb(null, buff, 'application/octet-stream') + cb(null, buff, 'application/octet-stream'); } catch (error) { - cb(error) + cb(error); } }; }; diff --git a/lib/excel-helper.js b/lib/excel-helper.js index f6d5684..2b7fbc4 100644 --- a/lib/excel-helper.js +++ b/lib/excel-helper.js @@ -4,53 +4,53 @@ module.exports = { let { name, contextArray, inputExpressionList, outputs, hitPolicy, ruleList } = jsonDesc; let aoa = []; - //decision name + // decision name aoa.push([name]); - //context + // context contextArray.forEach(({ key, value }) => { aoa.push([key, value]); }); - //table header - inputs + // table header - inputs let inputsList = inputExpressionList.reduce((carrier, item) => { carrier.row1.push('Condition'); carrier.row2.push(item.expr); carrier.row3.push(item.values); - if(!carrier.row3HasValues) { + if (!carrier.row3HasValues) { carrier.row3HasValues = !!item.values; } return carrier; }, { row1: [], row2: [], row3: [], row3HasValues: false }); - //table header - outputs + // table header - outputs let collatedHeadersList = outputs.reduce((carrier, item) => { carrier.row1.push('Action'); carrier.row2.push(item.expr); carrier.row3.push(item.values); - if(!carrier.row3HasValues) { + if (!carrier.row3HasValues) { carrier.row3HasValues = !!item.values; } return carrier; }, { ...inputsList }); - //writing table header + // writing table header aoa.push(['RuleTable', ...collatedHeadersList.row1]); aoa.push([ hitPolicy, ...collatedHeadersList.row2 ]); - if(collatedHeadersList.row3HasValues) { + if (collatedHeadersList.row3HasValues) { aoa.push(['', ...collatedHeadersList.row3]); } - //table rules list + // table rules list ruleList.forEach((ruleRow, idx) => { aoa.push([ idx + 1, ...ruleRow]); }); - //create the workbook and worksheet + // create the workbook and worksheet let wb = XLSX.utils.book_new(); let ws = XLSX.utils.aoa_to_sheet(aoa); XLSX.utils.book_append_sheet(wb, ws, name); return XLSX.write(wb, { type: 'buffer'}); } -} \ No newline at end of file +}; From 6afa178d3babe540d8ed03c1e39cebf4475134af Mon Sep 17 00:00:00 2001 From: deostroll Date: Mon, 6 Apr 2020 19:52:06 +0530 Subject: [PATCH 17/24] updated the getExcel function --- common/models/decision-table.js | 4 ++++ test/decision-table-tests.spec.js | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/common/models/decision-table.js b/common/models/decision-table.js index 7365caf..1d9c432 100644 --- a/common/models/decision-table.js +++ b/common/models/decision-table.js @@ -321,6 +321,10 @@ module.exports = function decisionTableFn(decisionTable) { }); decisionTable.getExcel = function (dtJson, options, cb) { + if(typeof cb === 'undefined' && typeof option === 'function') { + cb = options; + options = {}; + } try { let buff = generateExcelBuffer(dtJson); cb(null, buff, 'application/octet-stream'); diff --git a/test/decision-table-tests.spec.js b/test/decision-table-tests.spec.js index 9744b40..2690ecf 100644 --- a/test/decision-table-tests.spec.js +++ b/test/decision-table-tests.spec.js @@ -325,8 +325,8 @@ describe('DecisionTable Model Tests', () => { } else { // console.dir(resp); - expect(buffer).to.be.instanceOf(Buffer); - expect(contentType).to.be.equal('application/octet-stream'); + expect(buffer).to.be.instanceOf(String); + expect(contentType).to.be.equal('text/plain'); done(); } }); From aa77c709472989530299599fde3efc0c584e9a11 Mon Sep 17 00:00:00 2001 From: deostroll Date: Mon, 6 Apr 2020 20:06:18 +0530 Subject: [PATCH 18/24] fixed typo --- common/models/decision-table.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/models/decision-table.js b/common/models/decision-table.js index 1d9c432..8f163c9 100644 --- a/common/models/decision-table.js +++ b/common/models/decision-table.js @@ -321,7 +321,7 @@ module.exports = function decisionTableFn(decisionTable) { }); decisionTable.getExcel = function (dtJson, options, cb) { - if(typeof cb === 'undefined' && typeof option === 'function') { + if(typeof cb === 'undefined' && typeof options === 'function') { cb = options; options = {}; } From 2f2a013511c3aaf60e57130757a624f9a49df96e Mon Sep 17 00:00:00 2001 From: deostroll Date: Mon, 6 Apr 2020 20:12:53 +0530 Subject: [PATCH 19/24] reverted test --- test/decision-table-tests.spec.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/decision-table-tests.spec.js b/test/decision-table-tests.spec.js index 2690ecf..9744b40 100644 --- a/test/decision-table-tests.spec.js +++ b/test/decision-table-tests.spec.js @@ -325,8 +325,8 @@ describe('DecisionTable Model Tests', () => { } else { // console.dir(resp); - expect(buffer).to.be.instanceOf(String); - expect(contentType).to.be.equal('text/plain'); + expect(buffer).to.be.instanceOf(Buffer); + expect(contentType).to.be.equal('application/octet-stream'); done(); } }); From e7bd2d093a7f769ab150b554398481bdce0859f7 Mon Sep 17 00:00:00 2001 From: deostroll Date: Tue, 7 Apr 2020 09:10:50 +0530 Subject: [PATCH 20/24] returning base64 data --- common/models/decision-table.js | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/common/models/decision-table.js b/common/models/decision-table.js index 8f163c9..26f8b89 100644 --- a/common/models/decision-table.js +++ b/common/models/decision-table.js @@ -14,6 +14,7 @@ var assert = require('assert'); var logger = require('oe-logger'); var log = logger('decision-table'); var { generateExcelBuffer } = require('../../lib/excel-helper'); +var prefix = 'data:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;base64,'; // var getError = require('oe-cloud/lib/error-utils').getValidationError; var delimiter = '&SP'; @@ -308,14 +309,10 @@ module.exports = function decisionTableFn(decisionTable) { }, returns: [ { - type: 'file', - root: true, - arg: 'body' - }, - { - arg: 'Content-Type', type: 'string', - http: { target: 'header' } + root: true, + arg: 'body', + description: 'base64 encoded string which encodes the generated excel file' } ] }); @@ -327,9 +324,11 @@ module.exports = function decisionTableFn(decisionTable) { } try { let buff = generateExcelBuffer(dtJson); - cb(null, buff, 'application/octet-stream'); + let base64Data = prefix + buff.toString('base64'); + cb(null, base64Data); } catch (error) { cb(error); } }; }; +; \ No newline at end of file From 047bd3e671363b0327b5e24d373d4e5093054783 Mon Sep 17 00:00:00 2001 From: deostroll Date: Tue, 7 Apr 2020 15:59:04 +0530 Subject: [PATCH 21/24] Support for getExcel and other misc changes - getExcel to download an excel file - changes in code to handle rules yielding undefined so that downstream doesn't break - enrichment to support payload updation also - rule to take effect on property which is supposed to be defaulted even if they are prepopulated in the payload --- lib/enrichment-helpers.js | 20 +++++++++++++----- test/decision-table-tests.spec.js | 7 ++++--- test/payload-enrichment-tests.spec.js | 29 ++++++++++++++++++++++++++- 3 files changed, 47 insertions(+), 9 deletions(-) diff --git a/lib/enrichment-helpers.js b/lib/enrichment-helpers.js index bbc3bec..0673604 100644 --- a/lib/enrichment-helpers.js +++ b/lib/enrichment-helpers.js @@ -19,8 +19,16 @@ function EnrichmentRuleBootFactory(EnrichmentRule, app) { enrichData(ctx, next) { var model = this; // ^ because we have already fixed context - var data = ctx.instance || ctx.data; - var payload = data.__data; + // var data = ctx.instance || ctx.data; + // var payload = data.__data || data; + var payload = null; + if (ctx.currentInstance) { + payload = Object.assign({}, ctx.currentInstance.__data, ctx.data); + } + else { + var data = ctx.instance || ctx.data; + var payload = data.__data || data; + } var filter = { where: { modelName: model.modelName, disabled: false } }; EnrichmentRule.findOne(filter, ctx.options, (err, enrichmentRuleRecord) => { if (err) { @@ -54,9 +62,11 @@ function EnrichmentRuleBootFactory(EnrichmentRule, app) { if (err) { cb(err); } else { - Object.keys(result).forEach(key => { - payload[key] = result[key]; - }); + if (result) { + Object.keys(result).forEach(key => { + payload[key] = result[key]; + }); + } delete payload.options; cb(); } diff --git a/test/decision-table-tests.spec.js b/test/decision-table-tests.spec.js index 9744b40..4663b76 100644 --- a/test/decision-table-tests.spec.js +++ b/test/decision-table-tests.spec.js @@ -3,6 +3,7 @@ var chai = require('chai'); chai.use(require('chai-things')); var loopback = require('loopback'); var expect = chai.expect; +var assert = chai.assert; var fs = require('fs'); var path = require('path'); var bootstrapped = require('./bootstrapper'); @@ -319,14 +320,14 @@ describe('DecisionTable Model Tests', () => { ] }; - DecisionTable.getExcel(dtDesc, testContext, function(err, buffer, contentType){ + DecisionTable.getExcel(dtDesc, testContext, function(err, base64String){ if(err) { done(err) } else { // console.dir(resp); - expect(buffer).to.be.instanceOf(Buffer); - expect(contentType).to.be.equal('application/octet-stream'); + // expect(base64String).to.be.instanceOf(String); + assert.typeOf(base64String, 'string'); done(); } }); diff --git a/test/payload-enrichment-tests.spec.js b/test/payload-enrichment-tests.spec.js index d7e8c81..e3bc28a 100644 --- a/test/payload-enrichment-tests.spec.js +++ b/test/payload-enrichment-tests.spec.js @@ -173,7 +173,8 @@ describe('Payload Enrichment Tests', () => { } }); }); - + var id = null; + var version = null; it('should successfully update a property based on a business rule', done => { var toInsert = { status: 'entered', @@ -187,6 +188,8 @@ describe('Payload Enrichment Tests', () => { // console.error("model-rule-test Error ", err); done(err); } else { + // console.dir(res.id.toString()) + id = res.id.toString(); expect(res).not.to.be.null; expect(res).not.to.be.undefined; expect(res.sex).to.be.equal('F'); @@ -197,4 +200,28 @@ describe('Payload Enrichment Tests', () => { } }); }); + + it('should update the property when a model instance is being updated', done => { + if (id) { + testModel.upsert({ id, age: 9, status: 'accepted' }, testContext, function (err, res) { + if (err) { + done(err) + } + else { + expect(res).not.to.be.null; + expect(res).not.to.be.undefined; + expect(res.sex).to.be.equal('M'); + expect(res.married).to.be.equal(false); + expect(res.phone).to.be.equal(5678); + expect(res.email).to.be.equal('def'); + done(); + } + }) + } + else { + done(new Error("Previous test failed")); + } + }); + + }); From 50e5750e8c694c6450c17d2a2161d95ba7445bab Mon Sep 17 00:00:00 2001 From: deostroll Date: Tue, 7 Apr 2020 16:06:27 +0530 Subject: [PATCH 22/24] lint fixes --- common/models/decision-table.js | 3 +-- lib/enrichment-helpers.js | 5 ++--- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/common/models/decision-table.js b/common/models/decision-table.js index 26f8b89..4921876 100644 --- a/common/models/decision-table.js +++ b/common/models/decision-table.js @@ -318,7 +318,7 @@ module.exports = function decisionTableFn(decisionTable) { }); decisionTable.getExcel = function (dtJson, options, cb) { - if(typeof cb === 'undefined' && typeof options === 'function') { + if (typeof cb === 'undefined' && typeof options === 'function') { cb = options; options = {}; } @@ -331,4 +331,3 @@ module.exports = function decisionTableFn(decisionTable) { } }; }; -; \ No newline at end of file diff --git a/lib/enrichment-helpers.js b/lib/enrichment-helpers.js index 0673604..9f2d546 100644 --- a/lib/enrichment-helpers.js +++ b/lib/enrichment-helpers.js @@ -24,10 +24,9 @@ function EnrichmentRuleBootFactory(EnrichmentRule, app) { var payload = null; if (ctx.currentInstance) { payload = Object.assign({}, ctx.currentInstance.__data, ctx.data); - } - else { + } else { var data = ctx.instance || ctx.data; - var payload = data.__data || data; + payload = data.__data || data; } var filter = { where: { modelName: model.modelName, disabled: false } }; EnrichmentRule.findOne(filter, ctx.options, (err, enrichmentRuleRecord) => { From 9e33e6633bc8ae51add688de1edaddf9d10b9cd6 Mon Sep 17 00:00:00 2001 From: deostroll Date: Tue, 7 Apr 2020 16:09:31 +0530 Subject: [PATCH 23/24] v2.2.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 33d2aa3..fff6775 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "oe-business-rule", - "version": "2.2.0", + "version": "2.2.1", "description": "oe-cloud modularization project aka oecloud.io", "engines": { "node": ">=6" From 8b70d8175f12aa597a0c58d9fec6093f33c1502e Mon Sep 17 00:00:00 2001 From: vamsee Date: Mon, 3 Aug 2020 00:17:34 +0530 Subject: [PATCH 24/24] commit for version 2.3.0 --- package.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index fff6775..bc85bcd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "oe-business-rule", - "version": "2.2.1", + "version": "2.3.0", "description": "oe-cloud modularization project aka oecloud.io", "engines": { "node": ">=6" @@ -15,8 +15,8 @@ }, "dependencies": { "async": "2.6.1", - "js-feel": "git+http://evgit/oecloud.io/feel.git#master", - "oe-common-mixins": "git+http://10.73.97.24/oec-next/oe-common-mixins.git", + "js-feel": "git+http://evgit/oecloud.io/feel.git#1.4.7", + "oe-common-mixins": "git+http://evgit/oecloud.io/oe-common-mixins.git#2.3.0", "serialize-error": "2.0.0" }, "devDependencies": { @@ -32,10 +32,10 @@ "grunt-mocha-istanbul": "5.0.2", "istanbul": "0.4.5", "mocha": "5.2.0", - "oe-cloud": "git+http://evgit/oecloud.io/oe-cloud.git#master", - "oe-connector-mongodb": "git+http://evgit/oecloud.io/oe-connector-mongodb.git#master", - "oe-connector-oracle": "git+http://evgit/oecloud.io/oe-connector-oracle.git#master", - "oe-connector-postgresql": "git+http://evgit/oecloud.io/oe-connector-postgresql.git#master", + "oe-cloud": "git+http://evgit/oecloud.io/oe-cloud.git#2.3.0", + "oe-connector-mongodb": "git+http://evgit/oecloud.io/oe-connector-mongodb.git#2.2.0", + "oe-connector-oracle": "git+http://evgit/oecloud.io/oe-connector-oracle.git#2.3.0", + "oe-connector-postgresql": "git+http://evgit/oecloud.io/oe-connector-postgresql.git#2.3.0", "superagent-defaults": "0.1.14", "supertest": "3.4.2" },