/* * Constellation - An open source and standard compliant SDI * http://www.constellation-sdi.org * * Copyright 2014 Geomatys. * * Licensed 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.constellation.filter; // J2SE dependencies import org.apache.sis.xml.MarshallerPool; import org.geotoolkit.csw.xml.TypeNames; import org.geotoolkit.csw.xml.v202.QueryConstraintType; import org.geotoolkit.lucene.filter.LuceneOGCFilter; import org.geotoolkit.lucene.filter.SerialChainFilter; import org.geotoolkit.lucene.filter.SpatialQuery; import org.geotoolkit.ogc.xml.FilterMarshallerPool; import org.geotoolkit.ogc.xml.v110.FilterType; import org.geotoolkit.ogc.xml.v110.LiteralType; import org.geotoolkit.ogc.xml.v110.LowerBoundaryType; import org.geotoolkit.ogc.xml.v110.ObjectFactory; import org.geotoolkit.ogc.xml.v110.PropertyIsBetweenType; import org.geotoolkit.ogc.xml.v110.PropertyIsEqualToType; import org.geotoolkit.ogc.xml.v110.PropertyNameType; import org.geotoolkit.ogc.xml.v110.UpperBoundaryType; import org.junit.After; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.opengis.filter.spatial.BBOX; import org.opengis.filter.spatial.Contains; import org.opengis.filter.spatial.DWithin; import org.opengis.filter.spatial.Intersects; import javax.xml.bind.JAXBElement; import javax.xml.bind.Unmarshaller; import java.io.StringReader; import java.util.Arrays; import static org.geotoolkit.ows.xml.OWSExceptionCode.INVALID_PARAMETER_VALUE; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; // JAXB dependencies // JUnit dependencies /** * A suite of test verifying the transformation of an XML filter into a Lucene Query/filter * * @author Guilhem Legal */ public class FilterParserTest { private LuceneFilterParser filterParser; private static MarshallerPool pool; @BeforeClass public static void setUpClass() throws Exception { pool = FilterMarshallerPool.getInstance(); } @AfterClass public static void tearDownClass() throws Exception { } @Before public void setUp() throws Exception { filterParser = new LuceneFilterParser(); } @After public void tearDown() throws Exception { } /** * Test simple comparison filter. * * @throws java.lang.Exception */ @Test public void simpleComparisonFilterTest() throws Exception { Unmarshaller filterUnmarshaller = pool.acquireUnmarshaller(); /** * Test 1: a simple Filter propertyIsLike */ String XMLrequest ="<ogc:Filter xmlns:ogc=\"http://www.opengis.net/ogc\" xmlns:apiso=\"http://www.opengis.net/cat/csw/apiso/1.0\">" + " <ogc:PropertyIsLike escapeChar=\"\\\" singleChar=\"?\" wildCard=\"*\">" + " <ogc:PropertyName>apiso:Title</ogc:PropertyName>" + " <ogc:Literal>*VM*</ogc:Literal>" + " </ogc:PropertyIsLike>" + "</ogc:Filter>"; StringReader reader = new StringReader(XMLrequest); JAXBElement element = (JAXBElement) filterUnmarshaller.unmarshal(reader); FilterType filter = (FilterType) element.getValue(); assertTrue(filter.getComparisonOps() != null); assertTrue(filter.getLogicOps() == null); assertTrue(filter.getId().isEmpty() ); assertTrue(filter.getSpatialOps() == null); SpatialQuery spaQuery = (SpatialQuery) filterParser.getQuery(new QueryConstraintType(filter, "1.1.0"), null, null, null); assertTrue(spaQuery.getSpatialFilter() == null); assertEquals(spaQuery.getSubQueries().size(), 0); assertEquals(spaQuery.getQuery(), "Title:(*VM*)"); /** * Test 2: a simple Filter PropertyIsEqualTo */ XMLrequest ="<ogc:Filter xmlns:ogc=\"http://www.opengis.net/ogc\" xmlns:apiso=\"http://www.opengis.net/cat/csw/apiso/1.0\">" + " <ogc:PropertyIsEqualTo>" + " <ogc:PropertyName>apiso:Title</ogc:PropertyName>" + " <ogc:Literal>VM</ogc:Literal>" + " </ogc:PropertyIsEqualTo>" + "</ogc:Filter>"; reader = new StringReader(XMLrequest); element = (JAXBElement) filterUnmarshaller.unmarshal(reader); filter = (FilterType) element.getValue(); assertTrue(filter.getComparisonOps() != null); assertTrue(filter.getLogicOps() == null); assertTrue(filter.getId().isEmpty() ); assertTrue(filter.getSpatialOps() == null); spaQuery = (SpatialQuery) filterParser.getQuery(new QueryConstraintType(filter, "1.1.0"), null, null, null); assertTrue(spaQuery.getSpatialFilter() == null); assertEquals(spaQuery.getSubQueries().size(), 0); assertEquals(spaQuery.getQuery(), "Title:\"VM\""); /** * Test 3: a simple Filter PropertyIsNotEqualTo */ XMLrequest ="<ogc:Filter xmlns:ogc=\"http://www.opengis.net/ogc\" xmlns:apiso=\"http://www.opengis.net/cat/csw/apiso/1.0\">" + " <ogc:PropertyIsNotEqualTo>" + " <ogc:PropertyName>apiso:Title</ogc:PropertyName>" + " <ogc:Literal>VM</ogc:Literal>" + " </ogc:PropertyIsNotEqualTo>" + "</ogc:Filter>"; reader = new StringReader(XMLrequest); element = (JAXBElement) filterUnmarshaller.unmarshal(reader); filter = (FilterType) element.getValue(); assertTrue(filter.getComparisonOps() != null); assertTrue(filter.getLogicOps() == null); assertTrue(filter.getId().isEmpty() ); assertTrue(filter.getSpatialOps() == null); spaQuery = (SpatialQuery) filterParser.getQuery(new QueryConstraintType(filter, "1.1.0"), null, null, null); assertTrue(spaQuery.getSpatialFilter() == null); assertEquals(spaQuery.getSubQueries().size(), 0); assertEquals(spaQuery.getQuery(), "metafile:doc NOT Title:\"VM\""); /** * Test 4: a simple Filter PropertyIsNull */ XMLrequest ="<ogc:Filter xmlns:ogc=\"http://www.opengis.net/ogc\" xmlns:apiso=\"http://www.opengis.net/cat/csw/apiso/1.0\">" + " <ogc:PropertyIsNull>" + " <ogc:PropertyName>apiso:Title</ogc:PropertyName>" + " </ogc:PropertyIsNull>" + "</ogc:Filter>"; reader = new StringReader(XMLrequest); element = (JAXBElement) filterUnmarshaller.unmarshal(reader); filter = (FilterType) element.getValue(); assertTrue(filter.getComparisonOps() != null); assertTrue(filter.getLogicOps() == null); assertTrue(filter.getId().isEmpty() ); assertTrue(filter.getSpatialOps() == null); spaQuery = (SpatialQuery) filterParser.getQuery(new QueryConstraintType(filter, "1.1.0"), null, null, null); assertTrue(spaQuery.getSpatialFilter() == null); assertEquals(spaQuery.getSubQueries().size(), 0); assertEquals(spaQuery.getQuery(), "Title:null"); /** * Test 5: a simple Filter PropertyIsGreaterThanOrEqualTo */ XMLrequest ="<ogc:Filter xmlns:ogc=\"http://www.opengis.net/ogc\" xmlns:apiso=\"http://www.opengis.net/cat/csw/apiso/1.0\">" + " <ogc:PropertyIsGreaterThanOrEqualTo>" + " <ogc:PropertyName>apiso:CreationDate</ogc:PropertyName>" + " <ogc:Literal>2007-06-02</ogc:Literal>" + " </ogc:PropertyIsGreaterThanOrEqualTo>" + "</ogc:Filter>"; reader = new StringReader(XMLrequest); element = (JAXBElement) filterUnmarshaller.unmarshal(reader); filter = (FilterType) element.getValue(); assertTrue(filter.getComparisonOps() != null); assertTrue(filter.getLogicOps() == null); assertTrue(filter.getId().isEmpty() ); assertTrue(filter.getSpatialOps() == null); spaQuery = (SpatialQuery) filterParser.getQuery(new QueryConstraintType(filter, "1.1.0"), null, null, null); assertTrue(spaQuery.getSpatialFilter() == null); assertEquals(spaQuery.getSubQueries().size(), 0); assertEquals(spaQuery.getQuery(), "CreationDate:[\"20070602000000\" 30000101000000]"); /** * Test 6: a simple Filter PropertyIsGreaterThan */ XMLrequest ="<ogc:Filter xmlns:ogc=\"http://www.opengis.net/ogc\" xmlns:apiso=\"http://www.opengis.net/cat/csw/apiso/1.0\">" + " <ogc:PropertyIsGreaterThan>" + " <ogc:PropertyName>apiso:CreationDate</ogc:PropertyName>" + " <ogc:Literal>2007-06-02</ogc:Literal>" + " </ogc:PropertyIsGreaterThan>" + "</ogc:Filter>"; reader = new StringReader(XMLrequest); element = (JAXBElement) filterUnmarshaller.unmarshal(reader); filter = (FilterType) element.getValue(); assertTrue(filter.getComparisonOps() != null); assertTrue(filter.getLogicOps() == null); assertTrue(filter.getId().isEmpty() ); assertTrue(filter.getSpatialOps() == null); spaQuery = (SpatialQuery) filterParser.getQuery(new QueryConstraintType(filter, "1.1.0"), null, null, null); assertTrue(spaQuery.getSpatialFilter() == null); assertEquals(spaQuery.getSubQueries().size(), 0); assertEquals(spaQuery.getQuery(), "CreationDate:{\"20070602000000\" 30000101000000}"); /** * Test 7: a simple Filter PropertyIsLessThan */ XMLrequest ="<ogc:Filter xmlns:ogc=\"http://www.opengis.net/ogc\" xmlns:apiso=\"http://www.opengis.net/cat/csw/apiso/1.0\">" + " <ogc:PropertyIsLessThan>" + " <ogc:PropertyName>apiso:CreationDate</ogc:PropertyName>" + " <ogc:Literal>2007-06-02</ogc:Literal>" + " </ogc:PropertyIsLessThan>" + "</ogc:Filter>"; reader = new StringReader(XMLrequest); element = (JAXBElement) filterUnmarshaller.unmarshal(reader); filter = (FilterType) element.getValue(); assertTrue(filter.getComparisonOps() != null); assertTrue(filter.getLogicOps() == null); assertTrue(filter.getId().isEmpty() ); assertTrue(filter.getSpatialOps() == null); spaQuery = (SpatialQuery) filterParser.getQuery(new QueryConstraintType(filter, "1.1.0"), null, null, null); assertTrue(spaQuery.getSpatialFilter() == null); assertEquals(spaQuery.getSubQueries().size(), 0); assertEquals(spaQuery.getQuery(), "CreationDate:{00000101000000 \"20070602000000\"}"); /** * Test 8: a simple Filter PropertyIsLessThanOrEqualTo */ XMLrequest ="<ogc:Filter xmlns:ogc=\"http://www.opengis.net/ogc\" xmlns:apiso=\"http://www.opengis.net/cat/csw/apiso/1.0\">" + " <ogc:PropertyIsLessThanOrEqualTo>" + " <ogc:PropertyName>apiso:CreationDate</ogc:PropertyName>" + " <ogc:Literal>2007-06-02</ogc:Literal>" + " </ogc:PropertyIsLessThanOrEqualTo>" + "</ogc:Filter>"; reader = new StringReader(XMLrequest); element = (JAXBElement) filterUnmarshaller.unmarshal(reader); filter = (FilterType) element.getValue(); assertTrue(filter.getComparisonOps() != null); assertTrue(filter.getLogicOps() == null); assertTrue(filter.getId().isEmpty() ); assertTrue(filter.getSpatialOps() == null); spaQuery = (SpatialQuery) filterParser.getQuery(new QueryConstraintType(filter, "1.1.0"), null, null, null); assertTrue(spaQuery.getSpatialFilter() == null); assertEquals(spaQuery.getSubQueries().size(), 0); assertEquals(spaQuery.getQuery(), "CreationDate:[00000101000000 \"20070602000000\"]"); /** * Test 9: a simple Filter PropertyIsBetween */ XMLrequest ="<ogc:Filter xmlns:ogc=\"http://www.opengis.net/ogc\" xmlns:apiso=\"http://www.opengis.net/cat/csw/apiso/1.0\">" + " <ogc:PropertyIsBetween>" + " <ogc:PropertyName>apiso:CreationDate</ogc:PropertyName>" + " <ogc:LowerBoundary>" + " <ogc:Literal>2007-06-02</ogc:Literal>" + " </ogc:LowerBoundary>" + " <ogc:UpperBoundary>" + " <ogc:Literal>2007-06-04</ogc:Literal>" + " </ogc:UpperBoundary>" + " </ogc:PropertyIsBetween>" + "</ogc:Filter>"; reader = new StringReader(XMLrequest); element = (JAXBElement) filterUnmarshaller.unmarshal(reader); filter = (FilterType) element.getValue(); assertTrue(filter.getComparisonOps() != null); assertTrue(filter.getLogicOps() == null); assertTrue(filter.getId().isEmpty() ); assertTrue(filter.getSpatialOps() == null); spaQuery = (SpatialQuery) filterParser.getQuery(new QueryConstraintType(filter, "1.1.0"), null, null, null); assertTrue(spaQuery.getSpatialFilter() == null); assertEquals(spaQuery.getSubQueries().size(), 0); assertEquals(spaQuery.getQuery(), "CreationDate:[\"20070602000000\" 30000101000000]CreationDate:[00000101000000 \"20070604000000\"]"); /** * Test 10: a simple empty Filter */ QueryConstraintType nullConstraint = null; spaQuery = (SpatialQuery) filterParser.getQuery(nullConstraint, null, null, null); assertTrue(spaQuery.getSpatialFilter() == null); assertEquals(spaQuery.getSubQueries().size(), 0); assertEquals(spaQuery.getQuery(), "metafile:doc"); /** * Test 11: a simple Filter PropertyIsLessThanOrEqualTo with numeric field */ filter = FilterParser.cqlToFilter("CloudCover <= 12"); assertTrue(filter.getComparisonOps() != null); assertTrue(filter.getLogicOps() == null); assertTrue(filter.getId().isEmpty() ); assertTrue(filter.getSpatialOps() == null); spaQuery = (SpatialQuery) filterParser.getQuery(new QueryConstraintType(filter, "1.1.0"), null, null, null); assertTrue(spaQuery.getSpatialFilter() == null); assertEquals(spaQuery.getSubQueries().size(), 0); assertEquals(spaQuery.getQuery(), "CloudCover:[-2147483648 TO 12]"); /** * Test 11: a simple Filter PropertyIsGreaterThan with numeric field */ filter = FilterParser.cqlToFilter("CloudCover > 12"); assertTrue(filter.getComparisonOps() != null); assertTrue(filter.getLogicOps() == null); assertTrue(filter.getId().isEmpty() ); assertTrue(filter.getSpatialOps() == null); spaQuery = (SpatialQuery) filterParser.getQuery(new QueryConstraintType(filter, "1.1.0"), null, null, null); assertTrue(spaQuery.getSpatialFilter() == null); assertEquals(spaQuery.getSubQueries().size(), 0); assertEquals(spaQuery.getQuery(), "CloudCover:{12 TO 2147483648}"); /** * Test 12: a simple Filter PropertyIsGreaterThan with numeric field + typeName */ filter = FilterParser.cqlToFilter("CloudCover > 12"); assertTrue(filter.getComparisonOps() != null); assertTrue(filter.getLogicOps() == null); assertTrue(filter.getId().isEmpty() ); assertTrue(filter.getSpatialOps() == null); spaQuery = (SpatialQuery) filterParser.getQuery(new QueryConstraintType(filter, "1.1.0"), null, null, Arrays.asList(TypeNames.METADATA_QNAME)); assertTrue(spaQuery.getSpatialFilter() == null); assertEquals(spaQuery.getSubQueries().size(), 0); assertEquals(spaQuery.getQuery(), "(CloudCover:{12 TO 2147483648} AND objectType:\"MD_Metadata\")"); pool.recycle(filterUnmarshaller); } @Test public void comparisonFilterOnDateTest() throws Exception { Unmarshaller filterUnmarshaller = pool.acquireUnmarshaller(); /** * Test 1: a simple Filter PropertyIsEqualTo on a Date field */ String XMLrequest = "<ogc:Filter xmlns:ogc=\"http://www.opengis.net/ogc\" xmlns:apiso=\"http://www.opengis.net/cat/csw/apiso/1.0\">" + " <ogc:PropertyIsEqualTo>" + " <ogc:PropertyName>apiso:CreationDate</ogc:PropertyName>" + " <ogc:Literal>2007-06-02</ogc:Literal>" + " </ogc:PropertyIsEqualTo>" + "</ogc:Filter>"; StringReader reader = new StringReader(XMLrequest); JAXBElement element = (JAXBElement) filterUnmarshaller.unmarshal(reader); FilterType filter = (FilterType) element.getValue(); assertTrue(filter.getComparisonOps() != null); assertTrue(filter.getLogicOps() == null); assertTrue(filter.getId().isEmpty() ); assertTrue(filter.getSpatialOps() == null); SpatialQuery spaQuery = (SpatialQuery) filterParser.getQuery(new QueryConstraintType(filter, "1.1.0"), null, null, null); assertTrue(spaQuery.getSpatialFilter() == null); assertEquals(spaQuery.getSubQueries().size(), 0); assertEquals(spaQuery.getQuery(), "CreationDate:\"20070602000000\""); /** * Test 2: a simple Filter PropertyIsLike on a Date field */ XMLrequest = "<ogc:Filter xmlns:ogc=\"http://www.opengis.net/ogc\" xmlns:apiso=\"http://www.opengis.net/cat/csw/apiso/1.0\">" + " <ogc:PropertyIsLike escapeChar=\"\\\" singleChar=\"?\" wildCard=\"*\">" + " <ogc:PropertyName>apiso:CreationDate</ogc:PropertyName>" + " <ogc:Literal>200*-06-02</ogc:Literal>" + " </ogc:PropertyIsLike>" + "</ogc:Filter>"; reader = new StringReader(XMLrequest); element = (JAXBElement) filterUnmarshaller.unmarshal(reader); filter = (FilterType) element.getValue(); assertTrue(filter.getComparisonOps() != null); assertTrue(filter.getLogicOps() == null); assertTrue(filter.getId().isEmpty() ); assertTrue(filter.getSpatialOps() == null); spaQuery = (SpatialQuery) filterParser.getQuery(new QueryConstraintType(filter, "1.1.0"), null, null, null); assertTrue(spaQuery.getSpatialFilter() == null); assertEquals(spaQuery.getSubQueries().size(), 0); assertEquals(spaQuery.getQuery(), "CreationDate:(200*0602)"); /** * Test 3: a simple Filter PropertyIsLike on a identifier field */ XMLrequest = "<ogc:Filter xmlns:ogc=\"http://www.opengis.net/ogc\" xmlns:apiso=\"http://www.opengis.net/cat/csw/apiso/1.0\">" + " <ogc:PropertyIsLike escapeChar=\"\\\" singleChar=\"?\" wildCard=\"*\">" + " <ogc:PropertyName>identifier</ogc:PropertyName>" + " <ogc:Literal>*chain_acq_1*</ogc:Literal>" + " </ogc:PropertyIsLike>" + "</ogc:Filter>"; reader = new StringReader(XMLrequest); element = (JAXBElement) filterUnmarshaller.unmarshal(reader); filter = (FilterType) element.getValue(); assertTrue(filter.getComparisonOps() != null); assertTrue(filter.getLogicOps() == null); assertTrue(filter.getId().isEmpty() ); assertTrue(filter.getSpatialOps() == null); spaQuery = (SpatialQuery) filterParser.getQuery(new QueryConstraintType(filter, "1.1.0"), null, null, null); assertTrue(spaQuery.getSpatialFilter() == null); assertEquals(spaQuery.getSubQueries().size(), 0); assertEquals(spaQuery.getQuery(), "identifier:(*chain_acq_1*)"); /** * Test 4: a simple Filter PropertyIsLike on a identifier field + typeName */ spaQuery = (SpatialQuery) filterParser.getQuery(new QueryConstraintType(filter, "1.1.0"), null, null, Arrays.asList(TypeNames.METADATA_QNAME)); assertTrue(spaQuery.getSpatialFilter() == null); assertEquals(spaQuery.getSubQueries().size(), 0); assertEquals(spaQuery.getQuery(), "(identifier:(*chain_acq_1*) AND objectType:\"MD_Metadata\")"); pool.recycle(filterUnmarshaller); } /** * Test simple logical filter (unary and binary). * * @throws java.lang.Exception */ @Test public void FiltertoCQLTest() throws Exception { ObjectFactory factory = new ObjectFactory(); final PropertyNameType propertyName = new PropertyNameType("ATTR1"); final LowerBoundaryType low = new LowerBoundaryType(); final LiteralType lowLit = new LiteralType("10"); low.setExpression(factory.createLiteral(lowLit)); final UpperBoundaryType upp = new UpperBoundaryType(); final LiteralType uppLit = new LiteralType("20"); upp.setExpression(factory.createLiteral(uppLit)); final PropertyIsBetweenType pib = new PropertyIsBetweenType(factory.createPropertyName(propertyName), low, upp); FilterType filter = new FilterType(pib); String result = FilterParser.filterToCql(filter); String expResult = ""; assertEquals(expResult, result); final LiteralType lit = new LiteralType("10"); final PropertyIsEqualToType pe = new PropertyIsEqualToType(lit, propertyName, Boolean.TRUE); filter = new FilterType(pe); result = FilterParser.filterToCql(filter); expResult = ""; assertEquals(expResult, result); } /** * Test simple logical filter (unary and binary). * * @throws java.lang.Exception */ @Test public void simpleLogicalFilterTest() throws Exception { Unmarshaller filterUnmarshaller = pool.acquireUnmarshaller(); /** * Test 1: a simple Filter AND between two propertyIsEqualTo */ String XMLrequest ="<ogc:Filter xmlns:ogc=\"http://www.opengis.net/ogc\" xmlns:apiso=\"http://www.opengis.net/cat/csw/apiso/1.0\">" + " <ogc:And> " + " <ogc:PropertyIsEqualTo>" + " <ogc:PropertyName>apiso:Title</ogc:PropertyName>" + " <ogc:Literal>starship trooper</ogc:Literal>" + " </ogc:PropertyIsEqualTo>" + " <ogc:PropertyIsEqualTo>" + " <ogc:PropertyName>apiso:Author</ogc:PropertyName>" + " <ogc:Literal>Timothee Gustave</ogc:Literal>" + " </ogc:PropertyIsEqualTo>" + " </ogc:And>" + "</ogc:Filter>"; StringReader reader = new StringReader(XMLrequest); JAXBElement element = (JAXBElement) filterUnmarshaller.unmarshal(reader); FilterType filter = (FilterType) element.getValue(); assertTrue(filter.getComparisonOps() == null); assertTrue(filter.getLogicOps() != null); assertTrue(filter.getId().isEmpty() ); assertTrue(filter.getSpatialOps() == null); SpatialQuery spaQuery = (SpatialQuery) filterParser.getQuery(new QueryConstraintType(filter, "1.1.0"), null, null, null); assertTrue(spaQuery.getSpatialFilter() == null); assertEquals(spaQuery.getSubQueries().size(), 0); assertEquals(spaQuery.getQuery(), "(Title:\"starship trooper\" AND Author:\"Timothee Gustave\")"); /** * Test 2: a simple Filter OR between two propertyIsEqualTo */ XMLrequest ="<ogc:Filter xmlns:ogc=\"http://www.opengis.net/ogc\" xmlns:apiso=\"http://www.opengis.net/cat/csw/apiso/1.0\">" + " <ogc:Or> " + " <ogc:PropertyIsEqualTo>" + " <ogc:PropertyName>apiso:Title</ogc:PropertyName>" + " <ogc:Literal>starship trooper</ogc:Literal>" + " </ogc:PropertyIsEqualTo>" + " <ogc:PropertyIsEqualTo>" + " <ogc:PropertyName>apiso:Author</ogc:PropertyName>" + " <ogc:Literal>Timothee Gustave</ogc:Literal>" + " </ogc:PropertyIsEqualTo>" + " </ogc:Or>" + "</ogc:Filter>"; reader = new StringReader(XMLrequest); element = (JAXBElement) filterUnmarshaller.unmarshal(reader); filter = (FilterType) element.getValue(); assertTrue(filter.getComparisonOps() == null); assertTrue(filter.getLogicOps() != null); assertTrue(filter.getId().isEmpty() ); assertTrue(filter.getSpatialOps() == null); spaQuery = (SpatialQuery) filterParser.getQuery(new QueryConstraintType(filter, "1.1.0"), null, null, null); assertTrue(spaQuery.getSpatialFilter() == null); assertEquals(spaQuery.getSubQueries().size(), 0); assertEquals(spaQuery.getQuery(), "(Title:\"starship trooper\" OR Author:\"Timothee Gustave\")"); /** * Test 3: a simple Filter OR between three propertyIsEqualTo */ XMLrequest ="<ogc:Filter xmlns:ogc=\"http://www.opengis.net/ogc\" xmlns:apiso=\"http://www.opengis.net/cat/csw/apiso/1.0\">" + " <ogc:Or> " + " <ogc:PropertyIsEqualTo>" + " <ogc:PropertyName>apiso:Title</ogc:PropertyName>" + " <ogc:Literal>starship trooper</ogc:Literal>" + " </ogc:PropertyIsEqualTo>" + " <ogc:PropertyIsEqualTo>" + " <ogc:PropertyName>apiso:Author</ogc:PropertyName>" + " <ogc:Literal>Timothee Gustave</ogc:Literal>" + " </ogc:PropertyIsEqualTo>" + " <ogc:PropertyIsEqualTo>" + " <ogc:PropertyName>apiso:Id</ogc:PropertyName>" + " <ogc:Literal>268</ogc:Literal>" + " </ogc:PropertyIsEqualTo>" + " </ogc:Or> " + "</ogc:Filter>"; reader = new StringReader(XMLrequest); element = (JAXBElement) filterUnmarshaller.unmarshal(reader); filter = (FilterType) element.getValue(); assertTrue(filter.getComparisonOps() == null); assertTrue(filter.getLogicOps() != null); assertTrue(filter.getId().isEmpty() ); assertTrue(filter.getSpatialOps() == null); spaQuery = (SpatialQuery) filterParser.getQuery(new QueryConstraintType(filter, "1.1.0"), null, null, null); assertTrue(spaQuery.getSpatialFilter() == null); assertEquals(spaQuery.getSubQueries().size(), 0); assertEquals(spaQuery.getQuery(), "(Title:\"starship trooper\" OR Author:\"Timothee Gustave\" OR Id:\"268\")"); /** * Test 4: a simple Filter Not propertyIsEqualTo */ XMLrequest ="<ogc:Filter xmlns:ogc=\"http://www.opengis.net/ogc\" xmlns:apiso=\"http://www.opengis.net/cat/csw/apiso/1.0\">" + " <ogc:Not> " + " <ogc:PropertyIsEqualTo>" + " <ogc:PropertyName>apiso:Title</ogc:PropertyName>" + " <ogc:Literal>starship trooper</ogc:Literal>" + " </ogc:PropertyIsEqualTo>" + " </ogc:Not>" + "</ogc:Filter>"; reader = new StringReader(XMLrequest); element = (JAXBElement) filterUnmarshaller.unmarshal(reader); filter = (FilterType) element.getValue(); assertTrue(filter.getComparisonOps() == null); assertTrue(filter.getLogicOps() != null); assertTrue(filter.getId().isEmpty() ); assertTrue(filter.getSpatialOps() == null); spaQuery = (SpatialQuery) filterParser.getQuery(new QueryConstraintType(filter, "1.1.0"), null, null, null); assertTrue(spaQuery.getSpatialFilter() == null); assertEquals(spaQuery.getSubQueries().size(), 0); assertEquals(spaQuery.getQuery(), "Title:\"starship trooper\""); assertEquals(spaQuery.getLogicalOperator(), SerialChainFilter.NOT); /** * Test 5: a simple Filter Not propertyIsNotEqualTo */ XMLrequest ="<ogc:Filter xmlns:ogc=\"http://www.opengis.net/ogc\" xmlns:apiso=\"http://www.opengis.net/cat/csw/apiso/1.0\">" + " <ogc:Not> " + " <ogc:PropertyIsNotEqualTo>" + " <ogc:PropertyName>apiso:Title</ogc:PropertyName>" + " <ogc:Literal>starship trooper</ogc:Literal>" + " </ogc:PropertyIsNotEqualTo>" + " </ogc:Not>" + "</ogc:Filter>"; reader = new StringReader(XMLrequest); element = (JAXBElement) filterUnmarshaller.unmarshal(reader); filter = (FilterType) element.getValue(); assertTrue(filter.getComparisonOps() == null); assertTrue(filter.getLogicOps() != null); assertTrue(filter.getId().isEmpty() ); assertTrue(filter.getSpatialOps() == null); spaQuery = (SpatialQuery) filterParser.getQuery(new QueryConstraintType(filter, "1.1.0"), null, null, null); assertTrue(spaQuery.getSpatialFilter() == null); assertEquals(spaQuery.getSubQueries().size(), 0); assertEquals(spaQuery.getQuery(), "metafile:doc NOT Title:\"starship trooper\""); assertEquals(spaQuery.getLogicalOperator(), SerialChainFilter.NOT); /** * Test 6: a simple Filter Not PropertyIsGreaterThanOrEqualTo */ XMLrequest ="<ogc:Filter xmlns:ogc=\"http://www.opengis.net/ogc\" xmlns:apiso=\"http://www.opengis.net/cat/csw/apiso/1.0\">" + " <ogc:Not> " + " <ogc:PropertyIsGreaterThanOrEqualTo>" + " <ogc:PropertyName>apiso:CreationDate</ogc:PropertyName>" + " <ogc:Literal>2007-06-02</ogc:Literal>" + " </ogc:PropertyIsGreaterThanOrEqualTo>" + " </ogc:Not>" + "</ogc:Filter>"; reader = new StringReader(XMLrequest); element = (JAXBElement) filterUnmarshaller.unmarshal(reader); filter = (FilterType) element.getValue(); assertTrue(filter.getComparisonOps() == null); assertTrue(filter.getLogicOps() != null); assertTrue(filter.getId().isEmpty() ); assertTrue(filter.getSpatialOps() == null); spaQuery = (SpatialQuery) filterParser.getQuery(new QueryConstraintType(filter, "1.1.0"), null, null, null); assertTrue(spaQuery.getSpatialFilter() == null); assertEquals(spaQuery.getSubQueries().size(), 0); assertEquals(spaQuery.getQuery(), "CreationDate:[\"20070602000000\" 30000101000000]"); assertEquals(spaQuery.getLogicalOperator(), SerialChainFilter.NOT); /** * Test 7: a simple Filter Not PropertyIsGreaterThanOrEqualTo + typeName */ spaQuery = (SpatialQuery) filterParser.getQuery(new QueryConstraintType(filter, "1.1.0"), null, null, Arrays.asList(TypeNames.METADATA_QNAME)); assertTrue(spaQuery.getSpatialFilter() == null); assertEquals(spaQuery.getSubQueries().size(), 1); assertEquals(spaQuery.getQuery(), "(objectType:\"MD_Metadata\")"); assertEquals(spaQuery.getLogicalOperator(), SerialChainFilter.AND); assertEquals(spaQuery.getSubQueries().get(0).getQuery(),"CreationDate:[\"20070602000000\" 30000101000000]"); assertEquals(spaQuery.getSubQueries().get(0).getLogicalOperator(), SerialChainFilter.NOT); pool.recycle(filterUnmarshaller); } /** * Test simple Spatial filter * * @throws java.lang.Exception */ @Test public void simpleSpatialFilterTest() throws Exception { Unmarshaller filterUnmarshaller = pool.acquireUnmarshaller(); /** * Test 1: a simple spatial Filter Intersects */ String XMLrequest ="<ogc:Filter xmlns:ogc=\"http://www.opengis.net/ogc\" " + " xmlns:gml=\"http://www.opengis.net/gml\"" + " xmlns:apiso=\"http://www.opengis.net/cat/csw/apiso/1.0\"> " + " <ogc:Intersects> " + " <ogc:PropertyName>apiso:BoundingBox</ogc:PropertyName> " + " <gml:Envelope srsName=\"EPSG:4326\"> " + " <gml:lowerCorner>7 12</gml:lowerCorner> " + " <gml:upperCorner>20 20</gml:upperCorner> " + " </gml:Envelope> " + " </ogc:Intersects> " + "</ogc:Filter>"; StringReader reader = new StringReader(XMLrequest); JAXBElement element = (JAXBElement) filterUnmarshaller.unmarshal(reader); FilterType filter = (FilterType) element.getValue(); assertTrue(filter.getComparisonOps() == null); assertTrue(filter.getLogicOps() == null); assertTrue(filter.getId().isEmpty() ); assertTrue(filter.getSpatialOps() != null); SpatialQuery spaQuery = (SpatialQuery) filterParser.getQuery(new QueryConstraintType(filter, "1.1.0"), null, null, null); assertTrue(spaQuery.getSpatialFilter() != null); assertEquals(spaQuery.getQuery(), "metafile:doc"); assertEquals(spaQuery.getSubQueries().size(), 0); assertTrue(spaQuery.getSpatialFilter() instanceof LuceneOGCFilter); LuceneOGCFilter spatialFilter = (LuceneOGCFilter) spaQuery.getSpatialFilter(); assertTrue(spatialFilter.getOGCFilter() instanceof Intersects); /** * Test 2: a simple Distance Filter DWithin */ XMLrequest ="<ogc:Filter xmlns:ogc=\"http://www.opengis.net/ogc\" " + " xmlns:gml=\"http://www.opengis.net/gml\"" + " xmlns:apiso=\"http://www.opengis.net/cat/csw/apiso/1.0\"> " + " <ogc:DWithin> " + " <ogc:PropertyName>apiso:BoundingBox</ogc:PropertyName> " + " <gml:Point srsName=\"EPSG:4326\"> " + " <gml:coordinates>3.4,2.5</gml:coordinates> " + " </gml:Point> " + " <ogc:Distance units='m'>1000</ogc:Distance> " + " </ogc:DWithin> " + "</ogc:Filter>"; reader = new StringReader(XMLrequest); element = (JAXBElement) filterUnmarshaller.unmarshal(reader); filter = (FilterType) element.getValue(); assertTrue(filter.getComparisonOps() == null); assertTrue(filter.getLogicOps() == null); assertTrue(filter.getId().isEmpty() ); assertTrue(filter.getSpatialOps() != null); spaQuery = (SpatialQuery) filterParser.getQuery(new QueryConstraintType(filter, "1.1.0"), null, null, null); assertTrue(spaQuery.getSpatialFilter() != null); assertEquals(spaQuery.getQuery(), "metafile:doc"); assertEquals(spaQuery.getSubQueries().size(), 0); assertTrue(spaQuery.getSpatialFilter() instanceof LuceneOGCFilter); spatialFilter = (LuceneOGCFilter) spaQuery.getSpatialFilter(); assertTrue(spatialFilter.getOGCFilter() instanceof DWithin); /** * Test 3: a simple spatial Filter Intersects */ XMLrequest = "<ogc:Filter xmlns:ogc=\"http://www.opengis.net/ogc\" " + " xmlns:gml=\"http://www.opengis.net/gml\"" + " xmlns:apiso=\"http://www.opengis.net/cat/csw/apiso/1.0\"> " + " <ogc:Intersects> " + " <ogc:PropertyName>apiso:BoundingBox</ogc:PropertyName> " + " <gml:LineString srsName=\"EPSG:4326\"> " + " <gml:coordinates ts=\" \" decimal=\".\" cs=\",\">1,2 10,15</gml:coordinates>" + " </gml:LineString> " + " </ogc:Intersects> " + "</ogc:Filter>"; reader = new StringReader(XMLrequest); element = (JAXBElement) filterUnmarshaller.unmarshal(reader); filter = (FilterType) element.getValue(); assertTrue(filter.getComparisonOps() == null); assertTrue(filter.getLogicOps() == null); assertTrue(filter.getId().isEmpty() ); assertTrue(filter.getSpatialOps() != null); spaQuery = (SpatialQuery) filterParser.getQuery(new QueryConstraintType(filter, "1.1.0"), null, null, null); assertTrue(spaQuery.getSpatialFilter() != null); assertEquals(spaQuery.getQuery(), "metafile:doc"); assertEquals(spaQuery.getSubQueries().size(), 0); assertTrue(spaQuery.getSpatialFilter() instanceof LuceneOGCFilter); spatialFilter = (LuceneOGCFilter) spaQuery.getSpatialFilter(); assertTrue(spatialFilter.getOGCFilter() instanceof Intersects); pool.recycle(filterUnmarshaller); } /** * Test invalid Filter * * @throws java.lang.Exception */ @Test public void errorFilterTest() throws Exception { Unmarshaller filterUnmarshaller = pool.acquireUnmarshaller(); /** * Test 1: a simple Filter PropertyIsGreaterThanOrEqualTo with bad time format */ String XMLrequest = "<ogc:Filter xmlns:ogc=\"http://www.opengis.net/ogc\" xmlns:apiso=\"http://www.opengis.net/cat/csw/apiso/1.0\">" + " <ogc:PropertyIsGreaterThanOrEqualTo>" + " <ogc:PropertyName>apiso:CreationDate</ogc:PropertyName>" + " <ogc:Literal>bonjour</ogc:Literal>" + " </ogc:PropertyIsGreaterThanOrEqualTo>" + "</ogc:Filter>"; StringReader reader = new StringReader(XMLrequest); JAXBElement element = (JAXBElement) filterUnmarshaller.unmarshal(reader); FilterType filter = (FilterType) element.getValue(); assertTrue(filter.getComparisonOps() != null); assertTrue(filter.getLogicOps() == null); assertTrue(filter.getId().isEmpty() ); assertTrue(filter.getSpatialOps() == null); SpatialQuery spaQuery; boolean error = false; try { spaQuery = (SpatialQuery) filterParser.getQuery(new QueryConstraintType(filter, "1.1.0"), null, null, null); } catch (FilterParserException ex) { assertEquals(FilterParser.QUERY_CONSTRAINT, ex.getLocator()); assertEquals(INVALID_PARAMETER_VALUE, ex.getExceptionCode()); error = true; } assertTrue(error); /** * Test 2: a simple Filter propertyIsLike without literal */ XMLrequest ="<ogc:Filter xmlns:ogc=\"http://www.opengis.net/ogc\" xmlns:apiso=\"http://www.opengis.net/cat/csw/apiso/1.0\">" + " <ogc:PropertyIsLike escapeChar=\"\\\" singleChar=\"?\" wildCard=\"*\">" + " <ogc:PropertyName>apiso:Title</ogc:PropertyName>" + " </ogc:PropertyIsLike>" + "</ogc:Filter>"; reader = new StringReader(XMLrequest); element = (JAXBElement) filterUnmarshaller.unmarshal(reader); filter = (FilterType) element.getValue(); assertTrue(filter.getComparisonOps() != null); assertTrue(filter.getLogicOps() == null); assertTrue(filter.getId().isEmpty() ); assertTrue(filter.getSpatialOps() == null); error = false; try { spaQuery = (SpatialQuery) filterParser.getQuery(new QueryConstraintType(filter, "1.1.0"), null, null, null); } catch (FilterParserException ex) { assertEquals(FilterParser.QUERY_CONSTRAINT, ex.getLocator()); assertEquals(INVALID_PARAMETER_VALUE, ex.getExceptionCode()); error = true; } assertTrue(error); /** * Test 3: a simple Filter PropertyIsNull without propertyName */ XMLrequest ="<ogc:Filter xmlns:ogc=\"http://www.opengis.net/ogc\" xmlns:apiso=\"http://www.opengis.net/cat/csw/apiso/1.0\">" + " <ogc:PropertyIsNull>" + " </ogc:PropertyIsNull>" + "</ogc:Filter>"; reader = new StringReader(XMLrequest); element = (JAXBElement) filterUnmarshaller.unmarshal(reader); filter = (FilterType) element.getValue(); assertTrue(filter.getComparisonOps() != null); assertTrue(filter.getLogicOps() == null); assertTrue(filter.getId().isEmpty() ); assertTrue(filter.getSpatialOps() == null); error = false; try { spaQuery = (SpatialQuery) filterParser.getQuery(new QueryConstraintType(filter, "1.1.0"), null, null, null); } catch (FilterParserException ex) { assertEquals(FilterParser.QUERY_CONSTRAINT, ex.getLocator()); assertEquals(INVALID_PARAMETER_VALUE, ex.getExceptionCode()); error = true; } assertTrue(error); /** * Test 4: a simple Filter PropertyIsBetween without upper boundary */ XMLrequest ="<ogc:Filter xmlns:ogc=\"http://www.opengis.net/ogc\" xmlns:apiso=\"http://www.opengis.net/cat/csw/apiso/1.0\">" + " <ogc:PropertyIsBetween>" + " <ogc:PropertyName>apiso:CreationDate</ogc:PropertyName>" + " <ogc:LowerBoundary>" + " <ogc:Literal>2007-06-02</ogc:Literal>" + " </ogc:LowerBoundary>" + " </ogc:PropertyIsBetween>" + "</ogc:Filter>"; reader = new StringReader(XMLrequest); element = (JAXBElement) filterUnmarshaller.unmarshal(reader); filter = (FilterType) element.getValue(); assertTrue(filter.getComparisonOps() != null); assertTrue(filter.getLogicOps() == null); assertTrue(filter.getId().isEmpty() ); assertTrue(filter.getSpatialOps() == null); error = false; try { spaQuery = (SpatialQuery) filterParser.getQuery(new QueryConstraintType(filter, "1.1.0"), null, null, null); } catch (FilterParserException ex) { assertEquals(FilterParser.QUERY_CONSTRAINT, ex.getLocator()); assertEquals(INVALID_PARAMETER_VALUE, ex.getExceptionCode()); error = true; } assertTrue(error); /** * Test 5: a simple Filter PropertyIsBetween without lower boundary */ XMLrequest ="<ogc:Filter xmlns:ogc=\"http://www.opengis.net/ogc\" xmlns:apiso=\"http://www.opengis.net/cat/csw/apiso/1.0\">" + " <ogc:PropertyIsBetween>" + " <ogc:PropertyName>apiso:CreationDate</ogc:PropertyName>" + " <ogc:UpperBoundary>" + " <ogc:Literal>2007-06-02</ogc:Literal>" + " </ogc:UpperBoundary>" + " </ogc:PropertyIsBetween>" + "</ogc:Filter>"; reader = new StringReader(XMLrequest); element = (JAXBElement) filterUnmarshaller.unmarshal(reader); filter = (FilterType) element.getValue(); assertTrue(filter.getComparisonOps() != null); assertTrue(filter.getLogicOps() == null); assertTrue(filter.getId().isEmpty() ); assertTrue(filter.getSpatialOps() == null); error = false; try { spaQuery = (SpatialQuery) filterParser.getQuery(new QueryConstraintType(filter, "1.1.0"), null, null, null); } catch (FilterParserException ex) { assertEquals(FilterParser.QUERY_CONSTRAINT, ex.getLocator()); assertEquals(INVALID_PARAMETER_VALUE, ex.getExceptionCode()); error = true; } assertTrue(error); /** * Test 6: a simple Filter PropertyIsLessThanOrEqualTo without propertyName */ XMLrequest ="<ogc:Filter xmlns:ogc=\"http://www.opengis.net/ogc\" xmlns:apiso=\"http://www.opengis.net/cat/csw/apiso/1.0\">" + " <ogc:PropertyIsLessThanOrEqualTo>" + " <ogc:PropertyName>apiso:CreationDate</ogc:PropertyName>" + " </ogc:PropertyIsLessThanOrEqualTo>" + "</ogc:Filter>"; reader = new StringReader(XMLrequest); element = (JAXBElement) filterUnmarshaller.unmarshal(reader); filter = (FilterType) element.getValue(); assertTrue(filter.getComparisonOps() != null); assertTrue(filter.getLogicOps() == null); assertTrue(filter.getId().isEmpty() ); assertTrue(filter.getSpatialOps() == null); error = false; try { spaQuery = (SpatialQuery) filterParser.getQuery(new QueryConstraintType(filter, "1.1.0"), null, null, null); } catch (FilterParserException ex) { assertEquals(FilterParser.QUERY_CONSTRAINT, ex.getLocator()); assertEquals(INVALID_PARAMETER_VALUE, ex.getExceptionCode()); error = true; } assertTrue(error); pool.recycle(filterUnmarshaller); } /** * Test Multiple Spatial Filter * * @throws java.lang.Exception */ @Test public void multipleSpatialFilterTest() throws Exception { Unmarshaller filterUnmarshaller = pool.acquireUnmarshaller(); /** * Test 1: two spatial Filter with AND */ String XMLrequest ="<ogc:Filter xmlns:ogc=\"http://www.opengis.net/ogc\" " + " xmlns:gml=\"http://www.opengis.net/gml\"" + " xmlns:apiso=\"http://www.opengis.net/cat/csw/apiso/1.0\">" + " <ogc:And> " + " <ogc:Intersects> " + " <ogc:PropertyName>apiso:BoundingBox</ogc:PropertyName> " + " <gml:Envelope srsName=\"EPSG:4326\"> " + " <gml:lowerCorner>7 12</gml:lowerCorner> " + " <gml:upperCorner>20 20</gml:upperCorner> " + " </gml:Envelope> " + " </ogc:Intersects> " + " <ogc:Intersects> " + " <ogc:PropertyName>apiso:BoundingBox</ogc:PropertyName> " + " <gml:Envelope srsName=\"EPSG:4326\"> " + " <gml:lowerCorner>-2 -4</gml:lowerCorner> " + " <gml:upperCorner>12 12</gml:upperCorner> " + " </gml:Envelope> " + " </ogc:Intersects> " + " </ogc:And> " + "</ogc:Filter>"; StringReader reader = new StringReader(XMLrequest); JAXBElement element = (JAXBElement) filterUnmarshaller.unmarshal(reader); FilterType filter = (FilterType) element.getValue(); assertTrue(filter.getComparisonOps() == null); assertTrue(filter.getLogicOps() != null); assertTrue(filter.getId().isEmpty() ); assertTrue(filter.getSpatialOps() == null); SpatialQuery spaQuery = (SpatialQuery) filterParser.getQuery(new QueryConstraintType(filter, "1.1.0"), null, null, null); assertTrue(spaQuery.getSpatialFilter() != null); assertEquals(spaQuery.getQuery(), "metafile:doc"); assertEquals(spaQuery.getSubQueries().size(), 0); assertTrue(spaQuery.getSpatialFilter() instanceof SerialChainFilter); SerialChainFilter chainFilter = (SerialChainFilter) spaQuery.getSpatialFilter(); assertEquals(chainFilter.getActionType().length, 1); assertEquals(chainFilter.getActionType()[0], SerialChainFilter.AND); assertEquals(chainFilter.getChain().size(), 2); /** * Test 2: three spatial Filter with OR */ XMLrequest ="<ogc:Filter xmlns:ogc=\"http://www.opengis.net/ogc\" " + " xmlns:gml=\"http://www.opengis.net/gml\"" + " xmlns:apiso=\"http://www.opengis.net/cat/csw/apiso/1.0\"> " + " <ogc:Or> " + " <ogc:Intersects> " + " <ogc:PropertyName>apiso:BoundingBox</ogc:PropertyName> " + " <gml:Envelope srsName=\"EPSG:4326\"> " + " <gml:lowerCorner>7 12</gml:lowerCorner> " + " <gml:upperCorner>20 20</gml:upperCorner> " + " </gml:Envelope> " + " </ogc:Intersects> " + " <ogc:Contains> " + " <ogc:PropertyName>apiso:BoundingBox</ogc:PropertyName> " + " <gml:Point srsName=\"EPSG:4326\"> " + " <gml:coordinates>3.4,2.5</gml:coordinates> " + " </gml:Point> " + " </ogc:Contains> " + " <ogc:BBOX> " + " <ogc:PropertyName>apiso:BoundingBox</ogc:PropertyName>" + " <gml:Envelope srsName=\"EPSG:4326\"> " + " <gml:lowerCorner>-20 -20</gml:lowerCorner> " + " <gml:upperCorner>20 20</gml:upperCorner> " + " </gml:Envelope> " + " </ogc:BBOX> " + " </ogc:Or> " + "</ogc:Filter>"; reader = new StringReader(XMLrequest); element = (JAXBElement) filterUnmarshaller.unmarshal(reader); filter = (FilterType) element.getValue(); assertTrue(filter.getComparisonOps() == null); assertTrue(filter.getLogicOps() != null); assertTrue(filter.getId().isEmpty() ); assertTrue(filter.getSpatialOps() == null); spaQuery = (SpatialQuery) filterParser.getQuery(new QueryConstraintType(filter, "1.1.0"), null, null, null); assertTrue(spaQuery.getSpatialFilter() != null); assertEquals(spaQuery.getQuery(), "metafile:doc"); assertEquals(spaQuery.getSubQueries().size(), 0); assertTrue(spaQuery.getSpatialFilter() instanceof SerialChainFilter); chainFilter = (SerialChainFilter) spaQuery.getSpatialFilter(); assertEquals(chainFilter.getActionType().length, 2); assertEquals(chainFilter.getActionType()[0], SerialChainFilter.OR); assertEquals(chainFilter.getActionType()[1], SerialChainFilter.OR); assertEquals(chainFilter.getChain().size(), 3); //we verify each filter LuceneOGCFilter f1 = (LuceneOGCFilter) chainFilter.getChain().get(0); assertTrue(f1.getOGCFilter() instanceof Intersects); LuceneOGCFilter f2 = (LuceneOGCFilter) chainFilter.getChain().get(1); assertTrue(f2.getOGCFilter() instanceof Contains); LuceneOGCFilter f3 = (LuceneOGCFilter) chainFilter.getChain().get(2); assertTrue(f3.getOGCFilter() instanceof BBOX); /** * Test 3: three spatial Filter F1 AND (F2 OR F3) */ XMLrequest ="<ogc:Filter xmlns:ogc=\"http://www.opengis.net/ogc\" " + " xmlns:gml=\"http://www.opengis.net/gml\"" + " xmlns:apiso=\"http://www.opengis.net/cat/csw/apiso/1.0\"> " + " <ogc:And> " + " <ogc:Intersects> " + " <ogc:PropertyName>apiso:BoundingBox</ogc:PropertyName> " + " <gml:Envelope srsName=\"EPSG:4326\"> " + " <gml:lowerCorner>7 12</gml:lowerCorner> " + " <gml:upperCorner>20 20</gml:upperCorner> " + " </gml:Envelope> " + " </ogc:Intersects> " + " <ogc:Or> " + " <ogc:Contains> " + " <ogc:PropertyName>apiso:BoundingBox</ogc:PropertyName> " + " <gml:Point srsName=\"EPSG:4326\"> " + " <gml:coordinates>3.4,2.5</gml:coordinates> " + " </gml:Point> " + " </ogc:Contains> " + " <ogc:BBOX> " + " <ogc:PropertyName>apiso:BoundingBox</ogc:PropertyName> " + " <gml:Envelope srsName=\"EPSG:4326\"> " + " <gml:lowerCorner>-20 -20</gml:lowerCorner> " + " <gml:upperCorner>20 20</gml:upperCorner> " + " </gml:Envelope> " + " </ogc:BBOX> " + " </ogc:Or> " + " </ogc:And> " + "</ogc:Filter> "; reader = new StringReader(XMLrequest); element = (JAXBElement) filterUnmarshaller.unmarshal(reader); filter = (FilterType) element.getValue(); assertTrue(filter.getComparisonOps() == null); assertTrue(filter.getLogicOps() != null); assertTrue(filter.getId().isEmpty() ); assertTrue(filter.getSpatialOps() == null); spaQuery = (SpatialQuery) filterParser.getQuery(new QueryConstraintType(filter, "1.1.0"), null, null, null); assertTrue(spaQuery.getSpatialFilter() != null); assertEquals(spaQuery.getQuery(), "(metafile:doc)"); assertEquals(spaQuery.getSubQueries().size(), 0); assertTrue(spaQuery.getSpatialFilter() instanceof SerialChainFilter); chainFilter = (SerialChainFilter) spaQuery.getSpatialFilter(); assertEquals(chainFilter.getActionType().length, 1); assertEquals(chainFilter.getActionType()[0], SerialChainFilter.AND); assertEquals(chainFilter.getChain().size(), 2); //we verify each filter f1 = (LuceneOGCFilter) chainFilter.getChain().get(1); assertTrue(f1.getOGCFilter() instanceof Intersects); SerialChainFilter cf2 = (SerialChainFilter) chainFilter.getChain().get(0); assertEquals(cf2.getActionType().length, 1); assertEquals(cf2.getActionType()[0], SerialChainFilter.OR); assertEquals(cf2.getChain().size(), 2); LuceneOGCFilter cf2_1 = (LuceneOGCFilter) cf2.getChain().get(0); assertTrue(cf2_1.getOGCFilter() instanceof Contains); LuceneOGCFilter cf2_2 = (LuceneOGCFilter) cf2.getChain().get(1); assertTrue(cf2_2.getOGCFilter() instanceof BBOX); /** * Test 4: three spatial Filter (NOT F1) AND F2 AND F3 */ XMLrequest ="<ogc:Filter xmlns:ogc=\"http://www.opengis.net/ogc\" " + " xmlns:gml=\"http://www.opengis.net/gml\"" + " xmlns:apiso=\"http://www.opengis.net/cat/csw/apiso/1.0\"> " + " <ogc:And> " + " <ogc:Not> " + " <ogc:Intersects> " + " <ogc:PropertyName>apiso:BoundingBox</ogc:PropertyName> " + " <gml:Envelope srsName=\"EPSG:4326\"> " + " <gml:lowerCorner>7 12</gml:lowerCorner> " + " <gml:upperCorner>20 20</gml:upperCorner> " + " </gml:Envelope> " + " </ogc:Intersects> " + " </ogc:Not> " + " <ogc:Contains> " + " <ogc:PropertyName>apiso:BoundingBox</ogc:PropertyName> " + " <gml:Point srsName=\"EPSG:4326\"> " + " <gml:coordinates>3.4,2.5</gml:coordinates> " + " </gml:Point> " + " </ogc:Contains> " + " <ogc:BBOX> " + " <ogc:PropertyName>apiso:BoundingBox</ogc:PropertyName> " + " <gml:Envelope srsName=\"EPSG:4326\"> " + " <gml:lowerCorner>-20 -20</gml:lowerCorner> " + " <gml:upperCorner>20 20</gml:upperCorner> " + " </gml:Envelope> " + " </ogc:BBOX> " + " </ogc:And> " + "</ogc:Filter> "; reader = new StringReader(XMLrequest); element = (JAXBElement) filterUnmarshaller.unmarshal(reader); filter = (FilterType) element.getValue(); assertTrue(filter.getComparisonOps() == null); assertTrue(filter.getLogicOps() != null); assertTrue(filter.getId().isEmpty() ); assertTrue(filter.getSpatialOps() == null); spaQuery = (SpatialQuery) filterParser.getQuery(new QueryConstraintType(filter, "1.1.0"), null, null, null); assertTrue(spaQuery.getSpatialFilter() != null); assertEquals(spaQuery.getQuery(), "(metafile:doc)"); assertEquals(spaQuery.getSubQueries().size(), 0); assertTrue(spaQuery.getSpatialFilter() instanceof SerialChainFilter); chainFilter = (SerialChainFilter) spaQuery.getSpatialFilter(); assertEquals(chainFilter.getActionType().length, 2); assertEquals(chainFilter.getActionType()[0], SerialChainFilter.AND); assertEquals(chainFilter.getActionType()[1], SerialChainFilter.AND); assertEquals(chainFilter.getChain().size(), 3); //we verify each filter SerialChainFilter cf1 = (SerialChainFilter) chainFilter.getChain().get(0); assertEquals(cf1.getChain().size(), 1); assertEquals(cf1.getActionType().length, 1); assertEquals(cf1.getActionType()[0], SerialChainFilter.NOT); LuceneOGCFilter cf1_1 = (LuceneOGCFilter) cf1.getChain().get(0); assertTrue(cf1_1.getOGCFilter() instanceof Intersects); f2 = (LuceneOGCFilter) chainFilter.getChain().get(1); assertTrue(f2.getOGCFilter() instanceof Contains); f3 = (LuceneOGCFilter) chainFilter.getChain().get(2); assertTrue(f3.getOGCFilter() instanceof BBOX); /** * Test 5: three spatial Filter NOT (F1 OR F2) AND F3 */ XMLrequest ="<ogc:Filter xmlns:ogc=\"http://www.opengis.net/ogc\" " + " xmlns:gml=\"http://www.opengis.net/gml\"" + " xmlns:apiso=\"http://www.opengis.net/cat/csw/apiso/1.0\"> " + " <ogc:And> " + " <ogc:Not> " + " <ogc:Or> " + " <ogc:Intersects> " + " <ogc:PropertyName>apiso:BoundingBox</ogc:PropertyName>" + " <gml:Envelope srsName=\"EPSG:4326\"> " + " <gml:lowerCorner>7 12</gml:lowerCorner> " + " <gml:upperCorner>20 20</gml:upperCorner> " + " </gml:Envelope> " + " </ogc:Intersects> " + " <ogc:Contains> " + " <ogc:PropertyName>apiso:BoundingBox</ogc:PropertyName>" + " <gml:Point srsName=\"EPSG:4326\"> " + " <gml:coordinates>3.4,2.5</gml:coordinates> " + " </gml:Point> " + " </ogc:Contains> " + " </ogc:Or> " + " </ogc:Not> " + " <ogc:BBOX> " + " <ogc:PropertyName>apiso:BoundingBox</ogc:PropertyName> " + " <gml:Envelope srsName=\"EPSG:4326\"> " + " <gml:lowerCorner>-20 -20</gml:lowerCorner> " + " <gml:upperCorner>20 20</gml:upperCorner> " + " </gml:Envelope> " + " </ogc:BBOX> " + " </ogc:And> " + "</ogc:Filter> "; reader = new StringReader(XMLrequest); element = (JAXBElement) filterUnmarshaller.unmarshal(reader); filter = (FilterType) element.getValue(); assertTrue(filter.getComparisonOps() == null); assertTrue(filter.getLogicOps() != null); assertTrue(filter.getId().isEmpty() ); assertTrue(filter.getSpatialOps() == null); spaQuery = (SpatialQuery) filterParser.getQuery(new QueryConstraintType(filter, "1.1.0"), null, null, null); assertTrue(spaQuery.getSpatialFilter() != null); assertEquals(spaQuery.getQuery(), "(metafile:doc)"); assertEquals(spaQuery.getSubQueries().size(), 0); assertTrue(spaQuery.getSpatialFilter() instanceof SerialChainFilter); chainFilter = (SerialChainFilter) spaQuery.getSpatialFilter(); assertEquals(chainFilter.getActionType().length, 1); assertEquals(chainFilter.getActionType()[0], SerialChainFilter.AND); assertEquals(chainFilter.getChain().size(), 2); //we verify each filter cf1 = (SerialChainFilter) chainFilter.getChain().get(0); assertEquals(cf1.getChain().size(), 1); assertEquals(cf1.getActionType().length, 1); assertEquals(cf1.getActionType()[0], SerialChainFilter.NOT); assertTrue(cf1.getChain().get(0) instanceof SerialChainFilter); SerialChainFilter cf1_cf1 = (SerialChainFilter) cf1.getChain().get(0); assertEquals(cf1_cf1.getChain().size(), 2); assertEquals(cf1_cf1.getActionType().length, 1); assertEquals(cf1_cf1.getActionType()[0], SerialChainFilter.OR); assertTrue(cf1_cf1.getChain().get(0) instanceof LuceneOGCFilter); LuceneOGCFilter cf1_cf1_1 = (LuceneOGCFilter) cf1_cf1.getChain().get(0); assertTrue(cf1_cf1_1.getOGCFilter() instanceof Intersects); assertTrue(cf1_cf1.getChain().get(1) instanceof LuceneOGCFilter); LuceneOGCFilter cf1_cf1_2 = (LuceneOGCFilter) cf1_cf1.getChain().get(1); assertTrue(cf1_cf1_2.getOGCFilter() instanceof Contains); f2 = (LuceneOGCFilter) chainFilter.getChain().get(1); assertTrue(f2.getOGCFilter() instanceof BBOX); pool.recycle(filterUnmarshaller); } /** * Test complex query with both comparison, logical and spatial query * * @throws java.lang.Exception */ @Test public void multipleMixedFilterTest() throws Exception { Unmarshaller filterUnmarshaller = pool.acquireUnmarshaller(); /** * Test 1: PropertyIsLike AND INTERSECT */ String XMLrequest ="<ogc:Filter xmlns:ogc=\"http://www.opengis.net/ogc\" " + " xmlns:gml=\"http://www.opengis.net/gml\"" + " xmlns:apiso=\"http://www.opengis.net/cat/csw/apiso/1.0\"> " + " <ogc:And> " + " <ogc:PropertyIsLike escapeChar=\"\\\" singleChar=\"?\" wildCard=\"*\">" + " <ogc:PropertyName>apiso:Title</ogc:PropertyName> " + " <ogc:Literal>*VM*</ogc:Literal> " + " </ogc:PropertyIsLike> " + " <ogc:Intersects> " + " <ogc:PropertyName>apiso:BoundingBox</ogc:PropertyName> " + " <gml:Envelope srsName=\"EPSG:4326\"> " + " <gml:lowerCorner>-2 -4</gml:lowerCorner> " + " <gml:upperCorner>12 12</gml:upperCorner> " + " </gml:Envelope> " + " </ogc:Intersects> " + " </ogc:And> " + "</ogc:Filter>"; StringReader reader = new StringReader(XMLrequest); JAXBElement element = (JAXBElement) filterUnmarshaller.unmarshal(reader); FilterType filter = (FilterType) element.getValue(); assertTrue(filter.getComparisonOps() == null); assertTrue(filter.getLogicOps() != null); assertTrue(filter.getId().isEmpty() ); assertTrue(filter.getSpatialOps() == null); SpatialQuery spaQuery = (SpatialQuery) filterParser.getQuery(new QueryConstraintType(filter, "1.1.0"), null, null, null); assertTrue(spaQuery.getSpatialFilter() != null); assertEquals(spaQuery.getQuery(), "(Title:(*VM*))"); assertEquals(spaQuery.getSubQueries().size(), 0); assertTrue(spaQuery.getSpatialFilter() instanceof LuceneOGCFilter); LuceneOGCFilter spaFilter = (LuceneOGCFilter) spaQuery.getSpatialFilter(); assertTrue(spaFilter.getOGCFilter() instanceof Intersects); /** * Test 2: PropertyIsLike AND INTERSECT AND propertyIsEquals */ XMLrequest = "<ogc:Filter xmlns:ogc=\"http://www.opengis.net/ogc\" " + " xmlns:gml=\"http://www.opengis.net/gml\"" + " xmlns:apiso=\"http://www.opengis.net/cat/csw/apiso/1.0\"> " + " <ogc:And> " + " <ogc:PropertyIsLike escapeChar=\"\\\" singleChar=\"?\" wildCard=\"*\">" + " <ogc:PropertyName>apiso:Title</ogc:PropertyName> " + " <ogc:Literal>*VM*</ogc:Literal> " + " </ogc:PropertyIsLike> " + " <ogc:Intersects> " + " <ogc:PropertyName>apiso:BoundingBox</ogc:PropertyName> " + " <gml:Envelope srsName=\"EPSG:4326\"> " + " <gml:lowerCorner>-2 -4</gml:lowerCorner> " + " <gml:upperCorner>12 12</gml:upperCorner> " + " </gml:Envelope> " + " </ogc:Intersects> " + " <ogc:PropertyIsEqualTo> " + " <ogc:PropertyName>apiso:Title</ogc:PropertyName> " + " <ogc:Literal>VM</ogc:Literal> " + " </ogc:PropertyIsEqualTo> " + " </ogc:And> " + "</ogc:Filter>"; reader = new StringReader(XMLrequest); element = (JAXBElement) filterUnmarshaller.unmarshal(reader); filter = (FilterType) element.getValue(); assertTrue(filter.getComparisonOps() == null); assertTrue(filter.getLogicOps() != null); assertTrue(filter.getId().isEmpty() ); assertTrue(filter.getSpatialOps() == null); spaQuery = (SpatialQuery) filterParser.getQuery(new QueryConstraintType(filter, "1.1.0"), null, null, null); assertTrue(spaQuery.getSpatialFilter() != null); assertEquals(spaQuery.getQuery(), "(Title:(*VM*) AND Title:\"VM\")"); assertEquals(spaQuery.getSubQueries().size(), 0); assertTrue(spaQuery.getSpatialFilter() instanceof LuceneOGCFilter); spaFilter = (LuceneOGCFilter) spaQuery.getSpatialFilter(); assertTrue(spaFilter.getOGCFilter() instanceof Intersects); /** * Test 3: INTERSECT AND propertyIsEquals AND BBOX */ XMLrequest = "<ogc:Filter xmlns:ogc=\"http://www.opengis.net/ogc\" " + " xmlns:gml=\"http://www.opengis.net/gml\"" + " xmlns:apiso=\"http://www.opengis.net/cat/csw/apiso/1.0\"> " + " <ogc:And> " + " <ogc:Intersects> " + " <ogc:PropertyName>apiso:BoundingBox</ogc:PropertyName> " + " <gml:Envelope srsName=\"EPSG:4326\"> " + " <gml:lowerCorner>-2 -4</gml:lowerCorner> " + " <gml:upperCorner>12 12</gml:upperCorner> " + " </gml:Envelope> " + " </ogc:Intersects> " + " <ogc:PropertyIsEqualTo> " + " <ogc:PropertyName>apiso:Title</ogc:PropertyName> " + " <ogc:Literal>VM</ogc:Literal> " + " </ogc:PropertyIsEqualTo> " + " <ogc:BBOX> " + " <ogc:PropertyName>apiso:BoundingBox</ogc:PropertyName> " + " <gml:Envelope srsName=\"EPSG:4326\"> " + " <gml:lowerCorner>-20 -20</gml:lowerCorner> " + " <gml:upperCorner>20 20</gml:upperCorner> " + " </gml:Envelope> " + " </ogc:BBOX> " + " </ogc:And> " + "</ogc:Filter>"; reader = new StringReader(XMLrequest); element = (JAXBElement) filterUnmarshaller.unmarshal(reader); filter = (FilterType) element.getValue(); assertTrue(filter.getComparisonOps() == null); assertTrue(filter.getLogicOps() != null); assertTrue(filter.getId().isEmpty() ); assertTrue(filter.getSpatialOps() == null); spaQuery = (SpatialQuery) filterParser.getQuery(new QueryConstraintType(filter, "1.1.0"), null, null, null); assertTrue(spaQuery.getSpatialFilter() != null); assertEquals(spaQuery.getQuery(), "(Title:\"VM\")"); assertEquals(spaQuery.getSubQueries().size(), 0); assertTrue(spaQuery.getSpatialFilter() instanceof SerialChainFilter); SerialChainFilter chainFilter = (SerialChainFilter) spaQuery.getSpatialFilter(); assertEquals(chainFilter.getActionType().length, 1); assertEquals(chainFilter.getActionType()[0], SerialChainFilter.AND); assertEquals(chainFilter.getChain().size(), 2); LuceneOGCFilter f1 = (LuceneOGCFilter) chainFilter.getChain().get(0); assertTrue (f1.getOGCFilter() instanceof Intersects); LuceneOGCFilter f2 = (LuceneOGCFilter) chainFilter.getChain().get(1); assertTrue (f2.getOGCFilter() instanceof BBOX); /** * Test 4: PropertyIsLike OR INTERSECT OR propertyIsEquals */ XMLrequest = "<ogc:Filter xmlns:ogc=\"http://www.opengis.net/ogc\" " + " xmlns:gml=\"http://www.opengis.net/gml\"" + " xmlns:apiso=\"http://www.opengis.net/cat/csw/apiso/1.0\"> " + " <ogc:Or> " + " <ogc:PropertyIsLike escapeChar=\"\\\" singleChar=\"?\" wildCard=\"*\">" + " <ogc:PropertyName>apiso:Title</ogc:PropertyName> " + " <ogc:Literal>*VM*</ogc:Literal> " + " </ogc:PropertyIsLike> " + " <ogc:Intersects> " + " <ogc:PropertyName>apiso:BoundingBox</ogc:PropertyName> " + " <gml:Envelope srsName=\"EPSG:4326\"> " + " <gml:lowerCorner>-2 -4</gml:lowerCorner> " + " <gml:upperCorner>12 12</gml:upperCorner> " + " </gml:Envelope> " + " </ogc:Intersects> " + " <ogc:PropertyIsEqualTo> " + " <ogc:PropertyName>apiso:Title</ogc:PropertyName> " + " <ogc:Literal>VM</ogc:Literal> " + " </ogc:PropertyIsEqualTo> " + " </ogc:Or> " + "</ogc:Filter>"; reader = new StringReader(XMLrequest); element = (JAXBElement) filterUnmarshaller.unmarshal(reader); filter = (FilterType) element.getValue(); assertTrue(filter.getComparisonOps() == null); assertTrue(filter.getLogicOps() != null); assertTrue(filter.getId().isEmpty() ); assertTrue(filter.getSpatialOps() == null); spaQuery = (SpatialQuery) filterParser.getQuery(new QueryConstraintType(filter, "1.1.0"), null, null, null); assertTrue(spaQuery.getSpatialFilter() != null); assertEquals(spaQuery.getQuery(), "(Title:(*VM*) OR Title:\"VM\")"); assertEquals(spaQuery.getSubQueries().size(), 0); assertEquals(spaQuery.getLogicalOperator(), SerialChainFilter.OR); assertTrue(spaQuery.getSpatialFilter() instanceof LuceneOGCFilter); spaFilter = (LuceneOGCFilter) spaQuery.getSpatialFilter(); assertTrue(spaFilter.getOGCFilter() instanceof Intersects); /** * Test 5: INTERSECT OR propertyIsEquals OR BBOX */ XMLrequest = "<ogc:Filter xmlns:ogc=\"http://www.opengis.net/ogc\" " + " xmlns:gml=\"http://www.opengis.net/gml\"" + " xmlns:apiso=\"http://www.opengis.net/cat/csw/apiso/1.0\"> " + " <ogc:Or> " + " <ogc:Intersects> " + " <ogc:PropertyName>apiso:BoundingBox</ogc:PropertyName> " + " <gml:Envelope srsName=\"EPSG:4326\"> " + " <gml:lowerCorner>-2 -4</gml:lowerCorner> " + " <gml:upperCorner>12 12</gml:upperCorner> " + " </gml:Envelope> " + " </ogc:Intersects> " + " <ogc:PropertyIsEqualTo> " + " <ogc:PropertyName>apiso:Title</ogc:PropertyName> " + " <ogc:Literal>VM</ogc:Literal> " + " </ogc:PropertyIsEqualTo> " + " <ogc:BBOX> " + " <ogc:PropertyName>apiso:BoundingBox</ogc:PropertyName> " + " <gml:Envelope srsName=\"EPSG:4326\"> " + " <gml:lowerCorner>-20 -20</gml:lowerCorner> " + " <gml:upperCorner>20 20</gml:upperCorner> " + " </gml:Envelope> " + " </ogc:BBOX> " + " </ogc:Or> " + "</ogc:Filter>"; reader = new StringReader(XMLrequest); element = (JAXBElement) filterUnmarshaller.unmarshal(reader); filter = (FilterType) element.getValue(); assertTrue(filter.getComparisonOps() == null); assertTrue(filter.getLogicOps() != null); assertTrue(filter.getId().isEmpty() ); assertTrue(filter.getSpatialOps() == null); spaQuery = (SpatialQuery) filterParser.getQuery(new QueryConstraintType(filter, "1.1.0"), null, null, null); assertTrue(spaQuery.getSpatialFilter() != null); assertEquals(spaQuery.getQuery(), "(Title:\"VM\")"); assertEquals(spaQuery.getSubQueries().size(), 0); assertEquals(spaQuery.getLogicalOperator(), SerialChainFilter.OR); assertTrue(spaQuery.getSpatialFilter() instanceof SerialChainFilter); chainFilter = (SerialChainFilter) spaQuery.getSpatialFilter(); assertEquals(chainFilter.getActionType().length, 1); assertEquals(chainFilter.getActionType()[0], SerialChainFilter.OR); assertEquals(chainFilter.getChain().size(), 2); f1 = (LuceneOGCFilter) chainFilter.getChain().get(0); assertTrue (f1.getOGCFilter() instanceof Intersects); f2 = (LuceneOGCFilter) chainFilter.getChain().get(1); assertTrue (f2.getOGCFilter() instanceof BBOX); /** * Test 6: INTERSECT AND (propertyIsEquals OR BBOX) */ XMLrequest = "<ogc:Filter xmlns:ogc=\"http://www.opengis.net/ogc\" " + " xmlns:gml=\"http://www.opengis.net/gml\"" + " xmlns:apiso=\"http://www.opengis.net/cat/csw/apiso/1.0\"> " + " <ogc:And> " + " <ogc:Intersects> " + " <ogc:PropertyName>apiso:BoundingBox</ogc:PropertyName> " + " <gml:Envelope srsName=\"EPSG:4326\"> " + " <gml:lowerCorner>-2 -4</gml:lowerCorner> " + " <gml:upperCorner>12 12</gml:upperCorner> " + " </gml:Envelope> " + " </ogc:Intersects> " + " <ogc:Or> " + " <ogc:PropertyIsEqualTo> " + " <ogc:PropertyName>apiso:Title</ogc:PropertyName> " + " <ogc:Literal>VM</ogc:Literal> " + " </ogc:PropertyIsEqualTo> " + " <ogc:BBOX> " + " <ogc:PropertyName>apiso:BoundingBox</ogc:PropertyName> " + " <gml:Envelope srsName=\"EPSG:4326\"> " + " <gml:lowerCorner>-20 -20</gml:lowerCorner> " + " <gml:upperCorner>20 20</gml:upperCorner> " + " </gml:Envelope> " + " </ogc:BBOX> " + " </ogc:Or> " + " </ogc:And> " + "</ogc:Filter>"; reader = new StringReader(XMLrequest); element = (JAXBElement) filterUnmarshaller.unmarshal(reader); filter = (FilterType) element.getValue(); assertTrue(filter.getComparisonOps() == null); assertTrue(filter.getLogicOps() != null); assertTrue(filter.getId().isEmpty() ); assertTrue(filter.getSpatialOps() == null); spaQuery = (SpatialQuery) filterParser.getQuery(new QueryConstraintType(filter, "1.1.0"), null, null, null); assertTrue(spaQuery.getSpatialFilter() != null); assertEquals(spaQuery.getQuery(), "metafile:doc"); assertEquals(spaQuery.getSubQueries().size(), 1); assertEquals(spaQuery.getLogicalOperator(), SerialChainFilter.AND); assertTrue(spaQuery.getSpatialFilter() instanceof LuceneOGCFilter); spaFilter = (LuceneOGCFilter) spaQuery.getSpatialFilter(); assertTrue (spaFilter.getOGCFilter() instanceof Intersects); SpatialQuery subQuery1 = spaQuery.getSubQueries().get(0); assertTrue (subQuery1.getSpatialFilter() != null); assertEquals(subQuery1.getQuery(), "(Title:\"VM\")"); assertEquals(subQuery1.getSubQueries().size(), 0); assertEquals(subQuery1.getLogicalOperator(), SerialChainFilter.OR); assertTrue(subQuery1.getSpatialFilter() instanceof LuceneOGCFilter); spaFilter = (LuceneOGCFilter) subQuery1.getSpatialFilter(); assertTrue (spaFilter.getOGCFilter() instanceof BBOX); /** * Test 7: propertyIsNotEquals OR (propertyIsLike AND DWITHIN) */ XMLrequest = "<ogc:Filter xmlns:ogc=\"http://www.opengis.net/ogc\" " + " xmlns:gml=\"http://www.opengis.net/gml\"" + " xmlns:apiso=\"http://www.opengis.net/cat/csw/apiso/1.0\"> " + " <ogc:Or> " + " <ogc:PropertyIsNotEqualTo> " + " <ogc:PropertyName>apiso:Title</ogc:PropertyName> " + " <ogc:Literal>VMAI</ogc:Literal> " + " </ogc:PropertyIsNotEqualTo> " + " <ogc:And> " + " <ogc:PropertyIsLike escapeChar=\"\\\" singleChar=\"?\" wildCard=\"*\">" + " <ogc:PropertyName>apiso:Title</ogc:PropertyName> " + " <ogc:Literal>LO?Li</ogc:Literal> " + " </ogc:PropertyIsLike> " + " <ogc:DWithin> " + " <ogc:PropertyName>apiso:BoundingBox</ogc:PropertyName> " + " <gml:Point srsName=\"EPSG:4326\"> " + " <gml:coordinates>3.4,2.5</gml:coordinates> " + " </gml:Point> " + " <ogc:Distance units='m'>1000</ogc:Distance> " + " </ogc:DWithin> " + " </ogc:And> " + " </ogc:Or> " + "</ogc:Filter>"; reader = new StringReader(XMLrequest); element = (JAXBElement) filterUnmarshaller.unmarshal(reader); filter = (FilterType) element.getValue(); assertTrue(filter.getComparisonOps() == null); assertTrue(filter.getLogicOps() != null); assertTrue(filter.getId().isEmpty() ); assertTrue(filter.getSpatialOps() == null); spaQuery = (SpatialQuery) filterParser.getQuery(new QueryConstraintType(filter, "1.1.0"), null, null, null); assertTrue(spaQuery.getSpatialFilter() == null); assertEquals(spaQuery.getQuery(), "(metafile:doc NOT Title:\"VMAI\")"); assertEquals(spaQuery.getSubQueries().size(), 1); assertEquals(spaQuery.getLogicalOperator(), SerialChainFilter.OR); subQuery1 = spaQuery.getSubQueries().get(0); assertTrue (subQuery1.getSpatialFilter() != null); assertEquals(subQuery1.getQuery(), "(Title:(LO?Li))"); assertEquals(subQuery1.getSubQueries().size(), 0); assertEquals(subQuery1.getLogicalOperator(), SerialChainFilter.AND); assertTrue(subQuery1.getSpatialFilter() instanceof LuceneOGCFilter); spaFilter = (LuceneOGCFilter) subQuery1.getSpatialFilter(); assertTrue (spaFilter.getOGCFilter() instanceof DWithin); /** * Test 8: propertyIsLike AND INTERSECT AND (propertyIsEquals OR BBOX) AND (propertyIsNotEquals OR (Beyond AND propertyIsLike)) */ XMLrequest = "<ogc:Filter xmlns:ogc=\"http://www.opengis.net/ogc\" " + " xmlns:gml=\"http://www.opengis.net/gml\"" + " xmlns:apiso=\"http://www.opengis.net/cat/csw/apiso/1.0\"> " + " <ogc:And> " + " <ogc:PropertyIsLike escapeChar=\"\\\" singleChar=\"?\" wildCard=\"*\"> " + " <ogc:PropertyName>apiso:Title</ogc:PropertyName> " + " <ogc:Literal>*VM*</ogc:Literal> " + " </ogc:PropertyIsLike> " + " <ogc:Intersects> " + " <ogc:PropertyName>apiso:BoundingBox</ogc:PropertyName> " + " <gml:Envelope srsName=\"EPSG:4326\"> " + " <gml:lowerCorner>-2 -4</gml:lowerCorner> " + " <gml:upperCorner>12 12</gml:upperCorner> " + " </gml:Envelope> " + " </ogc:Intersects> " + " <ogc:Or> " + " <ogc:PropertyIsEqualTo> " + " <ogc:PropertyName>apiso:Title</ogc:PropertyName> " + " <ogc:Literal>PLOUF</ogc:Literal> " + " </ogc:PropertyIsEqualTo> " + " <ogc:BBOX> " + " <ogc:PropertyName>apiso:BoundingBox</ogc:PropertyName> " + " <gml:Envelope srsName=\"EPSG:4326\"> " + " <gml:lowerCorner>-20 -20</gml:lowerCorner> " + " <gml:upperCorner>20 20</gml:upperCorner> " + " </gml:Envelope> " + " </ogc:BBOX> " + " </ogc:Or> " + " <ogc:Or> " + " <ogc:PropertyIsNotEqualTo> " + " <ogc:PropertyName>apiso:Title</ogc:PropertyName> " + " <ogc:Literal>VMAI</ogc:Literal> " + " </ogc:PropertyIsNotEqualTo> " + " <ogc:And> " + " <ogc:PropertyIsLike escapeChar=\"\\\" singleChar=\"?\" wildCard=\"*\">" + " <ogc:PropertyName>apiso:Title</ogc:PropertyName> " + " <ogc:Literal>LO?Li</ogc:Literal> " + " </ogc:PropertyIsLike> " + " <ogc:DWithin> " + " <ogc:PropertyName>apiso:BoundingBox</ogc:PropertyName> " + " <gml:Point srsName=\"EPSG:4326\"> " + " <gml:coordinates>3.4,2.5</gml:coordinates> " + " </gml:Point> " + " <ogc:Distance units='m'>1000</ogc:Distance> " + " </ogc:DWithin> " + " </ogc:And> " + " </ogc:Or> " + " </ogc:And> " + "</ogc:Filter>"; reader = new StringReader(XMLrequest); element = (JAXBElement) filterUnmarshaller.unmarshal(reader); filter = (FilterType) element.getValue(); assertTrue(filter.getComparisonOps() == null); assertTrue(filter.getLogicOps() != null); assertTrue(filter.getId().isEmpty() ); assertTrue(filter.getSpatialOps() == null); spaQuery = (SpatialQuery) filterParser.getQuery(new QueryConstraintType(filter, "1.1.0"), null, null, null); assertTrue(spaQuery.getSpatialFilter() != null); assertEquals(spaQuery.getQuery(), "(Title:(*VM*))"); assertEquals(spaQuery.getSubQueries().size(), 2); assertEquals(spaQuery.getLogicalOperator(), SerialChainFilter.AND); assertTrue(spaQuery.getSpatialFilter() instanceof LuceneOGCFilter); spaFilter = (LuceneOGCFilter) spaQuery.getSpatialFilter(); assertTrue (spaFilter.getOGCFilter() instanceof Intersects); subQuery1 = spaQuery.getSubQueries().get(0); assertTrue (subQuery1.getSpatialFilter() != null); assertEquals(subQuery1.getQuery(), "(Title:\"PLOUF\")"); assertEquals(subQuery1.getSubQueries().size(), 0); assertEquals(subQuery1.getLogicalOperator(), SerialChainFilter.OR); assertTrue(subQuery1.getSpatialFilter() instanceof LuceneOGCFilter); spaFilter = (LuceneOGCFilter) subQuery1.getSpatialFilter(); assertTrue (spaFilter.getOGCFilter() instanceof BBOX); SpatialQuery subQuery2 = spaQuery.getSubQueries().get(1); assertTrue (subQuery2.getSpatialFilter() == null); assertEquals(subQuery2.getQuery(), "(metafile:doc NOT Title:\"VMAI\")"); assertEquals(subQuery2.getSubQueries().size(), 1); assertEquals(subQuery2.getLogicalOperator(), SerialChainFilter.OR); SpatialQuery subQuery2_1 = subQuery2.getSubQueries().get(0); assertTrue (subQuery2_1.getSpatialFilter() != null); assertEquals(subQuery2_1.getQuery(), "(Title:(LO?Li))"); assertEquals(subQuery2_1.getSubQueries().size(), 0); assertEquals(subQuery2_1.getLogicalOperator(), SerialChainFilter.AND); assertTrue(subQuery2_1.getSpatialFilter() instanceof LuceneOGCFilter); spaFilter = (LuceneOGCFilter) subQuery2_1.getSpatialFilter(); assertTrue (spaFilter.getOGCFilter() instanceof DWithin); /** * Test 9: NOT propertyIsLike AND NOT INTERSECT AND NOT (propertyIsEquals OR BBOX) AND (propertyIsNotEquals OR (Beyond AND propertyIsLike)) */ XMLrequest = "<ogc:Filter xmlns:ogc=\"http://www.opengis.net/ogc\" " + " xmlns:gml=\"http://www.opengis.net/gml\"" + " xmlns:apiso=\"http://www.opengis.net/cat/csw/apiso/1.0\"> " + " <ogc:And> " + " <ogc:Not> " + " <ogc:PropertyIsLike escapeChar=\"\\\" singleChar=\"?\" wildCard=\"*\"> " + " <ogc:PropertyName>apiso:Title</ogc:PropertyName> " + " <ogc:Literal>*VM*</ogc:Literal> " + " </ogc:PropertyIsLike> " + " </ogc:Not> " + " <ogc:Not> " + " <ogc:Intersects> " + " <ogc:PropertyName>apiso:BoundingBox</ogc:PropertyName> " + " <gml:Envelope srsName=\"EPSG:4326\"> " + " <gml:lowerCorner>-2 -4</gml:lowerCorner> " + " <gml:upperCorner>12 12</gml:upperCorner> " + " </gml:Envelope> " + " </ogc:Intersects> " + " </ogc:Not> " + " <ogc:Not> " + " <ogc:Or> " + " <ogc:PropertyIsEqualTo> " + " <ogc:PropertyName>apiso:Title</ogc:PropertyName> " + " <ogc:Literal>PLOUF</ogc:Literal> " + " </ogc:PropertyIsEqualTo> " + " <ogc:BBOX> " + " <ogc:PropertyName>apiso:BoundingBox</ogc:PropertyName> " + " <gml:Envelope srsName=\"EPSG:4326\"> " + " <gml:lowerCorner>-20 -20</gml:lowerCorner> " + " <gml:upperCorner>20 20</gml:upperCorner> " + " </gml:Envelope> " + " </ogc:BBOX> " + " </ogc:Or> " + " </ogc:Not> " + " <ogc:Or> " + " <ogc:PropertyIsNotEqualTo> " + " <ogc:PropertyName>apiso:Title</ogc:PropertyName> " + " <ogc:Literal>VMAI</ogc:Literal> " + " </ogc:PropertyIsNotEqualTo> " + " <ogc:And> " + " <ogc:PropertyIsLike escapeChar=\"\\\" singleChar=\"?\" wildCard=\"*\">" + " <ogc:PropertyName>apiso:Title</ogc:PropertyName> " + " <ogc:Literal>LO?Li</ogc:Literal> " + " </ogc:PropertyIsLike> " + " <ogc:DWithin> " + " <ogc:PropertyName>apiso:BoundingBox</ogc:PropertyName> " + " <gml:Point srsName=\"EPSG:4326\"> " + " <gml:coordinates>3.4,2.5</gml:coordinates> " + " </gml:Point> " + " <ogc:Distance units='m'>1000</ogc:Distance> " + " </ogc:DWithin> " + " </ogc:And> " + " </ogc:Or> " + " </ogc:And> " + "</ogc:Filter>"; reader = new StringReader(XMLrequest); element = (JAXBElement) filterUnmarshaller.unmarshal(reader); filter = (FilterType) element.getValue(); assertTrue(filter.getComparisonOps() == null); assertTrue(filter.getLogicOps() != null); assertTrue(filter.getId().isEmpty() ); assertTrue(filter.getSpatialOps() == null); spaQuery = (SpatialQuery) filterParser.getQuery(new QueryConstraintType(filter, "1.1.0"), null, null, null); assertTrue(spaQuery.getSpatialFilter() != null); assertEquals(spaQuery.getQuery(), "(metafile:doc)"); assertEquals(spaQuery.getSubQueries().size(), 3); assertEquals(spaQuery.getLogicalOperator(), SerialChainFilter.AND); assertTrue(spaQuery.getSpatialFilter() instanceof SerialChainFilter); chainFilter = (SerialChainFilter) spaQuery.getSpatialFilter(); assertEquals(chainFilter.getActionType().length, 1); assertEquals(chainFilter.getActionType()[0], SerialChainFilter.NOT); assertEquals(chainFilter.getChain().size(), 1); f1 = (LuceneOGCFilter) chainFilter.getChain().get(0); assertTrue (f1.getOGCFilter() instanceof Intersects); // first sub-query subQuery1 = spaQuery.getSubQueries().get(0); assertTrue (subQuery1.getSpatialFilter() == null); assertEquals(subQuery1.getQuery(), "Title:(*VM*)"); assertEquals(subQuery1.getSubQueries().size(), 0); assertEquals(subQuery1.getLogicalOperator(), SerialChainFilter.NOT); // second sub-query subQuery2 = spaQuery.getSubQueries().get(1); assertTrue (subQuery2.getSpatialFilter() == null); assertEquals(subQuery2.getQuery(), "metafile:doc"); assertEquals(subQuery2.getSubQueries().size(), 1); assertEquals(subQuery2.getLogicalOperator(), SerialChainFilter.AND); // second subQuery => first subQuery subQuery2_1 = subQuery2.getSubQueries().get(0); assertTrue (subQuery2_1.getSpatialFilter() != null); assertEquals(subQuery2_1.getQuery(), "(Title:\"PLOUF\")"); assertEquals(subQuery2_1.getSubQueries().size(), 0); assertEquals(subQuery2_1.getLogicalOperator(), SerialChainFilter.OR); assertTrue(subQuery2_1.getSpatialFilter() instanceof LuceneOGCFilter); spaFilter = (LuceneOGCFilter) subQuery2_1.getSpatialFilter(); assertTrue (spaFilter.getOGCFilter() instanceof BBOX); // third sub-query SpatialQuery subQuery3 = spaQuery.getSubQueries().get(2); assertTrue (subQuery3.getSpatialFilter() == null); assertEquals(subQuery3.getQuery(), "(metafile:doc NOT Title:\"VMAI\")"); assertEquals(subQuery3.getSubQueries().size(), 1); assertEquals(subQuery3.getLogicalOperator(), SerialChainFilter.OR); SpatialQuery subQuery3_1 = subQuery3.getSubQueries().get(0); assertTrue (subQuery3_1.getSpatialFilter() != null); assertEquals(subQuery3_1.getQuery(), "(Title:(LO?Li))"); assertEquals(subQuery3_1.getSubQueries().size(), 0); assertEquals(subQuery3_1.getLogicalOperator(), SerialChainFilter.AND); assertTrue(subQuery3_1.getSpatialFilter() instanceof LuceneOGCFilter); spaFilter = (LuceneOGCFilter) subQuery3_1.getSpatialFilter(); assertTrue (spaFilter.getOGCFilter() instanceof DWithin); pool.recycle(filterUnmarshaller); } }