durable_rules 0.34.35 → 0.34.36

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d4dac8eb12717b1ab1df781c340385dd775089e2
4
- data.tar.gz: 203c76635664dfbcabac912ac74093c3a0b5677a
3
+ metadata.gz: 47e6483313e3fe7047cb09fea58da4f5bf3c0c25
4
+ data.tar.gz: fcc1f99df7b9cb4b932af7bb9eb749265c82dfa4
5
5
  SHA512:
6
- metadata.gz: 5f2c2d3e579ad6d486a4c71879baafb6879260c88b80652600c7de7f061fbdb8c4491e2a4facc9331b16709b2de737893a7f0cc95921bd411a56d3a1e5d9ea9f
7
- data.tar.gz: c22086988ac401f2f2a3502dac8151d63e5c02128108325dc4e01b3ec9a4427b9edc67aadff855d8a580a7cee62de0e462c7ff43e0c03811fc0a6f21b8fcb720
6
+ metadata.gz: 32bbe82822555390ca0a164945fb9a1ec6017f14a8f492e2fe5b9e1d6830ae7bc6a5c31e0b9e47017839c9f85cea0b6201875d9c43363acc4e9e845598243783
7
+ data.tar.gz: 1214ab05cdd4ebc38344378394fb7f4cb979b9921a8975701c4389aefc0f6df3d8a7c4b89ef2bbe6e6b3f4909426f2b53c06d10951c1abc8f63fb7a770a5a994
data/librb/durable.rb CHANGED
@@ -175,12 +175,13 @@ module Durable
175
175
  attr_reader :__type, :__op
176
176
  attr_accessor :__name
177
177
 
178
- def initialize(type, left = nil)
178
+ def initialize(type, left = nil, op = nil, right = nil, definitions = nil, name = nil)
179
179
  @__type = type
180
180
  @left = left
181
- @right = nil
182
- @definitions = nil
183
- @__name = nil
181
+ @__op = op
182
+ @right = right
183
+ @definitions = definitions
184
+ @__name = name
184
185
  end
185
186
 
186
187
  def definition(parent_name=nil)
@@ -190,7 +191,7 @@ module Durable
190
191
  new_definition = {@__op => @definitions}
191
192
  else
192
193
  if not @left
193
- raise ArgumentError, "Property for #{@__op} not defined"
194
+ raise ArgumentError, "Property for #{@__type} and #{@__op} not defined"
194
195
  end
195
196
  righ_definition = @right
196
197
  if (@right.kind_of? Expression) || (@right.kind_of? Arithmetic)
@@ -216,63 +217,51 @@ module Durable
216
217
  end
217
218
 
218
219
  def ==(other)
219
- @__op = :$eq
220
- @right = other
221
- self
220
+ Expression.new(@__type, @left, :$eq, other, @definitions, @__name)
222
221
  end
223
222
 
224
223
  def !=(other)
225
- @__op = :$neq
226
- @right = other
227
- self
224
+ Expression.new(@__type, @left, :$neq, other, @definitions, @__name)
228
225
  end
229
226
 
230
227
  def <(other)
231
- @__op = :$lt
232
- @right = other
233
- self
228
+ Expression.new(@__type, @left, :$lt, other, @definitions, @__name)
234
229
  end
235
230
 
236
231
  def <=(other)
237
- @__op = :$lte
238
- @right = other
239
- self
232
+ Expression.new(@__type, @left, :$lte, other, @definitions, @__name)
240
233
  end
241
234
 
242
235
  def >(other)
243
- @__op = :$gt
244
- @right = other
245
- self
236
+ Expression.new(@__type, @left, :$gt, other, @definitions, @__name)
246
237
  end
247
238
 
248
239
  def >=(other)
249
- @__op = :$gte
250
- @right = other
251
- self
240
+ Expression.new(@__type, @left, :$gte, other, @definitions, @__name)
252
241
  end
253
242
 
254
243
  def matches(other)
255
- @__op = :$mt
256
- @right = other
257
- self
244
+ Expression.new(@__type, @left, :$mt, other, @definitions, @__name)
258
245
  end
259
246
 
260
247
  def imatches(other)
261
- @__op = :$imt
262
- @right = other
263
- self
248
+ Expression.new(@__type, @left, :$imt, other, @definitions, @__name)
249
+ end
250
+
251
+ def allItems(other)
252
+ Expression.new(@__type, @left, :$iall, other, @definitions, @__name)
253
+ end
254
+
255
+ def anyItem(other)
256
+ Expression.new(@__type, @left, :$iany, other, @definitions, @__name)
264
257
  end
265
258
 
266
259
  def -@
267
- @__op = :$nex
268
- @right = 1
269
- self
260
+ Expression.new(@__type, @left, :$nex, 1, @definitions, @__name)
270
261
  end
271
262
 
272
263
  def +@
273
- @__op = :$ex
274
- @right = 1
275
- self
264
+ Expression.new(@__type, @left, :$ex, 1, @definitions, @__name)
276
265
  end
277
266
 
278
267
  def |(other)
@@ -440,6 +429,10 @@ module Durable
440
429
  Expression.new(:$m)
441
430
  end
442
431
 
432
+ def item
433
+ Expression.new(:$i, :$i)
434
+ end
435
+
443
436
  def c
444
437
  Closure.new()
445
438
  end
data/librb/engine.rb CHANGED
@@ -435,6 +435,7 @@ module Engine
435
435
  end
436
436
  end
437
437
 
438
+ puts JSON.generate(ruleset_definition)
438
439
  @handle = Rules.create_ruleset name, JSON.generate(ruleset_definition), state_cache_size
439
440
  @definition = ruleset_definition
440
441
  end
data/src/rules/events.c CHANGED
@@ -45,6 +45,8 @@
45
45
  #define OP_NIL_STRING 0x0701
46
46
  #define OP_NIL_NIL 0x0707
47
47
 
48
+ #define HASH_I 1622948014 //$i
49
+
48
50
  typedef struct actionContext {
49
51
  void *rulesBinding;
50
52
  redisReply *reply;
@@ -727,13 +729,12 @@ static unsigned int isMatch(ruleset *tree,
727
729
  unsigned char alphaOp = currentAlpha->operator;
728
730
  unsigned char propertyType = currentProperty->type;
729
731
  unsigned int result = RULES_OK;
730
-
731
732
  *propertyMatch = 0;
732
733
  if (alphaOp == OP_EX) {
733
734
  *propertyMatch = 1;
734
735
  return RULES_OK;
735
736
  }
736
-
737
+
737
738
  rehydrateProperty(currentProperty, message);
738
739
  jsonProperty rightValue;
739
740
  jsonProperty *rightProperty = &rightValue;
@@ -929,6 +930,142 @@ static unsigned int isMatch(ruleset *tree,
929
930
  return result;
930
931
  }
931
932
 
933
+ static unsigned int isArrayMatch(ruleset *tree,
934
+ char *sid,
935
+ char *message,
936
+ jsonObject *messageObject,
937
+ jsonProperty *currentProperty,
938
+ alpha *arrayAlpha,
939
+ unsigned char *propertyMatch,
940
+ void **rulesBinding) {
941
+ *propertyMatch = 0;
942
+ unsigned int result = RULES_OK;
943
+ if (currentProperty->type != JSON_ARRAY) {
944
+ return RULES_OK;
945
+ }
946
+
947
+ char *first = currentProperty->valueString;
948
+ char *last;
949
+ unsigned char type;
950
+ jsonObject jo;
951
+ result = readNextArrayValue(first, &first, &last, &type);
952
+ while (result == PARSE_OK) {
953
+ unsigned short top = 1;
954
+ alpha *stack[MAX_STACK_SIZE];
955
+ stack[0] = arrayAlpha;
956
+ alpha *currentAlpha;
957
+ if (type == JSON_OBJECT) {
958
+ char *next;
959
+ jo.propertiesLength = 0;
960
+ result = constructObject(first,
961
+ "$i",
962
+ NULL,
963
+ JSON_OBJECT_SEQUENCED,
964
+ 0,
965
+ &jo,
966
+ &next);
967
+ if (result != RULES_OK) {
968
+ return result;
969
+ }
970
+ } else {
971
+ jo.propertiesLength = 1;
972
+ jo.properties[0].hash = HASH_I;
973
+ jo.properties[0].type = type;
974
+ jo.properties[0].isMaterial = 0;
975
+ jo.properties[0].valueString = first;
976
+ jo.properties[0].valueLength = last - first;
977
+ jo.properties[0].nameLength = 2;
978
+ strcpy(jo.properties[0].name, "$i");
979
+ }
980
+
981
+ while (top) {
982
+ --top;
983
+ currentAlpha = stack[top];
984
+ if (currentAlpha->nextListOffset) {
985
+ unsigned int *nextList = &tree->nextPool[currentAlpha->nextListOffset];
986
+ for (unsigned int entry = 0; nextList[entry] != 0; ++entry) {
987
+ node *listNode = &tree->nodePool[nextList[entry]];
988
+ char exists = 0;
989
+ for(unsigned int propertyIndex = 0; propertyIndex < jo.propertiesLength; ++propertyIndex) {
990
+ if (listNode->value.a.hash == jo.properties[propertyIndex].hash) {
991
+ exists = 1;
992
+ break;
993
+ }
994
+ }
995
+
996
+ if (!exists) {
997
+ if (top == MAX_STACK_SIZE) {
998
+ return ERR_MAX_STACK_SIZE;
999
+ }
1000
+
1001
+ stack[top] = &listNode->value.a;
1002
+ ++top;
1003
+ }
1004
+ }
1005
+ }
1006
+
1007
+ if (currentAlpha->nextOffset) {
1008
+ unsigned int *nextHashset = &tree->nextPool[currentAlpha->nextOffset];
1009
+ for(unsigned int propertyIndex = 0; propertyIndex < jo.propertiesLength; ++propertyIndex) {
1010
+ jsonProperty *currentProperty = &jo.properties[propertyIndex];
1011
+ for (unsigned int entry = currentProperty->hash & HASH_MASK; nextHashset[entry] != 0; entry = (entry + 1) % NEXT_BUCKET_LENGTH) {
1012
+ node *hashNode = &tree->nodePool[nextHashset[entry]];
1013
+ if (currentProperty->hash == hashNode->value.a.hash) {
1014
+ unsigned char match = 0;
1015
+ if (hashNode->value.a.operator == OP_IALL || hashNode->value.a.operator == OP_IANY) {
1016
+ result = isArrayMatch(tree,
1017
+ sid,
1018
+ message,
1019
+ messageObject,
1020
+ currentProperty,
1021
+ &hashNode->value.a,
1022
+ &match,
1023
+ rulesBinding);
1024
+ } else {
1025
+ result = isMatch(tree,
1026
+ sid,
1027
+ message,
1028
+ messageObject,
1029
+ currentProperty,
1030
+ &hashNode->value.a,
1031
+ &match,
1032
+ rulesBinding);
1033
+ }
1034
+
1035
+ if (result != RULES_OK) {
1036
+ return result;
1037
+ }
1038
+
1039
+ if (match) {
1040
+ if (top == MAX_STACK_SIZE) {
1041
+ return ERR_MAX_STACK_SIZE;
1042
+ }
1043
+
1044
+ stack[top] = &hashNode->value.a;
1045
+ ++top;
1046
+ }
1047
+ }
1048
+ }
1049
+ }
1050
+ }
1051
+
1052
+ if(currentAlpha->betaListOffset && currentAlpha != arrayAlpha) {
1053
+ *propertyMatch = 1;
1054
+ break;
1055
+ }
1056
+ }
1057
+
1058
+ if ((arrayAlpha->operator == OP_IALL && !*propertyMatch) ||
1059
+ (arrayAlpha->operator == OP_IANY && *propertyMatch)) {
1060
+ break;
1061
+ }
1062
+
1063
+ result = readNextArrayValue(last, &first, &last, &type);
1064
+ }
1065
+
1066
+ return (result == PARSE_END ? RULES_OK: result);
1067
+ }
1068
+
932
1069
  static unsigned int handleAlpha(ruleset *tree,
933
1070
  char *sid,
934
1071
  char *mid,
@@ -941,7 +1078,7 @@ static unsigned int handleAlpha(ruleset *tree,
941
1078
  char **addKeys,
942
1079
  unsigned int *addCount,
943
1080
  char **removeCommand,
944
- void **rulesBinding) {
1081
+ void **rulesBinding) {
945
1082
  unsigned int result = ERR_EVENT_NOT_HANDLED;
946
1083
  unsigned short top = 1;
947
1084
  unsigned int entry;
@@ -965,7 +1102,6 @@ static unsigned int handleAlpha(ruleset *tree,
965
1102
 
966
1103
  if (!exists) {
967
1104
  if (top == MAX_STACK_SIZE) {
968
- printf("exiting 1\n");
969
1105
  return ERR_MAX_STACK_SIZE;
970
1106
  }
971
1107
 
@@ -990,14 +1126,27 @@ static unsigned int handleAlpha(ruleset *tree,
990
1126
  ++top;
991
1127
  } else {
992
1128
  unsigned char match = 0;
993
- unsigned int mresult = isMatch(tree,
994
- sid,
995
- message,
996
- jo,
997
- currentProperty,
998
- &hashNode->value.a,
999
- &match,
1000
- rulesBinding);
1129
+ unsigned int mresult = RULES_OK;
1130
+ if (hashNode->value.a.operator == OP_IALL || hashNode->value.a.operator == OP_IANY) {
1131
+ mresult = isArrayMatch(tree,
1132
+ sid,
1133
+ message,
1134
+ jo,
1135
+ currentProperty,
1136
+ &hashNode->value.a,
1137
+ &match,
1138
+ rulesBinding);
1139
+ } else {
1140
+ mresult = isMatch(tree,
1141
+ sid,
1142
+ message,
1143
+ jo,
1144
+ currentProperty,
1145
+ &hashNode->value.a,
1146
+ &match,
1147
+ rulesBinding);
1148
+ }
1149
+
1001
1150
  if (mresult != RULES_OK){
1002
1151
  return mresult;
1003
1152
  }
data/src/rules/rete.c CHANGED
@@ -21,6 +21,8 @@
21
21
  #define HASH_NEQ 2488026869 // $neq
22
22
  #define HASH_MT 576092554 // $mt
23
23
  #define HASH_IMT 1472564215 // $imt
24
+ #define HASH_IALL 3261766877 // $iall
25
+ #define HASH_IANY 3379504400 // $iany
24
26
  #define HASH_EX 373481198 // $ex
25
27
  #define HASH_NEX 2605470202 // $nex
26
28
  #define HASH_OR 340911698 // $or
@@ -615,6 +617,12 @@ static unsigned int validateExpression(char *rule) {
615
617
  case HASH_IMT:
616
618
  operator = OP_IMT;
617
619
  break;
620
+ case HASH_IALL:
621
+ operator = OP_IALL;
622
+ break;
623
+ case HASH_IANY:
624
+ operator = OP_IANY;
625
+ break;
618
626
  case HASH_LT:
619
627
  operator = OP_LT;
620
628
  break;
@@ -665,6 +673,11 @@ static unsigned int validateExpression(char *rule) {
665
673
  return result;
666
674
  }
667
675
 
676
+ if (operator == OP_IALL || operator == OP_IANY) {
677
+ result = validateExpression(first);
678
+ return result;
679
+ }
680
+
668
681
  if (operator == OP_MT || operator == OP_IMT) {
669
682
  if (type != JSON_STRING) {
670
683
  return ERR_UNEXPECTED_TYPE;
@@ -825,8 +838,7 @@ static unsigned int linkAlpha(ruleset *tree,
825
838
  }
826
839
 
827
840
  parentBetaList[entry] = nextOffset;
828
- }
829
- else if (nextNode->value.a.operator == OP_NEX) {
841
+ } else if (nextNode->value.a.operator == OP_NEX) {
830
842
  result = ensureNextList(tree, parentAlpha);
831
843
  if (result != RULES_OK) {
832
844
  return result;
@@ -841,8 +853,7 @@ static unsigned int linkAlpha(ruleset *tree,
841
853
  }
842
854
 
843
855
  parentNextList[entry] = nextOffset;
844
- }
845
- else {
856
+ } else {
846
857
  result = ensureNextHashset(tree, parentAlpha);
847
858
  if (result != RULES_OK) {
848
859
  return result;
@@ -896,8 +907,7 @@ static unsigned int readReference(ruleset *tree, char *rule, unsigned char *idio
896
907
  if (result != RULES_OK) {
897
908
  return result;
898
909
  }
899
- }
900
- else {
910
+ } else {
901
911
  readNextValue(last, &first, &last, &type);
902
912
  result = readNextName(first, &first, &last, &hash);
903
913
  while (result == PARSE_OK) {
@@ -1034,7 +1044,7 @@ static unsigned int findAlpha(ruleset *tree,
1034
1044
 
1035
1045
  readNextName(rule, &firstName, &lastName, &hash);
1036
1046
  readNextValue(lastName, &first, &last, &type);
1037
- if (type == JSON_OBJECT) {
1047
+ if (type == JSON_OBJECT && operator != OP_IALL && operator != OP_IANY) {
1038
1048
  result = readIdiom(tree, first, &type, &idiomOffset, &ref);
1039
1049
  if (result != RULES_OK) {
1040
1050
  return result;
@@ -1049,9 +1059,11 @@ static unsigned int findAlpha(ruleset *tree,
1049
1059
  node *currentNode = &tree->nodePool[parentNext[entry]];
1050
1060
  if (currentNode->value.a.hash == hash &&
1051
1061
  currentNode->value.a.operator == operator) {
1052
- if (compareValue(tree, &currentNode->value.a.right, first, last, &ref, type)) {
1053
- *resultOffset = parentNext[entry];
1054
- return RULES_OK;
1062
+ if (operator != OP_IALL && operator != OP_IANY) {
1063
+ if (compareValue(tree, &currentNode->value.a.right, first, last, &ref, type)) {
1064
+ *resultOffset = parentNext[entry];
1065
+ return RULES_OK;
1066
+ }
1055
1067
  }
1056
1068
  }
1057
1069
  }
@@ -1061,11 +1073,13 @@ static unsigned int findAlpha(ruleset *tree,
1061
1073
  parentNext = &tree->nextPool[parent->value.a.nextListOffset];
1062
1074
  for (entry = 0; parentNext[entry] != 0; ++entry) {
1063
1075
  node *currentNode = &tree->nodePool[parentNext[entry]];
1064
- if (currentNode->value.a.hash == hash&&
1076
+ if (currentNode->value.a.hash == hash &&
1065
1077
  currentNode->value.a.operator == operator) {
1066
- if (compareValue(tree, &currentNode->value.a.right, first, last, &ref, type)) {
1067
- *resultOffset = parentNext[entry];
1068
- return RULES_OK;
1078
+ if (operator != OP_IALL && operator != OP_IANY) {
1079
+ if (compareValue(tree, &currentNode->value.a.right, first, last, &ref, type)) {
1080
+ *resultOffset = parentNext[entry];
1081
+ return RULES_OK;
1082
+ }
1069
1083
  }
1070
1084
  }
1071
1085
  }
@@ -1095,17 +1109,21 @@ static unsigned int findAlpha(ruleset *tree,
1095
1109
  type = JSON_IREGEX;
1096
1110
  }
1097
1111
 
1098
- result = copyValue(tree, &newAlpha->value.a.right, first, last, idiomOffset, &ref, type);
1099
- if (result != RULES_OK) {
1100
- return result;
1101
- }
1102
-
1103
- if (type == JSON_EVENT_PROPERTY || type == JSON_EVENT_IDIOM) {
1104
- result = appendTerm(expr, *resultOffset);
1112
+ if (operator == OP_IANY || operator == OP_IALL) {
1113
+ type = JSON_NIL;
1114
+ } else {
1115
+ result = copyValue(tree, &newAlpha->value.a.right, first, last, idiomOffset, &ref, type);
1105
1116
  if (result != RULES_OK) {
1106
1117
  return result;
1107
1118
  }
1108
- }
1119
+
1120
+ if (type == JSON_EVENT_PROPERTY || type == JSON_EVENT_IDIOM) {
1121
+ result = appendTerm(expr, *resultOffset);
1122
+ if (result != RULES_OK) {
1123
+ return result;
1124
+ }
1125
+ }
1126
+ }
1109
1127
 
1110
1128
  return linkAlpha(tree, parentOffset, *resultOffset);
1111
1129
  }
@@ -1184,6 +1202,12 @@ static unsigned int createAlpha(ruleset *tree,
1184
1202
  case HASH_IMT:
1185
1203
  operator = OP_IMT;
1186
1204
  break;
1205
+ case HASH_IALL:
1206
+ operator = OP_IALL;
1207
+ break;
1208
+ case HASH_IANY:
1209
+ operator = OP_IANY;
1210
+ break;
1187
1211
  case HASH_LT:
1188
1212
  operator = OP_LT;
1189
1213
  break;
@@ -1268,6 +1292,23 @@ static unsigned int createAlpha(ruleset *tree,
1268
1292
  readNextValue(last, &first, &last, &type);
1269
1293
  }
1270
1294
 
1295
+ if (operator == OP_IANY || operator == OP_IALL) {
1296
+ unsigned int result = findAlpha(tree, parentOffset, operator, first, expr, newOffset);
1297
+ if (result != RULES_OK) {
1298
+ return result;
1299
+ }
1300
+
1301
+ unsigned int inner_offset = *newOffset;
1302
+ readNextName(first, &first, &last, &hash);
1303
+ readNextValue(last, &first, &last, &type);
1304
+ result = createAlpha(tree, first, expr, nextOffset, &inner_offset);
1305
+ if (result != RULES_OK) {
1306
+ return result;
1307
+ }
1308
+
1309
+ return linkAlpha(tree, *newOffset, nextOffset);
1310
+ }
1311
+
1271
1312
  if (nextOffset == 0) {
1272
1313
  return findAlpha(tree, parentOffset, operator, first, expr, newOffset);
1273
1314
  } else {
@@ -1662,6 +1703,66 @@ static unsigned int fixupQueries(ruleset *tree, unsigned int actionOffset, char*
1662
1703
  return RULES_OK;
1663
1704
  }
1664
1705
 
1706
+ #ifdef _PRINT
1707
+
1708
+ static void printActionNode(ruleset *tree, node *actionNode, int level) {
1709
+ for (int i = 0; i < level; ++ i) {
1710
+ printf(" ");
1711
+ }
1712
+
1713
+ printf("-> action: name %s, count %d, cap %d, priority %d\n",
1714
+ &tree->stringPool[actionNode->nameOffset],
1715
+ actionNode->value.c.count,
1716
+ actionNode->value.c.cap,
1717
+ actionNode->value.c.priority);
1718
+ }
1719
+
1720
+ static void printBetaNode(ruleset *tree, node *betaNode, int level) {
1721
+ for (int i = 0; i < level; ++ i) {
1722
+ printf(" ");
1723
+ }
1724
+
1725
+ printf("-> beta: name %s, not %d\n", &tree->stringPool[betaNode->nameOffset], betaNode->value.b.not);
1726
+ node *currentNode = &tree->nodePool[betaNode->value.b.nextOffset];
1727
+ if (currentNode->type == NODE_ACTION) {
1728
+ printActionNode(tree, currentNode, level + 1);
1729
+ } else {
1730
+ printBetaNode(tree, currentNode, level + 1);
1731
+ }
1732
+ }
1733
+
1734
+ static void printAlphaNode(ruleset *tree, node *alphaNode, int level) {
1735
+ for (int i = 0; i < level; ++ i) {
1736
+ printf(" ");
1737
+ }
1738
+
1739
+ printf("-> alpha: name %s, operator %x\n", &tree->stringPool[alphaNode->nameOffset], alphaNode->value.a.operator);
1740
+ if (alphaNode->value.a.nextOffset) {
1741
+ unsigned int *nextHashset = &tree->nextPool[alphaNode->value.a.nextOffset];
1742
+ for (unsigned int entry = 0; entry < NEXT_BUCKET_LENGTH; ++entry) {
1743
+ if (nextHashset[entry]) {
1744
+ printAlphaNode(tree, &tree->nodePool[nextHashset[entry]], level + 1);
1745
+ }
1746
+ }
1747
+ }
1748
+
1749
+ if (alphaNode->value.a.nextListOffset) {
1750
+ unsigned int *nextList = &tree->nextPool[alphaNode->value.a.nextListOffset];
1751
+ for (unsigned int entry = 0; nextList[entry] != 0; ++entry) {
1752
+ printAlphaNode(tree, &tree->nodePool[nextList[entry]], level + 1);
1753
+ }
1754
+ }
1755
+
1756
+ if (alphaNode->value.a.betaListOffset) {
1757
+ unsigned int *betaList = &tree->nextPool[alphaNode->value.a.betaListOffset];
1758
+ for (unsigned int entry = 0; betaList[entry] != 0; ++entry) {
1759
+ printBetaNode(tree, &tree->nodePool[betaList[entry]], level + 1);
1760
+ }
1761
+ }
1762
+ }
1763
+
1764
+ #endif
1765
+
1665
1766
  static unsigned int createTree(ruleset *tree, char *rules) {
1666
1767
  char *first;
1667
1768
  char *last;
@@ -1706,12 +1807,11 @@ static unsigned int createTree(ruleset *tree, char *rules) {
1706
1807
  readNextValue(lastName, &first, &lastRuleValue, &type);
1707
1808
  ruleAction->value.c.priority = 0;
1708
1809
  ruleAction->value.c.count = 0;
1709
- ruleAction->value.c.span = 0;
1710
1810
  ruleAction->value.c.cap = 0;
1711
1811
  getSetting(HASH_PRI, first, &ruleAction->value.c.priority);
1712
1812
  getSetting(HASH_COUNT, first, &ruleAction->value.c.count);
1713
1813
  getSetting(HASH_CAP, first, &ruleAction->value.c.cap);
1714
- if (!ruleAction->value.c.count && !ruleAction->value.c.span && !ruleAction->value.c.cap) {
1814
+ if (!ruleAction->value.c.count && !ruleAction->value.c.cap) {
1715
1815
  ruleAction->value.c.count = 1;
1716
1816
  }
1717
1817
 
@@ -1741,6 +1841,10 @@ static unsigned int createTree(ruleset *tree, char *rules) {
1741
1841
  result = readNextName(lastRuleValue, &firstName, &lastName, &hash);
1742
1842
  }
1743
1843
 
1844
+ #ifdef _PRINT
1845
+ printAlphaNode(tree, &tree->nodePool[NODE_M_OFFSET], 0);
1846
+ #endif
1847
+
1744
1848
  return RULES_OK;
1745
1849
  }
1746
1850
 
data/src/rules/rete.h CHANGED
@@ -22,6 +22,8 @@
22
22
  #define OP_NOT 0x13
23
23
  #define OP_MT 0x14
24
24
  #define OP_IMT 0x15
25
+ #define OP_IALL 0x16
26
+ #define OP_IANY 0x17
25
27
 
26
28
  #define NODE_ALPHA 0
27
29
  #define NODE_BETA_CONNECTOR 1
@@ -93,7 +95,6 @@ typedef struct betaConnector {
93
95
 
94
96
  typedef struct action {
95
97
  unsigned int index;
96
- unsigned short span;
97
98
  unsigned short count;
98
99
  unsigned short cap;
99
100
  unsigned short priority;
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: durable_rules
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.34.35
4
+ version: 0.34.36
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jesus Ruiz
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-06-12 00:00:00.000000000 Z
11
+ date: 2017-06-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake