1 | 'use strict';
|
2 |
|
3 | Object.defineProperty(exports, "__esModule", {
|
4 | value: true
|
5 | });
|
6 | exports.distribution = exports.reduceDecisionRules = exports.formatProperty = exports.formatDecisionRules = undefined;
|
7 | exports.decide = decide;
|
8 | exports.getDecisionRulesProperties = getDecisionRulesProperties;
|
9 | exports.decideFromContextsArray = decideFromContextsArray;
|
10 |
|
11 | var _lodash = require('lodash');
|
12 |
|
13 | var _lodash2 = _interopRequireDefault(_lodash);
|
14 |
|
15 | var _context = require('./context');
|
16 |
|
17 | var _context2 = _interopRequireDefault(_context);
|
18 |
|
19 | var _interpreter_v = require('./interpreter_v1');
|
20 |
|
21 | var _parse4 = require('./parse');
|
22 |
|
23 | var _parse5 = _interopRequireDefault(_parse4);
|
24 |
|
25 | var _reducer = require('./reducer');
|
26 |
|
27 | var _semver = require('semver');
|
28 |
|
29 | var _semver2 = _interopRequireDefault(_semver);
|
30 |
|
31 | var _errors = require('./errors');
|
32 |
|
33 | var _interpreter_v2 = require('./interpreter_v2');
|
34 |
|
35 | var _formatter = require('./formatter');
|
36 |
|
37 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
38 |
|
39 | function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
|
40 |
|
41 | var DECISION_FORMAT_VERSION = '1.1.0';
|
42 |
|
43 | function decide(tree) {
|
44 | var _parse = (0, _parse5.default)(tree),
|
45 | _version = _parse._version,
|
46 | configuration = _parse.configuration,
|
47 | trees = _parse.trees;
|
48 |
|
49 | for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
|
50 | args[_key - 1] = arguments[_key];
|
51 | }
|
52 |
|
53 | var ctx = configuration ? _context2.default.apply(undefined, [configuration].concat(args)) : _lodash2.default.extend.apply(_lodash2.default, [{}].concat(args));
|
54 | return _decide(configuration, trees, ctx, _version);
|
55 | }
|
56 |
|
57 | function _decide(configuration, trees, ctx, _version) {
|
58 | if (_semver2.default.satisfies(_version, '>=1.0.0 <2.0.0')) {
|
59 | return (0, _interpreter_v.decide)(configuration, trees, ctx);
|
60 | }
|
61 | if (_semver2.default.satisfies(_version, '>=2.0.0 <3.0.0')) {
|
62 | return (0, _interpreter_v2.decide)(configuration, trees, ctx);
|
63 | }
|
64 | throw new _errors.CraftAiDecisionError('Invalid decision tree format, "' + _version + '" is not a valid version.');
|
65 | }
|
66 |
|
67 | function reduceNodes(tree, fn, initialAccValue) {
|
68 | var nodes = [];
|
69 | nodes.push(tree);
|
70 | var recursiveNext = function recursiveNext(acc) {
|
71 | if (nodes.length == 0) {
|
72 |
|
73 | return acc;
|
74 | }
|
75 |
|
76 | var node = nodes.pop();
|
77 | if (node.children) {
|
78 | nodes = node.children.concat(nodes);
|
79 | }
|
80 |
|
81 | var updatedAcc = fn(acc, node);
|
82 | return recursiveNext(updatedAcc);
|
83 | };
|
84 | return recursiveNext(initialAccValue);
|
85 | }
|
86 |
|
87 | function getDecisionRulesProperties(tree) {
|
88 | var _parse2 = (0, _parse5.default)(tree),
|
89 | configuration = _parse2.configuration,
|
90 | trees = _parse2.trees;
|
91 |
|
92 | return (0, _lodash2.default)(trees).values().reduce(function (properties, tree) {
|
93 | return reduceNodes(tree, function (properties, node) {
|
94 | if (node.children) {
|
95 |
|
96 | return properties.concat(node.children[0].decision_rule.property);
|
97 | }
|
98 | return properties;
|
99 | }, properties);
|
100 | }, (0, _lodash2.default)([])).uniq().map(function (property) {
|
101 | return _lodash2.default.extend(configuration.context[property], {
|
102 | property: property
|
103 | });
|
104 | }).value();
|
105 | }
|
106 |
|
107 | function decideFromContextsArray(tree, contexts) {
|
108 | var _parse3 = (0, _parse5.default)(tree),
|
109 | _version = _parse3._version,
|
110 | configuration = _parse3.configuration,
|
111 | trees = _parse3.trees;
|
112 |
|
113 | return _lodash2.default.map(contexts, function (contextsItem) {
|
114 | var ctx = void 0;
|
115 | if (_lodash2.default.isArray(contextsItem)) {
|
116 | ctx = _context2.default.apply(undefined, [configuration].concat(_toConsumableArray(contextsItem)));
|
117 | } else {
|
118 | ctx = (0, _context2.default)(configuration, contextsItem);
|
119 | }
|
120 | try {
|
121 | return _decide(configuration, trees, ctx, _version);
|
122 | } catch (error) {
|
123 | if (error instanceof _errors.CraftAiNullDecisionError) {
|
124 | var message = error.message,
|
125 | metadata = error.metadata;
|
126 |
|
127 | return {
|
128 | _version: DECISION_FORMAT_VERSION,
|
129 | context: ctx,
|
130 | error: { message: message, metadata: metadata }
|
131 | };
|
132 | } else {
|
133 | throw error;
|
134 | }
|
135 | }
|
136 | });
|
137 | }
|
138 |
|
139 | exports.formatDecisionRules = _formatter.formatDecisionRules;
|
140 | exports.formatProperty = _formatter.formatProperty;
|
141 | exports.reduceDecisionRules = _reducer.reduceDecisionRules;
|
142 | exports.distribution = _interpreter_v2.distribution; |
\ | No newline at end of file |