Author: jcouteau Date: 2011-04-06 14:57:32 +0200 (Wed, 06 Apr 2011) New Revision: 761 Url: http://nuiton.org/repositories/revision/wikitty/761 Log: Improve tests Add associated search on WikittySearchEngineInMemory Added: trunk/wikitty-api/src/test/java/org/nuiton/wikitty/api/AbstractSearchTest.java trunk/wikitty-api/src/test/java/org/nuiton/wikitty/api/InMemorySearchTest.java Removed: trunk/wikitty-api/src/test/java/org/nuiton/wikitty/api/AbstractTestApi.java Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/storage/WikittySearchEngineInMemory.java trunk/wikitty-api/src/test/java/org/nuiton/wikitty/api/CommonTest.java trunk/wikitty-api/src/test/java/org/nuiton/wikitty/api/ExtensionFactoryTest.java trunk/wikitty-api/src/test/java/org/nuiton/wikitty/api/SearchCriteriaTest.java trunk/wikitty-api/src/test/java/org/nuiton/wikitty/api/WikittyUtilTest.java trunk/wikitty-api/src/test/java/org/nuiton/wikitty/memory/InMemoryStorageTest.java Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/storage/WikittySearchEngineInMemory.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/storage/WikittySearchEngineInMemory.java 2011-04-06 12:49:06 UTC (rev 760) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/storage/WikittySearchEngineInMemory.java 2011-04-06 12:57:32 UTC (rev 761) @@ -37,6 +37,7 @@ import org.nuiton.wikitty.search.PagedResult; import org.nuiton.wikitty.search.TreeNodeResult; import org.nuiton.wikitty.search.operators.And; +import org.nuiton.wikitty.search.operators.AssociatedRestriction; import org.nuiton.wikitty.search.operators.BinaryOperator; import org.nuiton.wikitty.search.operators.Element; import org.nuiton.wikitty.search.operators.Restriction; @@ -67,7 +68,8 @@ // public void delete(Collection<String> idList) throws WikittyException { // } - public boolean checkRestriction(Restriction restriction, Wikitty w) { + public boolean checkRestriction(WikittyTransaction transaction, + Restriction restriction, Wikitty w) { if (restriction instanceof BinaryOperator) { BinaryOperator binOp = (BinaryOperator) restriction; if (binOp.getElement().getName().equals(Element.ELT_EXTENSION)) { @@ -138,11 +140,38 @@ } else if (restriction instanceof And) { And and = (And) restriction; for (Restriction sub : and.getRestrictions()) { - if (!checkRestriction(sub, w)) { + if (!checkRestriction(transaction, sub, w)) { return false; } } return true; + } else if (restriction instanceof AssociatedRestriction) { + + AssociatedRestriction ass = (AssociatedRestriction) restriction; + + String fqfieldName = ass.getElement().getName(); + + //check my wikitty got the right extension before doing anything. + String[] extName = fqfieldName.split("\\."); + if (!w.hasField(extName[0], extName[1])) { + return false; + } + // get the value in the wikitty, it is a wikitty's id + Object o = w.getFqField(fqfieldName); + + //Get sub-restriction + Restriction sub = ass.getRestriction(); + + Criteria associatedSearch = new Criteria(); + associatedSearch.setRestriction(sub); + + //find everything that validate the sub-restriction + PagedResult<String> associatedResult = findAllByCriteria(transaction, associatedSearch); + + List<String> associatedList = associatedResult.getAll(); + + //Check that my field is contained in the sub-restriction results. + return associatedList.contains(String.valueOf(o)); } else { throw new UnsupportedOperationException(restriction.getName() + " Search Not yet implemented"); } @@ -159,7 +188,7 @@ Wikitty w = entry.getValue(); String id = entry.getKey(); Restriction dto = criteria.getRestriction(); - if (!w.isDeleted() && checkRestriction(dto, w)) { + if (!w.isDeleted() && checkRestriction(transaction, dto, w)) { currentIndex++; if (currentIndex > firstIndex) { ids.add(id); Added: trunk/wikitty-api/src/test/java/org/nuiton/wikitty/api/AbstractSearchTest.java =================================================================== --- trunk/wikitty-api/src/test/java/org/nuiton/wikitty/api/AbstractSearchTest.java (rev 0) +++ trunk/wikitty-api/src/test/java/org/nuiton/wikitty/api/AbstractSearchTest.java 2011-04-06 12:57:32 UTC (rev 761) @@ -0,0 +1,129 @@ +package org.nuiton.wikitty.api; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.nuiton.wikitty.WikittyProxy; +import org.nuiton.wikitty.WikittyService; +import org.nuiton.wikitty.entities.ExtensionFactory; +import org.nuiton.wikitty.entities.FieldFactory; +import org.nuiton.wikitty.entities.FieldType; +import org.nuiton.wikitty.entities.Wikitty; +import org.nuiton.wikitty.entities.WikittyExtension; +import org.nuiton.wikitty.entities.WikittyImpl; +import org.nuiton.wikitty.search.Criteria; +import org.nuiton.wikitty.search.PagedResult; +import org.nuiton.wikitty.search.Search; + +/** + * User: couteau + * Date: 05/04/11 + */ +public abstract class AbstractSearchTest { + + public static final String EXT_PRODUCT = "Product"; + public static final String EXT_CATEGORY = "Category"; + public static final String PRODUCT_PRICE = "price"; + public static final String PRODUCT_NAME = "name"; + public static final String PRODUCT_CATEGORY = "category"; + public static final String CATEGORY_NAME = "name"; + public static final String VERSION = "1.0"; + + protected WikittyProxy proxy = new WikittyProxy(getWikittyService()); + + @Before + public void initData(){ + + /////////////////////////////////////////////////////////////////////// + // CREATE EXTENSIONS NEEDED FOR TESTS // + /////////////////////////////////////////////////////////////////////// + + //Create product extension + WikittyExtension product = ExtensionFactory.create(EXT_PRODUCT, VERSION) + .addField(PRODUCT_PRICE, FieldType.TYPE.NUMERIC) + .addField(PRODUCT_NAME, FieldType.TYPE.STRING) + .addField(PRODUCT_CATEGORY, FieldType.TYPE.WIKITTY) + .extension(); + proxy.storeExtension(product); + + //Create category extension + WikittyExtension category = ExtensionFactory.create(EXT_CATEGORY, VERSION) + .addField(CATEGORY_NAME, FieldType.TYPE.STRING) + .extension(); + proxy.storeExtension(category); + + /////////////////////////////////////////////////////////////////////// + // CREATE CATEGORIES // + /////////////////////////////////////////////////////////////////////// + + //Create wikitty category named "Hardware" + Wikitty category1 = new WikittyImpl(); + category1.addExtension(category); + category1.setField(EXT_CATEGORY, CATEGORY_NAME, "Hardware"); + proxy.store(category1); + + //Create wikitty category named "Wrong category" + Wikitty category2 = new WikittyImpl(); + category2.addExtension(category); + category2.setField(EXT_CATEGORY, CATEGORY_NAME, "Wrong category"); + proxy.store(category2); + + /////////////////////////////////////////////////////////////////////// + // CREATE PRODUCTS // + /////////////////////////////////////////////////////////////////////// + + //Create product named Paint, price is 20 category is category1 + Wikitty product1 = new WikittyImpl(); + product1.addExtension(product); + product1.setField(EXT_PRODUCT, PRODUCT_NAME, "Paint"); + product1.setField(EXT_PRODUCT, PRODUCT_PRICE, 20); + product1.setField(EXT_PRODUCT, PRODUCT_CATEGORY, category1.getId()); + proxy.store(product1); + + //Create product named Screwdriver, price is 3, category is category2 + Wikitty product2 = new WikittyImpl(); + product2.addExtension(product); + product2.setField(EXT_PRODUCT, PRODUCT_NAME, "Screwdriver"); + product2.setField(EXT_PRODUCT, PRODUCT_PRICE, 3); + product2.setField(EXT_PRODUCT, PRODUCT_CATEGORY, category2.getId()); + proxy.store(product2); + + //Create product named Paint Blue, price is 22, category is category2 + Wikitty product3 = new WikittyImpl(); + product3.addExtension(product); + product3.setField(EXT_PRODUCT, PRODUCT_NAME, "Paint Blue"); + product3.setField(EXT_PRODUCT, PRODUCT_PRICE, 22); + product3.setField(EXT_PRODUCT, PRODUCT_CATEGORY, category2.getId()); + proxy.store(product3); + + } + + @Test + public void testAssociated() throws Exception { + + /* Following request mean is : + * Looking for any product which price is between 15 and 25, + * and name starts with 'Paint', + * and with an associated category which name is 'Hardware' + */ + + Search query = Search.query().bw("Product.price", "15", "25") + .sw("Product.name", "Paint"); + + Search associatedSearch = query.associated("Product.category") + .eq("Category.name", "Hardware"); + + Criteria associatedCriteria = associatedSearch.criteria(); + + PagedResult<Wikitty> results = proxy.findAllByCriteria(associatedCriteria); + + Assert.assertEquals(1, results.getAll().size()); + + Wikitty resultW = results.getFirst(); + + Assert.assertEquals("Paint", resultW.getFieldAsString(EXT_PRODUCT, PRODUCT_NAME)); + Assert.assertEquals(20, resultW.getFieldAsInt(EXT_PRODUCT, PRODUCT_PRICE)); + } + + public abstract WikittyService getWikittyService(); +} Deleted: trunk/wikitty-api/src/test/java/org/nuiton/wikitty/api/AbstractTestApi.java =================================================================== --- trunk/wikitty-api/src/test/java/org/nuiton/wikitty/api/AbstractTestApi.java 2011-04-06 12:49:06 UTC (rev 760) +++ trunk/wikitty-api/src/test/java/org/nuiton/wikitty/api/AbstractTestApi.java 2011-04-06 12:57:32 UTC (rev 761) @@ -1,34 +0,0 @@ -/* - * #%L - * Wikitty :: api - * - * $Id$ - * $HeadURL$ - * %% - * Copyright (C) 2009 - 2010 CodeLutin, Benjamin Poussin - * %% - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser 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 Lesser Public License for more details. - * - * You should have received a copy of the GNU General Lesser Public - * License along with this program. If not, see - * <http://www.gnu.org/licenses/lgpl-3.0.html>. - * #L% - */ -package org.nuiton.wikitty.api; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -public abstract class AbstractTestApi { - - protected final static Log log = LogFactory.getLog(AbstractTestApi.class); - -} Modified: trunk/wikitty-api/src/test/java/org/nuiton/wikitty/api/CommonTest.java =================================================================== --- trunk/wikitty-api/src/test/java/org/nuiton/wikitty/api/CommonTest.java 2011-04-06 12:49:06 UTC (rev 760) +++ trunk/wikitty-api/src/test/java/org/nuiton/wikitty/api/CommonTest.java 2011-04-06 12:57:32 UTC (rev 761) @@ -55,7 +55,7 @@ * @author guillaumed * */ -public class CommonTest extends AbstractTestApi { +public class CommonTest { private static Log log = LogFactory.getLog(CommonTest.class); Modified: trunk/wikitty-api/src/test/java/org/nuiton/wikitty/api/ExtensionFactoryTest.java =================================================================== --- trunk/wikitty-api/src/test/java/org/nuiton/wikitty/api/ExtensionFactoryTest.java 2011-04-06 12:49:06 UTC (rev 760) +++ trunk/wikitty-api/src/test/java/org/nuiton/wikitty/api/ExtensionFactoryTest.java 2011-04-06 12:57:32 UTC (rev 761) @@ -31,7 +31,7 @@ import org.nuiton.wikitty.entities.FieldType.TYPE; import org.nuiton.wikitty.entities.WikittyExtension; -public class ExtensionFactoryTest extends AbstractTestApi { +public class ExtensionFactoryTest { @Test public void testExtensionFactory() throws Exception { Added: trunk/wikitty-api/src/test/java/org/nuiton/wikitty/api/InMemorySearchTest.java =================================================================== --- trunk/wikitty-api/src/test/java/org/nuiton/wikitty/api/InMemorySearchTest.java (rev 0) +++ trunk/wikitty-api/src/test/java/org/nuiton/wikitty/api/InMemorySearchTest.java 2011-04-06 12:57:32 UTC (rev 761) @@ -0,0 +1,25 @@ +package org.nuiton.wikitty.api; + +import org.nuiton.wikitty.WikittyConfig; +import org.nuiton.wikitty.WikittyService; +import org.nuiton.wikitty.services.WikittyServiceInMemory; + +/** + * User: couteau + * Date: 05/04/11 + */ +public class InMemorySearchTest extends AbstractSearchTest { + + WikittyService service; + + @Override + public WikittyService getWikittyService() { + + if (service == null) { + WikittyConfig config = new WikittyConfig(); + service = new WikittyServiceInMemory(config); + } + + return service; + } +} Modified: trunk/wikitty-api/src/test/java/org/nuiton/wikitty/api/SearchCriteriaTest.java =================================================================== --- trunk/wikitty-api/src/test/java/org/nuiton/wikitty/api/SearchCriteriaTest.java 2011-04-06 12:49:06 UTC (rev 760) +++ trunk/wikitty-api/src/test/java/org/nuiton/wikitty/api/SearchCriteriaTest.java 2011-04-06 12:57:32 UTC (rev 761) @@ -28,6 +28,11 @@ import org.apache.commons.logging.LogFactory; import org.junit.Assert; import org.junit.Test; +import org.nuiton.wikitty.WikittyUtil; +import org.nuiton.wikitty.entities.FieldType; +import org.nuiton.wikitty.entities.Wikitty; +import org.nuiton.wikitty.entities.WikittyExtension; +import org.nuiton.wikitty.entities.WikittyImpl; import org.nuiton.wikitty.search.Criteria; import org.nuiton.wikitty.search.operators.And; import org.nuiton.wikitty.search.operators.AssociatedRestriction; @@ -39,7 +44,7 @@ import org.nuiton.wikitty.search.operators.RestrictionName; import org.nuiton.wikitty.search.Search; -public class SearchCriteriaTest extends AbstractTestApi { +public class SearchCriteriaTest { static private Log log = LogFactory.getLog(SearchCriteriaTest.class); @@ -113,7 +118,8 @@ @Test public void testAssociated() throws Exception { - /* Following request mean is : + + /* Following request mean is : * Looking for any product which price is between 15 and 25, * and name starts with 'Paint', * and with an associated category which name is 'Hardware' Modified: trunk/wikitty-api/src/test/java/org/nuiton/wikitty/api/WikittyUtilTest.java =================================================================== --- trunk/wikitty-api/src/test/java/org/nuiton/wikitty/api/WikittyUtilTest.java 2011-04-06 12:49:06 UTC (rev 760) +++ trunk/wikitty-api/src/test/java/org/nuiton/wikitty/api/WikittyUtilTest.java 2011-04-06 12:57:32 UTC (rev 761) @@ -59,7 +59,7 @@ * * @author poussin */ -public class WikittyUtilTest extends AbstractTestApi { +public class WikittyUtilTest { static private Log log = LogFactory.getLog(WikittyUtilTest.class); Modified: trunk/wikitty-api/src/test/java/org/nuiton/wikitty/memory/InMemoryStorageTest.java =================================================================== --- trunk/wikitty-api/src/test/java/org/nuiton/wikitty/memory/InMemoryStorageTest.java 2011-04-06 12:49:06 UTC (rev 760) +++ trunk/wikitty-api/src/test/java/org/nuiton/wikitty/memory/InMemoryStorageTest.java 2011-04-06 12:57:32 UTC (rev 761) @@ -46,9 +46,8 @@ import org.nuiton.wikitty.services.WikittyServiceEnhanced; import org.nuiton.wikitty.services.WikittyServiceInMemory; import org.nuiton.wikitty.WikittyUtil; -import org.nuiton.wikitty.api.AbstractTestApi; -public class InMemoryStorageTest extends AbstractTestApi { +public class InMemoryStorageTest { protected WikittyServiceInMemory wikittyService;