/* * Copyright (C) 2007 - 2016 GeoSolutions S.A.S. * http://www.geo-solutions.it * * GPLv3 + Classpath exception * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package it.geosolutions.geostore.services; import java.io.StringReader; import java.util.ArrayList; import java.util.Date; import java.util.List; import javax.xml.bind.JAXB; import it.geosolutions.geostore.core.model.Attribute; import it.geosolutions.geostore.core.model.Category; import it.geosolutions.geostore.core.model.Resource; import it.geosolutions.geostore.core.model.enums.DataType; import it.geosolutions.geostore.services.dto.ShortAttribute; import it.geosolutions.geostore.services.dto.ShortResource; import it.geosolutions.geostore.services.dto.search.AndFilter; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; /** * Class SearchConverterTest. * * @author Tobia di Pisa (tobia.dipisa at geo-solutions.it) * */ public class SearchConverterTest extends ServiceTestBase { @BeforeClass public static void setUpClass() throws Exception { } @AfterClass public static void tearDownClass() throws Exception { } public SearchConverterTest() { } @Test public void testFilterConverter() throws Exception { // // Creating Resources and Attributes // Category category = new Category(); category.setName("MAP"); categoryService.insert(category); for (int i = 0; i < 10; i++) { Resource resource = new Resource(); resource.setName("resource" + i); resource.setDescription("resource description" + i); resource.setCategory(category); List<Attribute> attributes = new ArrayList<Attribute>(); Attribute attr1 = new Attribute(); attr1.setName("attr1"); attr1.setTextValue("value" + i); attr1.setType(DataType.STRING); attributes.add(attr1); Attribute attr2 = new Attribute(); attr2.setName("attr2"); attr2.setNumberValue(Double.valueOf(i)); attr2.setType(DataType.NUMBER); attributes.add(attr2); Attribute attr3 = new Attribute(); attr3.setName("attr3"); attr3.setDateValue(new Date()); attr3.setType(DataType.DATE); attributes.add(attr3); resource.setAttribute(attributes); long resourceId = resourceService.insert(resource); List<ShortAttribute> sAttributes = resourceService.getAttributes(resourceId); assertNotNull(sAttributes); assertEquals(3, sAttributes.size()); assertNotNull(resourceService.get(resourceId)); assertTrue(resourceService.getAttributes(resourceId).size() == 3); } // // Complex filter with AND // { String xmlFilter = "<AND>" + "<FIELD>" + "<field>NAME</field>" + "<operator>LIKE</operator>" + "<value>%resource%</value>" + "</FIELD>" + "<AND>" + "<ATTRIBUTE>" + "<name>attr1</name>" + "<operator>EQUAL_TO</operator>" + "<type>STRING</type>" + "<value>value2</value>" + "</ATTRIBUTE>" + "<ATTRIBUTE>" + "<name>attr2</name>" + "<operator>GREATER_THAN</operator>" + "<type>NUMBER</type>" + "<value>1.0</value>" + "</ATTRIBUTE>" + "</AND>" + "</AND>"; StringReader reader = new StringReader(xmlFilter); AndFilter searchFilter = JAXB.unmarshal(reader, AndFilter.class); assertNotNull(searchFilter); List<ShortResource> resources = resourceService.getResources(searchFilter, buildFakeAdminUser()); assertEquals(1, resources.size()); } // // Complex filter with AND OR // { String xmlFilter = "<AND>" + "<FIELD>" + "<field>NAME</field>" + "<operator>LIKE</operator>" + "<value>%resource%</value>" + "</FIELD>" + "<AND>" + "<ATTRIBUTE>" + "<name>attr2</name>" + "<operator>GREATER_THAN</operator>" + "<type>NUMBER</type>" + "<value>1.0</value>" + "</ATTRIBUTE>" + "<OR>" + "<ATTRIBUTE>" + "<name>attr1</name>" + "<operator>EQUAL_TO</operator>" + "<type>STRING</type>" + "<value>value2</value>" + "</ATTRIBUTE>" + "<ATTRIBUTE>" + "<name>attr1</name>" + "<operator>EQUAL_TO</operator>" + "<type>STRING</type>" + "<value>value3</value>" + "</ATTRIBUTE>" + "</OR>" + "</AND>" + "</AND>"; StringReader reader = new StringReader(xmlFilter); AndFilter searchFilter = JAXB.unmarshal(reader, AndFilter.class); assertNotNull(searchFilter); List<ShortResource> resources = resourceService.getResources(searchFilter, buildFakeAdminUser()); assertEquals(2, resources.size()); } } @Test public void testSearch() throws Exception { // // Creating Resources and Attributes // Category category = new Category(); category.setName("MAP"); categoryService.insert(category); for (int i = 0; i < 10; i++) { Resource resource = new Resource(); resource.setName("resource" + i); resource.setDescription("resource description" + i); resource.setCategory(category); resource.setMetadata("resource" + i); List<Attribute> attributes = new ArrayList<Attribute>(); Attribute attr1 = new Attribute(); attr1.setName("attr1"); attr1.setTextValue("value" + i); attr1.setType(DataType.STRING); attributes.add(attr1); Attribute attr2 = new Attribute(); attr2.setName("attr2"); attr2.setNumberValue(Double.valueOf(i)); attr2.setType(DataType.NUMBER); attributes.add(attr2); Attribute attr3 = new Attribute(); attr3.setName("attr3"); attr3.setDateValue(new Date()); attr3.setType(DataType.DATE); attributes.add(attr3); resource.setAttribute(attributes); long resourceId = resourceService.insert(resource); List<ShortAttribute> sAttributes = resourceService.getAttributes(resourceId); assertNotNull(sAttributes); assertTrue(sAttributes.size() == 3); assertNotNull(resourceService.get(resourceId)); assertTrue(resourceService.getAttributes(resourceId).size() == 3); long id = createData("data" + i, resourceService.get(resourceId)); assertNotNull(storedDataService.get(id)); } // // Search with paging, filter excluding Data // { String xmlFilter = "<AND>" + "<FIELD>" + "<field>METADATA</field>" + "<operator>LIKE</operator>" + "<value>%resource%</value>" + "</FIELD>" + "<ATTRIBUTE>" + "<name>attr1</name>" + "<operator>LIKE</operator>" + "<type>STRING</type>" + "<value>%value%</value>" + "</ATTRIBUTE>" + "</AND>"; StringReader reader = new StringReader(xmlFilter); AndFilter searchFilter = JAXB.unmarshal(reader, AndFilter.class); assertNotNull(searchFilter); List<Resource> resources = resourceService.getResources(searchFilter, 0, 5, true, false, buildFakeAdminUser()); assertEquals(5, resources.size()); Resource res = resources.get(0); assertNotNull(res.getAttribute()); assertTrue(res.getAttribute().size() == 3); assertNull(res.getData()); } // // Search with paging, filter excluding attributes // { String xmlFilter = "<AND>" + "<FIELD>" + "<field>METADATA</field>" + "<operator>LIKE</operator>" + "<value>%resource%</value>" + "</FIELD>" + "<ATTRIBUTE>" + "<name>attr1</name>" + "<operator>LIKE</operator>" + "<type>STRING</type>" + "<value>%value%</value>" + "</ATTRIBUTE>" + "</AND>"; StringReader reader = new StringReader(xmlFilter); AndFilter searchFilter = JAXB.unmarshal(reader, AndFilter.class); assertNotNull(searchFilter); List<Resource> resources = resourceService.getResources(searchFilter, 0, 5, false, true, buildFakeAdminUser()); assertEquals(5, resources.size()); Resource res = resources.get(0); assertNotNull(res.getData()); assertNull(res.getAttribute()); } // // Search with paging, filter // { String xmlFilter = "<AND>" + "<FIELD>" + "<field>METADATA</field>" + "<operator>LIKE</operator>" + "<value>%resource%</value>" + "</FIELD>" + "<ATTRIBUTE>" + "<name>attr1</name>" + "<operator>LIKE</operator>" + "<type>STRING</type>" + "<value>%value%</value>" + "</ATTRIBUTE>" + "</AND>"; StringReader reader = new StringReader(xmlFilter); AndFilter searchFilter = JAXB.unmarshal(reader, AndFilter.class); assertNotNull(searchFilter); List<Resource> resources = resourceService.getResources(searchFilter, 0, 5, true, true, buildFakeAdminUser()); assertEquals(5, resources.size()); Resource res = resources.get(0); assertNotNull(res.getData()); assertNotNull(res.getAttribute()); assertTrue(res.getAttribute().size() == 3); } } }