aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--bsfs/graph/resolve.py4
-rw-r--r--bsfs/query/validator.py14
-rw-r--r--bsfs/triple_store/sparql/parse_filter.py13
3 files changed, 12 insertions, 19 deletions
diff --git a/bsfs/graph/resolve.py b/bsfs/graph/resolve.py
index e398a5e..9b5f631 100644
--- a/bsfs/graph/resolve.py
+++ b/bsfs/graph/resolve.py
@@ -101,8 +101,8 @@ class Filter():
rng = subrng
except TypeError as err:
raise errors.ConsistencyError(f'ranges {subrng} and {rng} are not related') from err
- if rng is None:
- raise errors.UnreachableError()
+ if not isinstance(rng, (bsc.Node, bsc.Literal)):
+ raise errors.BackendError(f'the range of node {node} is undefined')
return rng
def _any(self, type_: bsc.Vertex, node: ast.filter.Any) -> ast.filter.Any: # pylint: disable=unused-argument
diff --git a/bsfs/query/validator.py b/bsfs/query/validator.py
index 6bf1b72..b04a9bf 100644
--- a/bsfs/query/validator.py
+++ b/bsfs/query/validator.py
@@ -98,10 +98,9 @@ class Filter():
raise errors.ConsistencyError(f'predicate {node.predicate} is not in the schema')
# determine domain and range
pred = self.schema.predicate(node.predicate)
+ if not isinstance(pred.range, (bsc.Node, bsc.Literal)):
+ raise errors.BackendError(f'the range of predicate {pred} is undefined')
dom, rng = pred.domain, pred.range
- if rng is None:
- # FIXME: It is a design error that Predicates can have a None range...
- raise errors.BackendError(f'predicate {pred} has no range')
if node.reverse:
dom, rng = rng, dom # type: ignore [assignment] # variable re-use confuses mypy
# return domain and range
@@ -133,12 +132,9 @@ class Filter():
raise errors.ConsistencyError(f'ranges {subrng} and {rng} are not related')
except TypeError as err: # compared literal vs. node
raise errors.ConsistencyError(f'ranges {subrng} and {rng} are not of the same type') from err
- # check domain and range
- if dom is None or rng is None:
- # OneOf guarantees at least one expression, these two cases cannot happen
- raise errors.UnreachableError()
- # return domain and range
- return dom, rng
+ # OneOf guarantees at least one expression, dom and rng are always bsc.Vertex.
+ # mypy does not realize this, hence we ignore the warning.
+ return dom, rng # type: ignore [return-value]
## intermediates
diff --git a/bsfs/triple_store/sparql/parse_filter.py b/bsfs/triple_store/sparql/parse_filter.py
index a851888..0297cbc 100644
--- a/bsfs/triple_store/sparql/parse_filter.py
+++ b/bsfs/triple_store/sparql/parse_filter.py
@@ -140,12 +140,10 @@ class Filter():
raise errors.ConsistencyError(f'ranges {subrng} and {rng} are not related')
except TypeError as err: # subrng and rng are not comparable
raise errors.ConsistencyError(f'ranges {subrng} and {rng} are not related') from err
- if rng is None:
- # for mypy to be certain of the rng type
- # if rng were None, we'd have gotten a TypeError above (None > None)
- raise errors.UnreachableError()
# return joint predicate expression and next range
- return '|'.join(suburi), rng
+ # OneOf guarantees at least one expression, rng is always a bsc.Vertex.
+ # mypy does not realize this, hence we ignore the warning.
+ return '|'.join(suburi), rng # type: ignore [return-value]
def _predicate(self, node_type: bsc.Vertex, node: ast.filter.Predicate) -> typing.Tuple[str, bsc.Vertex]:
"""
@@ -159,9 +157,8 @@ class Filter():
if not self.schema.has_predicate(puri):
raise errors.ConsistencyError(f'predicate {puri} is not in the schema')
pred = self.schema.predicate(puri)
- if pred.range is None:
- # FIXME: It is a design error that Predicates can have a None range...
- raise errors.BackendError(f'predicate {pred} has no range')
+ if not isinstance(pred.range, (bsc.Node, bsc.Literal)):
+ raise errors.BackendError(f'the range of predicate {pred} is undefined')
dom, rng = pred.domain, pred.range
# encapsulate predicate uri
puri = f'<{puri}>' # type: ignore [assignment] # variable re-use confuses mypy