From ceb3c00bf03adb692208314c7e40f08b3750c934 Mon Sep 17 00:00:00 2001 From: Radu Cotescu Date: Tue, 29 Sep 2015 15:04:13 +0200 Subject: [PATCH] OAK-3458 - Add support for the LIMIT and OFFSET SQL clauses * added simple support for LIMIT and OFFSET in the main query --- .../apache/jackrabbit/oak/query/SQL2Parser.java | 8 +++++++ .../jackrabbit/oak/query/SQL2ParserTest.java | 28 ++++++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/oak-core/src/main/java/org/apache/jackrabbit/oak/query/SQL2Parser.java b/oak-core/src/main/java/org/apache/jackrabbit/oak/query/SQL2Parser.java index 4b6fa43..0f2d6dd 100644 --- a/oak-core/src/main/java/org/apache/jackrabbit/oak/query/SQL2Parser.java +++ b/oak-core/src/main/java/org/apache/jackrabbit/oak/query/SQL2Parser.java @@ -158,6 +158,14 @@ public class SQL2Parser { read("BY"); orderings = parseOrder(); } + if (readIf("LIMIT")) { + PropertyValue limitValue = readString(); + q.setLimit(limitValue.getValue(Type.LONG)); + } + if (readIf("OFFSET")) { + PropertyValue limitValue = readString(); + q.setOffset(limitValue.getValue(Type.LONG)); + } if (!currentToken.isEmpty()) { throw getSyntaxError(""); } diff --git a/oak-core/src/test/java/org/apache/jackrabbit/oak/query/SQL2ParserTest.java b/oak-core/src/test/java/org/apache/jackrabbit/oak/query/SQL2ParserTest.java index 0a28376..ffd6d78 100644 --- a/oak-core/src/test/java/org/apache/jackrabbit/oak/query/SQL2ParserTest.java +++ b/oak-core/src/test/java/org/apache/jackrabbit/oak/query/SQL2ParserTest.java @@ -16,11 +16,13 @@ */ package org.apache.jackrabbit.oak.query; +import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertTrue; import static org.apache.jackrabbit.JcrConstants.JCR_SYSTEM; import static org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.JCR_NODE_TYPES; import static org.apache.jackrabbit.oak.plugins.nodetype.write.InitialContent.INITIAL_CONTENT; +import java.lang.reflect.Field; import java.text.ParseException; import org.apache.jackrabbit.oak.query.xpath.XPathToSQL2Converter; @@ -73,5 +75,31 @@ public class SQL2ParserTest { String token = "and b.[type] in('t1', 't2', 't3')"; assertTrue(q.contains(token)); } + + @Test + public void testLimit() throws ParseException, NoSuchFieldException, IllegalAccessException { + Query q = p.parse("SELECT * FROM [nt:unstructured] AS s WHERE ISDESCENDANTNODE([/content/blog]) AND s.[sling:resourceType] = " + + "'a/b/c' LIMIT 10"); + /** + * a bit hackish but the Query interface doesn't provide a getter for limit; however we do know that the SQL2Parser currently + * returns an instance of the {@link QueryImpl} class which has this long limit field + */ + Field field = q.getClass().getDeclaredField("limit"); + field.setAccessible(true); + assertEquals(10, field.getLong(q)); + } + + @Test + public void testOffset() throws ParseException, NoSuchFieldException, IllegalAccessException{ + Query q = p.parse("SELECT * FROM [nt:unstructured] AS s WHERE ISDESCENDANTNODE([/content/blog]) AND s.[sling:resourceType] = " + + "'a/b/c' LIMIT 10 OFFSET 20"); + /** + * a bit hackish but the Query interface doesn't provide a getter for limit; however we do know that the SQL2Parser currently + * returns an instance of the {@link QueryImpl} class which has this long offset field + */ + Field field = q.getClass().getDeclaredField("offset"); + field.setAccessible(true); + assertEquals(20, field.getLong(q)); + } } -- 2.5.0