| /* |
| * 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 org.apache.jena.atlas.lib.StrUtils ; |
| import org.apache.jena.sparql.algebra.Transform ; |
| import org.junit.Test ; |
| |
| public class TestTransformTopN extends AbstractTestTransform { |
| public TestTransformTopN() {} |
| |
| @Test public void topN_01() { |
| String input = StrUtils.strjoinNL |
| ("(slice _ 5" |
| ," (order (?z)" |
| ," (bgp (triple ?s ?p ?z)) ))" |
| ); |
| String output = StrUtils.strjoinNL |
| ("(top (5 ?z)" |
| ," (bgp (triple ?s ?p ?z)))" |
| ); |
| test(input, output) ; |
| } |
| @Test public void topN_02() { |
| String input = |
| StrUtils.strjoinNL |
| ("(slice _ 5" |
| ," (project (?z)" |
| ," (order (?z)" |
| ," (bgp (triple ?s ?p ?z)) )))" |
| ); |
| String output = StrUtils.strjoinNL |
| ("(project (?z)" |
| ," (top (5 ?z)" |
| ," (bgp (triple ?s ?p ?z)) ))" |
| ); |
| test(input, output) ; |
| } |
| |
| @Test public void topN_03() { |
| String input = StrUtils.strjoinNL |
| ("(slice _ 5" |
| ," (project (?s ?z)" |
| ," (order (?z ?s)" |
| ," (bgp (triple ?s ?p ?z)) )))" |
| ); |
| String output = StrUtils.strjoinNL |
| ("(project (?s ?z)" |
| ," (top (5 ?z ?s)" |
| ," (bgp (triple ?s ?p ?z)) ))" |
| ); |
| test(input, output) ; |
| } |
| |
| @Test public void topN_04() { |
| String input = |
| StrUtils.strjoinNL |
| ("(slice _ 5" |
| ," (project (?s ?z)" |
| ," (order (?z)" |
| ," (bgp (triple ?s ?p ?z)) )))" |
| |
| ); |
| |
| String output = StrUtils.strjoinNL |
| ("(project (?s ?z)" |
| ," (top (5 ?z)" |
| ," (bgp (triple ?s ?p ?z))))" |
| |
| ); |
| test(input, output) ; |
| } |
| |
| @Test public void topN_05() { |
| String input = |
| StrUtils.strjoinNL |
| ("(slice _ 5" |
| ," (project (?z)" |
| ," (order (?z ?s)" |
| ," (bgp (triple ?s ?p ?z)) )))" |
| ); |
| |
| String output = StrUtils.strjoinNL |
| ("(project (?z)" |
| ," (top (5 ?z ?s)" |
| ," (bgp (triple ?s ?p ?z)) ))" |
| ); |
| |
| // Order being wider than project blocks the optimization. |
| test(input, output) ; |
| } |
| |
| @Test public void topN_06() { |
| String input = |
| StrUtils.strjoinNL |
| ("(slice _ 5" |
| ," (project (?s ?p)" |
| ," (order (?z ?s)" |
| ," (bgp (triple ?s ?p ?z)) )))" |
| ); |
| String output = StrUtils.strjoinNL |
| ("(project (?s ?p)" |
| ," (top (5 ?z ?s)" |
| ," (bgp (triple ?s ?p ?z)) ))" |
| ); |
| |
| test(input, output) ; |
| } |
| |
| @Test public void topN_07() { |
| String input = |
| StrUtils.strjoinNL |
| ("(slice _ 5" |
| ," (project (?s ?p ?z)" |
| ," (order (?z ?s)" |
| ," (bgp (triple ?s ?p ?z)) )))" |
| ); |
| String output = StrUtils.strjoinNL |
| ("(project (?s ?p ?z)" |
| ," (top (5 ?z ?s)" |
| ," (bgp (triple ?s ?p ?z)) ))" |
| ); |
| test(input, output) ; |
| } |
| |
| // ---- The same but with distinct |
| |
| @Test public void topN_11() { |
| String input = |
| StrUtils.strjoinNL |
| ("(slice _ 5" |
| ," (distinct" |
| ," (order (?z)" |
| ," (bgp (triple ?s ?p ?z)) )))" |
| ); |
| |
| String output = StrUtils.strjoinNL |
| ("(top (5 ?z)" |
| ," (distinct" |
| ," (bgp (triple ?s ?p ?z)) ))" |
| |
| ); |
| test(input, output) ; |
| } |
| |
| @Test public void topN_12() { |
| String input = |
| StrUtils.strjoinNL |
| ("(slice _ 5" |
| ," (distinct" |
| ," (project (?s ?z)" |
| ," (order (?z ?s)" |
| ," (bgp (triple ?s ?p ?z)) ))))" |
| ); |
| |
| String output = StrUtils.strjoinNL |
| ("(top (5 ?z ?s)" |
| ," (distinct" |
| ," (project (?s ?z)" |
| ," (bgp (triple ?s ?p ?z)) )))" |
| ); |
| test(input, output) ; |
| } |
| |
| @Test public void topN_13() { |
| String input = |
| StrUtils.strjoinNL |
| ("(slice _ 5" |
| ," (distinct" |
| ," (project (?z)" |
| ," (order (?z)" |
| ," (bgp (triple ?s ?p ?z)) ))))" |
| ); |
| |
| String output = StrUtils.strjoinNL |
| ("(top (5 ?z)" |
| ," (distinct" |
| ," (project (?z)" |
| ," (bgp (triple ?s ?p ?z)) )))" |
| ); |
| test(input, output) ; |
| } |
| |
| @Test public void topN_14() { |
| String input = |
| StrUtils.strjoinNL |
| ("(slice _ 5" |
| ," (distinct" |
| ," (project (?s ?z)" |
| ," (order (?z)" |
| ," (bgp (triple ?s ?p ?z)) ))))" |
| ); |
| |
| String output = StrUtils.strjoinNL |
| ("(top (5 ?z)" |
| ," (distinct" |
| ," (project (?s ?z)" |
| ," (bgp (triple ?s ?p ?z)) )))" |
| |
| ); |
| test(input, output) ; |
| } |
| |
| @Test public void topN_15() { |
| String input = |
| StrUtils.strjoinNL |
| ("(slice _ 5" |
| ," (distinct" |
| ," (project (?z)" |
| ," (order (?z ?s)" |
| ," (bgp (triple ?s ?p ?z)) ))))" |
| |
| ); |
| // Order being wider than project blocks the optimization. |
| String output = input ; |
| test(input, output) ; |
| } |
| |
| @Test public void topN_16() { |
| String input = |
| StrUtils.strjoinNL |
| ("(slice _ 5" |
| ," (distinct" |
| ," (project (?s ?p)" |
| ," (order (?z ?s)" |
| ," (bgp (triple ?s ?p ?z)) ))))" |
| ); |
| // The mismatch of project and order blocks the optimization. |
| String output = input ; |
| test(input, output) ; |
| } |
| |
| @Test public void topN_17() { |
| String input = |
| StrUtils.strjoinNL |
| ("(slice _ 5" |
| ," (distinct" |
| ," (project (?s ?p ?z)" |
| ," (order (?z ?s)" |
| ," (bgp (triple ?s ?p ?z)) ))))" |
| ); |
| String output = StrUtils.strjoinNL |
| ("(top (5 ?z ?s)" |
| ," (distinct" |
| ," (project (?s ?p ?z)" |
| ," (bgp (triple ?s ?p ?z)) )))" |
| ); |
| test(input, output) ; |
| } |
| |
| // ---- From query to transfomed algebra. |
| |
| @Test public void topN_query_01() { |
| String output = StrUtils.strjoinNL |
| (" (project (?s)" |
| ," (order (?p ?o)" |
| ," (bgp (triple ?s ?p ?o))))" |
| ); |
| testQuery("SELECT ?s { ?s ?p ?o } ORDER BY ?p ?o", output); |
| } |
| |
| @Test public void topN_query_02() { |
| String output = StrUtils.strjoinNL |
| (" (slice 1 _" |
| ," (project (?s)" |
| ," (top (6 ?p ?o)" |
| ," (bgp (triple ?s ?p ?o)))))" |
| ) ; |
| testQuery("SELECT ?s { ?s ?p ?o } ORDER BY ?p ?o OFFSET 1 LIMIT 5", output); |
| } |
| |
| @Test public void topN_query_03() { |
| String output = StrUtils.strjoinNL |
| ("(slice 1 _" |
| ," (project (?s)" |
| ," (top (6 ?p ?o)" |
| ," (bgp (triple ?s ?p ?o)))))" |
| ); |
| testQuery("SELECT ?s { ?s ?p ?o } ORDER BY ?p ?o OFFSET 1 LIMIT 5", output); |
| } |
| |
| @Test public void topN_query_04() { |
| String output = StrUtils.strjoinNL |
| ("(slice 1 _" |
| ," (project (?s)" |
| ," (top (6 ?p ?o)" |
| ," (bgp (triple ?s ?p ?o)))))" |
| ); testQuery("SELECT ?s { ?s ?p ?o } ORDER BY ?p ?o OFFSET 1 LIMIT 5", output); |
| } |
| |
| private void test(String input, String output) { |
| Transform transform = new TransformTopN() ; |
| testOp(input, transform, output) ; |
| } |
| |
| // ---- From query to transfomed algebra. |
| |
| private void testQuery(String input, String output) { |
| Transform transform = new TransformTopN() ; |
| testQuery(input, transform, output) ; |
| } |
| } |
| |