refactor: simplify optional selector handling
Let Select() handle optional selectors by checking its nil return value, rather than explicitly checking IsOptional() Applied this pattern consistently across all statement kinds (Equal, Like, All, Any, etc)
This commit is contained in:
@@ -71,56 +71,56 @@ func matchStatement(cur Statement, node ipld.Node) (_ matchResult, leafMost Stat
|
|||||||
case KindEqual:
|
case KindEqual:
|
||||||
if s, ok := cur.(equality); ok {
|
if s, ok := cur.(equality); ok {
|
||||||
res, err := s.selector.Select(node)
|
res, err := s.selector.Select(node)
|
||||||
if err != nil || res == nil {
|
if err != nil {
|
||||||
if s.selector.IsOptional() {
|
|
||||||
return matchResultTrue, nil
|
|
||||||
}
|
|
||||||
return matchResultNoData, cur
|
return matchResultNoData, cur
|
||||||
}
|
}
|
||||||
|
if res == nil { // Optional selector that didn't match
|
||||||
|
return matchResultTrue, nil
|
||||||
|
}
|
||||||
return boolToRes(datamodel.DeepEqual(s.value, res))
|
return boolToRes(datamodel.DeepEqual(s.value, res))
|
||||||
}
|
}
|
||||||
case KindGreaterThan:
|
case KindGreaterThan:
|
||||||
if s, ok := cur.(equality); ok {
|
if s, ok := cur.(equality); ok {
|
||||||
res, err := s.selector.Select(node)
|
res, err := s.selector.Select(node)
|
||||||
if err != nil || res == nil {
|
if err != nil {
|
||||||
if s.selector.IsOptional() {
|
|
||||||
return matchResultTrue, nil
|
|
||||||
}
|
|
||||||
return matchResultNoData, cur
|
return matchResultNoData, cur
|
||||||
}
|
}
|
||||||
|
if res == nil {
|
||||||
|
return matchResultTrue, nil
|
||||||
|
}
|
||||||
return boolToRes(isOrdered(s.value, res, gt))
|
return boolToRes(isOrdered(s.value, res, gt))
|
||||||
}
|
}
|
||||||
case KindGreaterThanOrEqual:
|
case KindGreaterThanOrEqual:
|
||||||
if s, ok := cur.(equality); ok {
|
if s, ok := cur.(equality); ok {
|
||||||
res, err := s.selector.Select(node)
|
res, err := s.selector.Select(node)
|
||||||
if err != nil || res == nil {
|
if err != nil {
|
||||||
if s.selector.IsOptional() {
|
|
||||||
return matchResultTrue, nil
|
|
||||||
}
|
|
||||||
return matchResultNoData, cur
|
return matchResultNoData, cur
|
||||||
}
|
}
|
||||||
|
if res == nil {
|
||||||
|
return matchResultTrue, nil
|
||||||
|
}
|
||||||
return boolToRes(isOrdered(s.value, res, gte))
|
return boolToRes(isOrdered(s.value, res, gte))
|
||||||
}
|
}
|
||||||
case KindLessThan:
|
case KindLessThan:
|
||||||
if s, ok := cur.(equality); ok {
|
if s, ok := cur.(equality); ok {
|
||||||
res, err := s.selector.Select(node)
|
res, err := s.selector.Select(node)
|
||||||
if err != nil || res == nil {
|
if err != nil {
|
||||||
if s.selector.IsOptional() {
|
|
||||||
return matchResultTrue, nil
|
|
||||||
}
|
|
||||||
return matchResultNoData, cur
|
return matchResultNoData, cur
|
||||||
}
|
}
|
||||||
|
if res == nil {
|
||||||
|
return matchResultTrue, nil
|
||||||
|
}
|
||||||
return boolToRes(isOrdered(s.value, res, lt))
|
return boolToRes(isOrdered(s.value, res, lt))
|
||||||
}
|
}
|
||||||
case KindLessThanOrEqual:
|
case KindLessThanOrEqual:
|
||||||
if s, ok := cur.(equality); ok {
|
if s, ok := cur.(equality); ok {
|
||||||
res, err := s.selector.Select(node)
|
res, err := s.selector.Select(node)
|
||||||
if err != nil || res == nil {
|
if err != nil {
|
||||||
if s.selector.IsOptional() {
|
|
||||||
return matchResultTrue, nil
|
|
||||||
}
|
|
||||||
return matchResultNoData, cur
|
return matchResultNoData, cur
|
||||||
}
|
}
|
||||||
|
if res == nil {
|
||||||
|
return matchResultTrue, nil
|
||||||
|
}
|
||||||
return boolToRes(isOrdered(s.value, res, lte))
|
return boolToRes(isOrdered(s.value, res, lte))
|
||||||
}
|
}
|
||||||
case KindNot:
|
case KindNot:
|
||||||
@@ -171,9 +171,12 @@ func matchStatement(cur Statement, node ipld.Node) (_ matchResult, leafMost Stat
|
|||||||
case KindLike:
|
case KindLike:
|
||||||
if s, ok := cur.(wildcard); ok {
|
if s, ok := cur.(wildcard); ok {
|
||||||
res, err := s.selector.Select(node)
|
res, err := s.selector.Select(node)
|
||||||
if err != nil || res == nil {
|
if err != nil {
|
||||||
return matchResultNoData, cur
|
return matchResultNoData, cur
|
||||||
}
|
}
|
||||||
|
if res == nil {
|
||||||
|
return matchResultTrue, nil
|
||||||
|
}
|
||||||
v, err := res.AsString()
|
v, err := res.AsString()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return matchResultFalse, cur // not a string
|
return matchResultFalse, cur // not a string
|
||||||
@@ -183,9 +186,12 @@ func matchStatement(cur Statement, node ipld.Node) (_ matchResult, leafMost Stat
|
|||||||
case KindAll:
|
case KindAll:
|
||||||
if s, ok := cur.(quantifier); ok {
|
if s, ok := cur.(quantifier); ok {
|
||||||
res, err := s.selector.Select(node)
|
res, err := s.selector.Select(node)
|
||||||
if err != nil || res == nil {
|
if err != nil {
|
||||||
return matchResultNoData, cur
|
return matchResultNoData, cur
|
||||||
}
|
}
|
||||||
|
if res == nil {
|
||||||
|
return matchResultTrue, nil
|
||||||
|
}
|
||||||
it := res.ListIterator()
|
it := res.ListIterator()
|
||||||
if it == nil {
|
if it == nil {
|
||||||
return matchResultFalse, cur // not a list
|
return matchResultFalse, cur // not a list
|
||||||
@@ -210,9 +216,12 @@ func matchStatement(cur Statement, node ipld.Node) (_ matchResult, leafMost Stat
|
|||||||
case KindAny:
|
case KindAny:
|
||||||
if s, ok := cur.(quantifier); ok {
|
if s, ok := cur.(quantifier); ok {
|
||||||
res, err := s.selector.Select(node)
|
res, err := s.selector.Select(node)
|
||||||
if err != nil || res == nil {
|
if err != nil {
|
||||||
return matchResultNoData, cur
|
return matchResultNoData, cur
|
||||||
}
|
}
|
||||||
|
if res == nil {
|
||||||
|
return matchResultTrue, nil
|
||||||
|
}
|
||||||
it := res.ListIterator()
|
it := res.ListIterator()
|
||||||
if it == nil {
|
if it == nil {
|
||||||
return matchResultFalse, cur // not a list
|
return matchResultFalse, cur // not a list
|
||||||
|
|||||||
Reference in New Issue
Block a user