from functools import partial import rdflib.plugins.sparql.parser as p from rdflib.plugins.sparql.sparql import QueryContext, SPARQLError, Prologue from rdflib.plugins.sparql.algebra import traverse, translatePName from rdflib.plugins.sparql.operators import simplify from rdflib import Variable, Literal from nose.tools import eq_ as eq def _eval(e, ctx=None): if not ctx: ctx = QueryContext() try: r = e.eval(ctx) if isinstance(r, SPARQLError): print(r) return False return r except SPARQLError: return False def _translate(e): return simplify(traverse(e, visitPost=partial(translatePName, prologue=Prologue()))) def testRegex(): assert _eval(_translate((p.Expression.parseString('REGEX("zxcabczxc","abc")')[0]))) eq( bool(_eval(_translate((p.Expression.parseString('REGEX("zxczxc","abc")')[0])))), False, ) assert _eval( _translate((p.Expression.parseString('REGEX("bbbaaaaabbb","ba*b")')[0])) ) def test_arithmetic(): eq(_eval(_translate((p.Expression.parseString("2+3")[0]))).value, 5) eq(_eval(_translate((p.Expression.parseString("3-2")[0]))).value, 1) eq(_eval(_translate((p.Expression.parseString("2*3")[0]))).value, 6) eq(_eval(_translate((p.Expression.parseString("4/2")[0]))).value, 2) eq(_eval(_translate((p.Expression.parseString("2+2+2")[0]))).value, 6) eq(_eval(_translate((p.Expression.parseString("2-2+2")[0]))).value, 2) eq(_eval(_translate((p.Expression.parseString("(2-2)+2")[0]))).value, 2) eq(_eval(_translate((p.Expression.parseString("2-(2+2)")[0]))).value, -2) eq(_eval(_translate((p.Expression.parseString("2*2*2")[0]))).value, 8) eq(_eval(_translate((p.Expression.parseString("4/2*2")[0]))).value, 4) eq(_eval(_translate((p.Expression.parseString("8/4*2")[0]))).value, 4) eq(_eval(_translate((p.Expression.parseString("8/(4*2)")[0]))).value, 1) eq(_eval(_translate((p.Expression.parseString("(2/2)*2")[0]))).value, 2) eq(_eval(_translate((p.Expression.parseString("4/(2*2)")[0]))).value, 1) eq(_eval(_translate((p.Expression.parseString("2+3*2")[0]))).value, 8) eq(_eval(_translate((p.Expression.parseString("(2+3)*2")[0]))).value, 10) eq(_eval(_translate((p.Expression.parseString("2+4/2")[0]))).value, 4) eq(_eval(_translate((p.Expression.parseString("(2+4)/2")[0]))).value, 3) def test_arithmetic_var(): ctx = QueryContext() ctx[Variable("x")] = Literal(2) eq(_eval(_translate((p.Expression.parseString("2+?x")[0])), ctx).value, 4) eq(_eval(_translate((p.Expression.parseString("?x+3")[0])), ctx).value, 5) eq(_eval(_translate((p.Expression.parseString("3-?x")[0])), ctx).value, 1) eq(_eval(_translate((p.Expression.parseString("?x*3")[0])), ctx).value, 6) eq(_eval(_translate((p.Expression.parseString("4/?x")[0])), ctx).value, 2) eq(_eval(_translate((p.Expression.parseString("?x+?x+?x")[0])), ctx).value, 6) eq(_eval(_translate((p.Expression.parseString("?x-?x+?x")[0])), ctx).value, 2) eq(_eval(_translate((p.Expression.parseString("(?x-?x)+?x")[0])), ctx).value, 2) eq(_eval(_translate((p.Expression.parseString("?x-(?x+?x)")[0])), ctx).value, -2) eq(_eval(_translate((p.Expression.parseString("?x*?x*?x")[0])), ctx).value, 8) eq(_eval(_translate((p.Expression.parseString("4/?x*?x")[0])), ctx).value, 4) eq(_eval(_translate((p.Expression.parseString("8/4*?x")[0])), ctx).value, 4) eq(_eval(_translate((p.Expression.parseString("8/(4*?x)")[0])), ctx).value, 1) eq(_eval(_translate((p.Expression.parseString("(?x/?x)*?x")[0])), ctx).value, 2) eq(_eval(_translate((p.Expression.parseString("4/(?x*?x)")[0])), ctx).value, 1) def test_comparisons(): eq(bool(_eval(_translate((p.Expression.parseString("2<3")[0])))), True) eq(bool(_eval(_translate((p.Expression.parseString("2<3.0")[0])))), True) eq(bool(_eval(_translate((p.Expression.parseString("2<3e0")[0])))), True) eq(bool(_eval(_translate((p.Expression.parseString("4<3")[0])))), False) eq(bool(_eval(_translate((p.Expression.parseString("4<3.0")[0])))), False) eq(bool(_eval(_translate((p.Expression.parseString("4<3e0")[0])))), False) eq(bool(_eval(_translate((p.Expression.parseString("2<2.1")[0])))), True) eq(bool(_eval(_translate((p.Expression.parseString("2<21e-1")[0])))), True) eq(bool(_eval(_translate((p.Expression.parseString("2=2.0")[0])))), True) eq(bool(_eval(_translate((p.Expression.parseString("2=2e0")[0])))), True) eq(bool(_eval(_translate((p.Expression.parseString('2="cake"')[0])))), False) def test_comparisons_var(): ctx = QueryContext() ctx[Variable("x")] = Literal(2) eq(bool(_eval(_translate((p.Expression.parseString("?x<3")[0])), ctx)), True) eq(bool(_eval(_translate((p.Expression.parseString("?x<3.0")[0])), ctx)), True) eq(bool(_eval(_translate((p.Expression.parseString("?x<3e0")[0])), ctx)), True) eq(bool(_eval(_translate((p.Expression.parseString("?x<2.1")[0])), ctx)), True) eq(bool(_eval(_translate((p.Expression.parseString("?x<21e-1")[0])), ctx)), True) eq(bool(_eval(_translate((p.Expression.parseString("?x=2.0")[0])), ctx)), True) eq(bool(_eval(_translate((p.Expression.parseString("?x=2e0")[0])), ctx)), True) eq(bool(_eval(_translate((p.Expression.parseString('?x="cake"')[0])), ctx)), False) ctx = QueryContext() ctx[Variable("x")] = Literal(4) eq(bool(_eval(_translate((p.Expression.parseString("?x<3")[0])), ctx)), False) eq(bool(_eval(_translate((p.Expression.parseString("?x<3.0")[0])), ctx)), False) eq(bool(_eval(_translate((p.Expression.parseString("?x<3e0")[0])), ctx)), False) def test_and_or(): eq(bool(_eval(_translate((p.Expression.parseString("3>2 && 3>1")[0])))), True) eq( bool(_eval(_translate((p.Expression.parseString("3>2 && 3>4 || 2>1")[0])))), True, ) eq( bool(_eval(_translate((p.Expression.parseString("2>1 || 3>2 && 3>4")[0])))), True, ) eq( bool(_eval(_translate((p.Expression.parseString("(2>1 || 3>2) && 3>4")[0])))), False, ) if __name__ == "__main__": import nose import sys nose.main(defaultTest=sys.argv[0])