/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.jena.sparql.algebra.optimize;
import java.util.HashSet ;
import java.util.Set ;
import org.apache.jena.atlas.junit.BaseTest ;
import org.apache.jena.query.Query ;
import org.apache.jena.query.QueryFactory ;
import org.apache.jena.sparql.algebra.Algebra ;
import org.apache.jena.sparql.algebra.Op ;
import org.apache.jena.sparql.algebra.optimize.TransformScopeRename ;
import org.apache.jena.sparql.core.Var ;
import org.apache.jena.sparql.engine.Rename ;
import org.apache.jena.sparql.sse.SSE ;
import org.junit.Test ;
public class TestVarRename extends BaseTest
{
@Test public void rename_01() { rename("(bgp (<s> <p> <o>))", "(bgp (<s> <p> <o>))", true) ; }
@Test public void rename_02() { rename("(bgp (<s> ?p <o>))", "(bgp (<s> ?/p <o>))", true) ; }
@Test public void rename_03() { rename("(bgp (?s ?p <o>))", "(bgp (?s ?/p <o>))", true, "s") ; }
@Test public void rename_04() { rename("(filter (+ ?s ?x) (bgp (?s ?p <o>)))", "(filter (+ ?s ?/x) (bgp (?s ?/p <o>)))", true, "s") ; }
@Test public void rename_05() { rename("(group ((?.1 (str ?x))) ((?.0 (count))) (bgp (triple ?x :p ?v)))",
"(group ((?/.1 (str ?x))) ((?/.0 (count))) (bgp (triple ?x :p ?/v)))",
true, "x" ) ; }
@Test public void rename_06() { rename("(group ((?.1 (str ?x))) ((?.0 (max ?v))) (bgp (triple ?x :p ?v)))",
"(group ((?/.1 (str ?x))) ((?/.0 (max ?/v))) (bgp (triple ?x :p ?/v)))",
true, "x" ) ; }
@Test public void rename_07() { rename("(assign ((?x (+ ?/a ?/b))) (table unit))",
"(assign ((?/x (+ ?//a ?//b))) (table unit))",
true) ; }
@Test public void rename_08() { rename("(assign ((?x (+ ?/a ?/b))) (table unit))",
"(assign ((?/x (+ ?/a ?//b))) (table unit))",
false, "/a") ; }
@Test public void rename_09() { rename("(project (?s ?p) (bgp (?s ?p ?o)))",
"(project (?s ?/p) (bgp (?s ?/p ?/o)))",
true,
"s") ; }
@Test public void rename_10() { rename("(order (?s ?p) (bgp (?s ?p ?o)))",
"(order (?s ?/p) (bgp (?s ?/p ?/o)))",
true,
"s") ; }
@Test public void rename_11() { rename("(project (?s) (order (?s ?p) (bgp (?s ?p ?o))))",
"(project (?s) (order (?s ?/p) (bgp (?s ?/p ?/o))))",
true,
"s") ; }
@Test public void rename_12() { rename("(leftjoin (bgp (?s ?p ?o)) (bgp (?s ?p ?o1)) () )",
"(leftjoin (bgp (?s ?/p ?o)) (bgp (?s ?/p ?/o1)) () )",
true,
"s", "o") ; }
// JENA-502 : failure to rewrite (table) in var rename.
@Test public void rename_13() { rename("(project (?s) (project (?s) (table (vars ?obj) (row [?obj 123])) ))",
"(project (?s) (project (?s) (table (vars ?/obj) (row [?/obj 123])) ))",
true,
"s") ; }
// JENA-494 : sub-query and service interaction
@Test public void rename_14() { rename("(project (?z) (project (?z) (sequence (service <http://foo> (bgp (?c ?p ?z)) ) (bgp (?c ?q ?z)) ) ) )",
"(project (?z) (project (?z) (sequence (service <http://foo> (bgp (?/c ?/p ?z)) ) (bgp (?/c ?/q ?z)) ) ) )",
true,
"z") ; }
@Test public void rename_reverse_01() { reverse("(project (?s ?/p) (bgp (?s ?/p ?/o)))",
"(project (?s ?p) (bgp (?s ?p ?o)))", true ) ; }
@Test public void rename_reverse_02() { reverse("(assign ((?/x (+ ?//a ?///b))) (table unit))",
"(assign ((?x (+ ?a ?b))) (table unit))",
true ) ; }
private static void reverse(String string, String string2, boolean repeatedly)
{
Op opOrig = SSE.parseOp(string) ;
Op opExpected = SSE.parseOp(string2) ;
Op opActual = Rename.reverseVarRename(opOrig, repeatedly) ;
assertEquals(opExpected, opActual) ;
}
private static void rename(String string, String string2, boolean reversable, String... varNames)
{
Set<Var> s = new HashSet<>() ;
for ( String vn : varNames )
s.add(Var.alloc(vn)) ;
rename(string, string2, reversable, s) ;
}
private static void rename(String string, String string2, boolean reversable, Set<Var> constant)
{
Op opOrig = SSE.parseOp(string) ;
Op opExpected = SSE.parseOp(string2) ;
Op opActual = Rename.renameVars(opOrig, constant) ;
assertEquals(opExpected, opActual) ;
if ( reversable )
{
// Undo.
Op opRebuilt = Rename.reverseVarRename(opActual, false) ;
assertEquals(opOrig, opRebuilt) ;
}
}
@Test public void query_rename_01()
{
String queryString =
"SELECT ?x { ?s ?p ?o . { SELECT ?v { ?x ?y ?v {SELECT ?w { ?a ?y ?w }}} LIMIT 50 } }" ;
String opExpectedString =
"(project (?x)\n" +
" (join\n" +
" (bgp (triple ?s ?p ?o))\n" +
" (slice _ 50\n" +
" (project (?v)\n" +
" (join\n" +
" (bgp (triple ?/x ?/y ?v))\n" +
" (project (?/w)\n" +
" (bgp (triple ?//a ?//y ?/w))))))))";
checkRename(queryString, opExpectedString) ;
}
@Test public void query_rename_02()
{
String queryString =
"SELECT ?x { ?s ?p ?o . { SELECT ?v { ?x ?y ?v {SELECT * { ?a ?y ?w }}} LIMIT 50 } }" ;
String opExpectedString =
"(project (?x)\n" +
" (join\n" +
" (bgp (triple ?s ?p ?o))\n" +
" (slice _ 50\n" +
" (project (?v)\n" +
" (join (bgp (triple ?/x ?/y ?v)) (bgp (triple ?/a ?/y ?/w))))" +
")))" ;
checkRename(queryString, opExpectedString) ;
}
@Test public void query_rename_03()
{
String queryString = "SELECT ?x { ?s ?p ?o . { SELECT * { ?x ?y ?v {SELECT ?w { ?a ?y ?w }}} LIMIT 50 } }" ;
String opExpectedString =
"(project (?x)\n" +
" (join\n" +
" (bgp (triple ?s ?p ?o))\n" +
" (slice _ 50\n" +
" (join\n" +
" (bgp (triple ?x ?y ?v))\n" +
" (project (?w)\n" +
" (bgp (triple ?/a ?/y ?w)))))))" ;
checkRename(queryString, opExpectedString) ;
}
@Test public void query_rename_04()
{
String queryString = "SELECT * { ?s ?p ?o . { SELECT ?v { ?x ?y ?v {SELECT ?w { ?a ?y ?w }}} LIMIT 50 } }" ;
String opExpectedString =
"(join\n" +
" (bgp (triple ?s ?p ?o))\n" +
" (slice _ 50\n" +
" (project (?v)\n" +
" (join\n" +
" (bgp (triple ?/x ?/y ?v))\n" +
" (project (?/w)\n" +
" (bgp (triple ?//a ?//y ?/w)))))))" ;
checkRename(queryString, opExpectedString) ;
}
@Test public void query_rename_05()
{
String queryString = "SELECT ?v { ?s ?p ?o . { SELECT ?v { ?x ?y ?v {SELECT ?w { ?a ?y ?w }}} LIMIT 50 } }" ;
String opExpectedString =
"(project (?v)\n" +
" (join\n" +
" (bgp (triple ?s ?p ?o))\n" +
" (slice _ 50\n" +
" (project (?v)\n" +
" (join\n" +
" (bgp (triple ?/x ?/y ?v))\n" +
" (project (?/w)\n" +
" (bgp (triple ?//a ?//y ?/w))))))))" ;
checkRename(queryString, opExpectedString) ;
}
@Test public void query_rename_06()
{
String queryString = "SELECT ?w { ?s ?p ?o . { SELECT ?w { ?x ?y ?v {SELECT ?w { ?a ?y ?w }}} } } LIMIT 50" ;
String opExpectedString =
"(slice _ 50\n" +
" (project (?w)\n" +
" (join\n" +
" (bgp (triple ?s ?p ?o))\n" +
" (project (?w)\n" +
" (join\n" +
" (bgp (triple ?/x ?/y ?/v))\n" +
" (project (?w)\n" +
" (bgp (triple ?//a ?//y ?w))))))))\n" +
"" ;
checkRename(queryString, opExpectedString) ;
}
@Test public void query_rename_07()
{
String queryString = "SELECT * { ?s ?p ?o . { SELECT ?w { ?x ?y ?v }}}" ;
String opExpectedString =
"(join\n" +
" (bgp (triple ?s ?p ?o))\n" +
" (project (?w)\n" +
" (bgp (triple ?/x ?/y ?/v))))" ;
checkRename(queryString, opExpectedString) ;
}
static void checkRename(String queryString, String opExpectedString)
{
Op opExpected = SSE.parseOp(opExpectedString) ;
queryString = "PREFIX : <http://example/>\n"+queryString ;
Query query = QueryFactory.create(queryString) ;
Op op = Algebra.compile(query) ;
Op opRenamed = TransformScopeRename.transform(op) ;
assertEquals(opExpected, opRenamed) ;
}
}