From def70ca12e784547feb03cf671a061b10345c814 Mon Sep 17 00:00:00 2001 From: Matei Chiperi Date: Wed, 27 Aug 2014 14:48:30 -0700 Subject: [PATCH] Exposed Except (alias Difference) operator in Gremlin API. --- query/gremlin/build_iterator.go | 19 ++++++++++++------- query/gremlin/traversals.go | 3 ++- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/query/gremlin/build_iterator.go b/query/gremlin/build_iterator.go index 11fd453..5d285de 100644 --- a/query/gremlin/build_iterator.go +++ b/query/gremlin/build_iterator.go @@ -299,14 +299,19 @@ func buildIteratorTreeHelper(obj *otto.Object, ts graph.TripleStore, base graph. case "in": it = buildInOutIterator(obj, ts, subIt, true) case "not": - // arg, _ := obj.Get("_gremlin_values") - // firstArg, _ := arg.Object().Get("0") - // if !isVertexChain(firstArg.Object()) { - // return iterator.NewNull() - // } - // forbiddenIt := buildIteratorTree(firstArg.Object(), ts) + arg, _ := obj.Get("_gremlin_values") + firstArg, _ := arg.Object().Get("0") + if !isVertexChain(firstArg.Object()) { + return iterator.NewNull() + } - it = iterator.NewNot(ts, subIt) + toComplementIt := buildIteratorTree(firstArg.Object(), ts) + notIt := iterator.NewNot(ts, toComplementIt) + + and := iterator.NewAnd() + and.AddSubIterator(subIt) + and.AddSubIterator(notIt) + it = and case "loop": arg, _ := obj.Get("_gremlin_values") firstArg, _ := arg.Object().Get("0") diff --git a/query/gremlin/traversals.go b/query/gremlin/traversals.go index 83d3853..e22a5c6 100644 --- a/query/gremlin/traversals.go +++ b/query/gremlin/traversals.go @@ -39,7 +39,8 @@ func (wk *worker) embedTraversals(env *otto.Otto, obj *otto.Object) { obj.Set("Save", wk.gremlinFunc("save", obj, env)) obj.Set("SaveR", wk.gremlinFunc("saver", obj, env)) obj.Set("Loop", wk.gremlinFunc("loop", obj, env)) - obj.Set("Not", wk.gremlinFunc("not", obj, env)) + obj.Set("Except", wk.gremlinFunc("not", obj, env)) + obj.Set("Difference", wk.gremlinFunc("not", obj, env)) } func (wk *worker) gremlinFunc(kind string, prev *otto.Object, env *otto.Otto) func(otto.FunctionCall) otto.Value {