| /*- |
| * 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.sling.query.impl.selector.parser; |
| |
| import java.util.List; |
| |
| import org.apache.sling.query.impl.resource.jcr.query.JcrQueryBuilder; |
| import org.apache.sling.query.impl.selector.parser.Selector; |
| import org.apache.sling.query.impl.selector.parser.SelectorParser; |
| import org.apache.sling.query.impl.selector.parser.SelectorSegment; |
| import org.apache.sling.query.mock.MockTypeResolver; |
| import org.junit.Assert; |
| import org.junit.Test; |
| |
| public class JcrSelectorTest { |
| @Test |
| public void parseResourceType() { |
| final String selector = "foundation/components/parsys"; |
| final String jcrQuery = "SELECT * FROM [nt:base] AS s WHERE s.[sling:resourceType] = 'foundation/components/parsys'"; |
| Assert.assertEquals(jcrQuery, parse(selector, "/")); |
| } |
| |
| @Test |
| public void parsePrimaryType() { |
| final String selector = "cq:Page"; |
| final String jcrQuery = "SELECT * FROM [cq:Page] AS s"; |
| Assert.assertEquals(jcrQuery, parse(selector, "/")); |
| } |
| |
| @Test |
| public void parsePath() { |
| final String selector = "cq:Page"; |
| final String jcrQuery = "SELECT * FROM [cq:Page] AS s WHERE ISDESCENDANTNODE('/content')"; |
| Assert.assertEquals(jcrQuery, parse(selector, "/content")); |
| } |
| |
| @Test |
| public void parseEmptySelector() { |
| final String selector = ""; |
| final String jcrQuery = "SELECT * FROM [nt:base] AS s"; |
| Assert.assertEquals(jcrQuery, parse(selector, "/")); |
| } |
| |
| @Test |
| public void parseEquals() { |
| final String selector = "[key1=value]"; |
| final String jcrQuery = "SELECT * FROM [nt:base] AS s WHERE s.[key1] = 'value'"; |
| Assert.assertEquals(jcrQuery, parse(selector, "/")); |
| } |
| |
| @Test |
| public void parseNotEquals() { |
| final String selector = "[key1!=value]"; |
| final String jcrQuery = "SELECT * FROM [nt:base] AS s WHERE s.[key1] != 'value'"; |
| Assert.assertEquals(jcrQuery, parse(selector, "/")); |
| } |
| |
| @Test |
| public void parseContains() { |
| final String selector = "[key1*=value]"; |
| final String jcrQuery = "SELECT * FROM [nt:base] AS s WHERE s.[key1] LIKE '%value%'"; |
| Assert.assertEquals(jcrQuery, parse(selector, "/")); |
| } |
| |
| @Test |
| public void parseContainsWord() { |
| final String selector = "[key1~=value]"; |
| final String jcrQuery = "SELECT * FROM [nt:base] AS s WHERE s.[key1] LIKE '%value%'"; |
| Assert.assertEquals(jcrQuery, parse(selector, "/")); |
| } |
| |
| @Test |
| public void parseStartsWith() { |
| final String selector = "[key1^=value]"; |
| final String jcrQuery = "SELECT * FROM [nt:base] AS s WHERE s.[key1] LIKE 'value%'"; |
| Assert.assertEquals(jcrQuery, parse(selector, "/")); |
| } |
| |
| @Test |
| public void parseEndsWith() { |
| final String selector = "[key1$=value]"; |
| final String jcrQuery = "SELECT * FROM [nt:base] AS s WHERE s.[key1] LIKE '%value'"; |
| Assert.assertEquals(jcrQuery, parse(selector, "/")); |
| } |
| |
| @Test |
| public void parseEscapedValue() { |
| final String selector = "[key1=value'123]"; |
| final String jcrQuery = "SELECT * FROM [nt:base] AS s WHERE s.[key1] = 'value''123'"; |
| Assert.assertEquals(jcrQuery, parse(selector, "/")); |
| } |
| |
| @Test |
| public void parseMultipleConditions() { |
| final String selector = "[key1=value1][key2=value2]"; |
| final String jcrQuery = "SELECT * FROM [nt:base] AS s WHERE (s.[key1] = 'value1' AND s.[key2] = 'value2')"; |
| Assert.assertEquals(jcrQuery, parse(selector, "/")); |
| } |
| |
| @Test |
| public void parseMultipleConditionsWithResourceTypeAndPath() { |
| final String selector = "foundation/components/parsys[key1=value1][key2=value2]"; |
| final String jcrQuery = "SELECT * FROM [nt:base] AS s WHERE (ISDESCENDANTNODE('/content') AND (s.[sling:resourceType] = 'foundation/components/parsys' AND s.[key1] = 'value1' AND s.[key2] = 'value2'))"; |
| Assert.assertEquals(jcrQuery, parse(selector, "/content")); |
| } |
| |
| @Test |
| public void parseAttributeWithSubresource() { |
| final String selector = "cq:Page[jcr:content/cq:template=xyz]"; |
| final String jcrQuery = "SELECT * FROM [cq:Page] AS s WHERE ISDESCENDANTNODE('/content')"; |
| Assert.assertEquals(jcrQuery, parse(selector, "/content")); |
| } |
| |
| static String parse(String selector, String root) { |
| List<Selector> selectors = SelectorParser.parse(selector); |
| List<SelectorSegment> segments = SelectorParser.getFirstSegmentFromEachSelector(selectors); |
| return new JcrQueryBuilder(new MockTypeResolver()).buildQuery(segments, root); |
| } |
| } |