Skip to content

Commit 203c26f

Browse files
committed
Fixes couchbaselabs#6: Update mergeExpr's to match all expressions.
A bug existed in the original mergeExpr implementation where it would generate an OR in the binary tree, causing the matcher to short-circuit without evaluating other expressions as soon as a single one of the merged expressions matched.
1 parent 7fa05a3 commit 203c26f

File tree

2 files changed

+14
-1
lines changed

2 files changed

+14
-1
lines changed

bintree.go

+13
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ const (
1515
nodeTypeOr
1616
nodeTypeAnd
1717
nodeTypeNot
18+
nodeTypeNeor
1819
)
1920

2021
func binTreeNodeTypeToString(nodeType BinTreeNodeType) string {
@@ -27,6 +28,8 @@ func binTreeNodeTypeToString(nodeType BinTreeNodeType) string {
2728
return "and"
2829
case nodeTypeNot:
2930
return "not"
31+
case nodeTypeNeor:
32+
return "neor"
3033
}
3134
return "??ERROR??"
3235
}
@@ -155,6 +158,7 @@ func (tree *binTree) validateItem(item int, parent int) (int, error) {
155158
case nodeTypeAnd:
156159
case nodeTypeOr:
157160
case nodeTypeNot:
161+
case nodeTypeNeor:
158162
default:
159163
// Invalid node type
160164
return -1, errors.New("unexpected node type")
@@ -311,6 +315,15 @@ func (state *binTreeState) checkNode(index int) {
311315
state.MarkNode(index, false)
312316
}
313317
return
318+
} else if defNode.NodeType == nodeTypeNeor {
319+
if state.data[defNode.Left] != binTreeStateUnknown && state.data[defNode.Right] != binTreeStateUnknown {
320+
if state.data[defNode.Left] == binTreeStateTrue || state.data[defNode.Right] == binTreeStateTrue {
321+
state.MarkNode(index, true)
322+
} else {
323+
state.MarkNode(index, false)
324+
}
325+
}
326+
return
314327
} else if defNode.NodeType == nodeTypeAnd {
315328
if state.data[defNode.Left] == binTreeStateTrue && state.data[defNode.Right] == binTreeStateTrue {
316329
state.MarkNode(index, true)

transform.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -304,7 +304,7 @@ func (t *Transformer) transformMergePiece(expr mergeExpr, i int) *ExecNode {
304304
}
305305

306306
baseBucketIdx := t.ActiveBucketIdx
307-
t.RootTree.data[baseBucketIdx].NodeType = nodeTypeOr
307+
t.RootTree.data[baseBucketIdx].NodeType = nodeTypeNeor
308308

309309
t.newBucket()
310310
expr.bucketIDs[i] = t.ActiveBucketIdx

0 commit comments

Comments
 (0)