From d9efdc3a3158e66747bcbd8257e251e1a4411bd6 Mon Sep 17 00:00:00 2001 From: Robert von Burg Date: Wed, 6 Aug 2014 16:29:37 +0200 Subject: [PATCH] [New] Added transformation to domain specific object when querying Now StrolchTransaction.doQuery() returns the result of the transformation done by the StrolchElementVisitor which is configured on the ResourceQuery or OrderQuery --- .../persistence/api/AbstractTransaction.java | 6 ++-- .../li/strolch/persistence/api/OrderDao.java | 2 +- .../strolch/persistence/api/ResourceDao.java | 2 +- .../persistence/api/StrolchTransaction.java | 4 +-- .../inmemory/InMemoryOrderDao.java | 4 +-- .../inmemory/InMemoryResourceDao.java | 4 +-- .../inmemory/InMemoryOrderQueryVisitor.java | 9 ++++-- .../runtime/query/inmemory/InMemoryQuery.java | 32 +++++++++++++++---- .../InMemoryResourceQueryVisitor.java | 11 ++++--- .../query/inmemory/InMemoryQueryTest.java | 28 ++++++++-------- .../runtime/query/inmemory/QueryTest.java | 23 +++++++------ 11 files changed, 73 insertions(+), 52 deletions(-) diff --git a/src/main/java/li/strolch/persistence/api/AbstractTransaction.java b/src/main/java/li/strolch/persistence/api/AbstractTransaction.java index 92e57aff5..5d7a9c4dd 100644 --- a/src/main/java/li/strolch/persistence/api/AbstractTransaction.java +++ b/src/main/java/li/strolch/persistence/api/AbstractTransaction.java @@ -28,9 +28,7 @@ import li.strolch.agent.api.StrolchRealm; import li.strolch.exception.StrolchException; import li.strolch.model.GroupedParameterizedElement; import li.strolch.model.Locator; -import li.strolch.model.Order; import li.strolch.model.ParameterBag; -import li.strolch.model.Resource; import li.strolch.model.StrolchElement; import li.strolch.model.StrolchRootElement; import li.strolch.model.Tags; @@ -166,12 +164,12 @@ public abstract class AbstractTransaction implements StrolchTransaction { } @Override - public List doQuery(OrderQuery query) { + public List doQuery(OrderQuery query) { return getPersistenceHandler().getOrderDao(this).doQuery(query); } @Override - public List doQuery(ResourceQuery query) { + public List doQuery(ResourceQuery query) { return getPersistenceHandler().getResourceDao(this).doQuery(query); } diff --git a/src/main/java/li/strolch/persistence/api/OrderDao.java b/src/main/java/li/strolch/persistence/api/OrderDao.java index d49a88de5..8090d7afa 100644 --- a/src/main/java/li/strolch/persistence/api/OrderDao.java +++ b/src/main/java/li/strolch/persistence/api/OrderDao.java @@ -25,5 +25,5 @@ import li.strolch.model.query.OrderQuery; */ public interface OrderDao extends StrolchDao { - public List doQuery(OrderQuery query); + public List doQuery(OrderQuery query); } diff --git a/src/main/java/li/strolch/persistence/api/ResourceDao.java b/src/main/java/li/strolch/persistence/api/ResourceDao.java index dfae5eed8..eccc7fd64 100644 --- a/src/main/java/li/strolch/persistence/api/ResourceDao.java +++ b/src/main/java/li/strolch/persistence/api/ResourceDao.java @@ -25,5 +25,5 @@ import li.strolch.model.query.ResourceQuery; */ public interface ResourceDao extends StrolchDao { - public List doQuery(ResourceQuery query); + public List doQuery(ResourceQuery query); } diff --git a/src/main/java/li/strolch/persistence/api/StrolchTransaction.java b/src/main/java/li/strolch/persistence/api/StrolchTransaction.java index c9feb8c67..43aa8c112 100644 --- a/src/main/java/li/strolch/persistence/api/StrolchTransaction.java +++ b/src/main/java/li/strolch/persistence/api/StrolchTransaction.java @@ -64,9 +64,9 @@ public interface StrolchTransaction extends AutoCloseable { public void addCommand(Command command); - public List doQuery(OrderQuery query); + public List doQuery(OrderQuery query); - public List doQuery(ResourceQuery query); + public List doQuery(ResourceQuery query); /** *

diff --git a/src/main/java/li/strolch/persistence/inmemory/InMemoryOrderDao.java b/src/main/java/li/strolch/persistence/inmemory/InMemoryOrderDao.java index 19b4585a6..497074ae8 100644 --- a/src/main/java/li/strolch/persistence/inmemory/InMemoryOrderDao.java +++ b/src/main/java/li/strolch/persistence/inmemory/InMemoryOrderDao.java @@ -11,9 +11,9 @@ import li.strolch.runtime.query.inmemory.InMemoryQuery; public class InMemoryOrderDao extends InMemoryDao implements OrderDao { @Override - public List doQuery(OrderQuery orderQuery) { + public List doQuery(OrderQuery orderQuery) { InMemoryOrderQueryVisitor visitor = new InMemoryOrderQueryVisitor(); - InMemoryQuery query = visitor.visit(orderQuery); + InMemoryQuery query = visitor.visit(orderQuery); return query.doQuery(this); } } diff --git a/src/main/java/li/strolch/persistence/inmemory/InMemoryResourceDao.java b/src/main/java/li/strolch/persistence/inmemory/InMemoryResourceDao.java index cf7f4261a..649af259d 100644 --- a/src/main/java/li/strolch/persistence/inmemory/InMemoryResourceDao.java +++ b/src/main/java/li/strolch/persistence/inmemory/InMemoryResourceDao.java @@ -11,9 +11,9 @@ import li.strolch.runtime.query.inmemory.InMemoryResourceQueryVisitor; public class InMemoryResourceDao extends InMemoryDao implements ResourceDao { @Override - public List doQuery(ResourceQuery resourceQuery) { + public List doQuery(ResourceQuery resourceQuery) { InMemoryResourceQueryVisitor visitor = new InMemoryResourceQueryVisitor(); - InMemoryQuery query = visitor.visit(resourceQuery); + InMemoryQuery query = visitor.visit(resourceQuery); return query.doQuery(this); } } diff --git a/src/main/java/li/strolch/runtime/query/inmemory/InMemoryOrderQueryVisitor.java b/src/main/java/li/strolch/runtime/query/inmemory/InMemoryOrderQueryVisitor.java index 271811218..cecaf216f 100644 --- a/src/main/java/li/strolch/runtime/query/inmemory/InMemoryOrderQueryVisitor.java +++ b/src/main/java/li/strolch/runtime/query/inmemory/InMemoryOrderQueryVisitor.java @@ -16,6 +16,7 @@ package li.strolch.runtime.query.inmemory; import li.strolch.model.Order; +import li.strolch.model.OrderVisitor; import li.strolch.model.query.DateSelection; import li.strolch.model.query.OrderQuery; import li.strolch.model.query.OrderQueryVisitor; @@ -38,7 +39,8 @@ public class InMemoryOrderQueryVisitor extends InMemoryQueryVisitor visit(OrderQuery orderQuery) { + public InMemoryQuery visit(OrderQuery orderQuery) { + DBC.PRE.assertNotNull("OrderVisitor may not be null!", orderQuery.getElementVisitor()); orderQuery.accept(this); if (this.navigator == null) { @@ -46,11 +48,12 @@ public class InMemoryOrderQueryVisitor extends InMemoryQueryVisitor elementVisitor = orderQuery.getElementVisitor(); if (this.selectors.isEmpty()) - return new InMemoryQuery<>(this.navigator, null); + return new InMemoryQuery<>(this.navigator, null, elementVisitor); DBC.PRE.assertTrue("Invalid query as it may only contain one selector!", this.selectors.size() == 1); //$NON-NLS-1$ - return new InMemoryQuery<>(this.navigator, this.selectors.get(0)); + return new InMemoryQuery<>(this.navigator, this.selectors.get(0), elementVisitor); } @Override diff --git a/src/main/java/li/strolch/runtime/query/inmemory/InMemoryQuery.java b/src/main/java/li/strolch/runtime/query/inmemory/InMemoryQuery.java index 5a61baa16..c7894d503 100644 --- a/src/main/java/li/strolch/runtime/query/inmemory/InMemoryQuery.java +++ b/src/main/java/li/strolch/runtime/query/inmemory/InMemoryQuery.java @@ -15,28 +15,33 @@ */ package li.strolch.runtime.query.inmemory; +import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; import li.strolch.model.StrolchElement; +import li.strolch.model.visitor.StrolchElementVisitor; import li.strolch.persistence.api.StrolchDao; +import ch.eitchnet.utils.dbc.DBC; /** * @author Robert von Burg */ -public class InMemoryQuery { +public class InMemoryQuery { private Navigator navigator; private Selector selector; + private StrolchElementVisitor elementVisitor; public InMemoryQuery() { // empty constructor } - public InMemoryQuery(Navigator navigator, Selector selector) { + public InMemoryQuery(Navigator navigator, Selector selector, StrolchElementVisitor elementVisitor) { this.navigator = navigator; this.selector = selector; + this.elementVisitor = elementVisitor; } /** @@ -47,24 +52,39 @@ public class InMemoryQuery { this.navigator = navigator; } + /** + * @param selector + * the selector to set + */ public void setSelector(Selector selector) { this.selector = selector; } - public List doQuery(StrolchDao dao) { + /** + * @param elementVisitor + * the elementVisitor to set + */ + public void setElementVisitor(StrolchElementVisitor elementVisitor) { + this.elementVisitor = elementVisitor; + } + + public List doQuery(StrolchDao dao) { if (this.selector == null) return Collections.emptyList(); + List result = new ArrayList(); List elements = this.navigator.navigate(dao); Iterator iter = elements.iterator(); while (iter.hasNext()) { T element = iter.next(); - if (!this.selector.select(element)) { - iter.remove(); + if (this.selector.select(element)) { + U returnValue = this.elementVisitor.visit(element); + DBC.INTERIM.assertNotNull("Visitor may not return null in query!", returnValue); + result.add(returnValue); } } - return elements; + return result; } } diff --git a/src/main/java/li/strolch/runtime/query/inmemory/InMemoryResourceQueryVisitor.java b/src/main/java/li/strolch/runtime/query/inmemory/InMemoryResourceQueryVisitor.java index 5197e4ba3..c673bcb27 100644 --- a/src/main/java/li/strolch/runtime/query/inmemory/InMemoryResourceQueryVisitor.java +++ b/src/main/java/li/strolch/runtime/query/inmemory/InMemoryResourceQueryVisitor.java @@ -17,6 +17,7 @@ package li.strolch.runtime.query.inmemory; import ch.eitchnet.utils.dbc.DBC; import li.strolch.model.Resource; +import li.strolch.model.ResourceVisitor; import li.strolch.model.query.ResourceQuery; import li.strolch.model.query.ResourceQueryVisitor; import li.strolch.model.query.StrolchTypeNavigation; @@ -37,7 +38,8 @@ public class InMemoryResourceQueryVisitor extends InMemoryQueryVisitor visit(ResourceQuery resourceQuery) { + public InMemoryQuery visit(ResourceQuery resourceQuery) { + DBC.PRE.assertNotNull("ResourceVisitor may not be null!", resourceQuery.getElementVisitor()); resourceQuery.accept(this); if (this.navigator == null) { @@ -45,11 +47,12 @@ public class InMemoryResourceQueryVisitor extends InMemoryQueryVisitor elementVisitor = resourceQuery.getElementVisitor(); if (this.selectors.isEmpty()) - return new InMemoryQuery<>(this.navigator, null); + return new InMemoryQuery<>(this.navigator, null, elementVisitor); - DBC.PRE.assertTrue("Invalid query as it may only contain one selector!", this.selectors.size() == 1); //$NON-NLS-1$ - return new InMemoryQuery<>(this.navigator, this.selectors.get(0)); + DBC.INTERIM.assertTrue("Invalid query as it may only contain one selector!", this.selectors.size() == 1); //$NON-NLS-1$ + return new InMemoryQuery<>(this.navigator, this.selectors.get(0), elementVisitor); } @Override diff --git a/src/test/java/li/strolch/runtime/query/inmemory/InMemoryQueryTest.java b/src/test/java/li/strolch/runtime/query/inmemory/InMemoryQueryTest.java index 671ffd2b1..af35a89e6 100644 --- a/src/test/java/li/strolch/runtime/query/inmemory/InMemoryQueryTest.java +++ b/src/test/java/li/strolch/runtime/query/inmemory/InMemoryQueryTest.java @@ -29,17 +29,9 @@ import li.strolch.model.State; import li.strolch.model.parameter.BooleanParameter; import li.strolch.model.parameter.FloatParameter; import li.strolch.model.parameter.StringParameter; +import li.strolch.model.visitor.NoStrategyVisitor; import li.strolch.persistence.inmemory.InMemoryOrderDao; import li.strolch.persistence.inmemory.InMemoryResourceDao; -import li.strolch.runtime.query.inmemory.AndSelector; -import li.strolch.runtime.query.inmemory.AnyNavigator; -import li.strolch.runtime.query.inmemory.BooleanSelector; -import li.strolch.runtime.query.inmemory.IdSelector; -import li.strolch.runtime.query.inmemory.InMemoryQuery; -import li.strolch.runtime.query.inmemory.NameSelector; -import li.strolch.runtime.query.inmemory.OrSelector; -import li.strolch.runtime.query.inmemory.ParameterSelector; -import li.strolch.runtime.query.inmemory.Selector; import org.junit.Test; @@ -56,9 +48,10 @@ public class InMemoryQueryTest { InMemoryOrderDao dao = new InMemoryOrderDao(); dao.saveAll(orders); - InMemoryQuery orderQuery = new InMemoryQuery<>(); + InMemoryQuery orderQuery = new InMemoryQuery<>(); orderQuery.setNavigator(new AnyNavigator()); orderQuery.setSelector(new IdSelector("@1")); + orderQuery.setElementVisitor(new NoStrategyVisitor()); List result = orderQuery.doQuery(dao); assertEquals(1, result.size()); @@ -72,9 +65,10 @@ public class InMemoryQueryTest { InMemoryResourceDao dao = new InMemoryResourceDao(); dao.saveAll(resources); - InMemoryQuery resourceQuery = new InMemoryQuery<>(); + InMemoryQuery resourceQuery = new InMemoryQuery<>(); resourceQuery.setNavigator(new AnyNavigator()); resourceQuery.setSelector(new IdSelector("@1")); + resourceQuery.setElementVisitor(new NoStrategyVisitor()); List result = resourceQuery.doQuery(dao); assertEquals(1, result.size()); @@ -88,8 +82,9 @@ public class InMemoryQueryTest { InMemoryResourceDao dao = new InMemoryResourceDao(); dao.saveAll(resources); - InMemoryQuery resourceQuery = new InMemoryQuery<>(); + InMemoryQuery resourceQuery = new InMemoryQuery<>(); resourceQuery.setNavigator(new AnyNavigator()); + resourceQuery.setElementVisitor(new NoStrategyVisitor()); BooleanSelector andSelector = new OrSelector<>(new IdSelector("@3"), new IdSelector("@4")); resourceQuery.setSelector(andSelector); @@ -107,8 +102,9 @@ public class InMemoryQueryTest { InMemoryResourceDao dao = new InMemoryResourceDao(); dao.saveAll(resources); - InMemoryQuery resourceQuery = new InMemoryQuery<>(); + InMemoryQuery resourceQuery = new InMemoryQuery<>(); resourceQuery.setNavigator(new AnyNavigator()); + resourceQuery.setElementVisitor(new NoStrategyVisitor()); List> andSelectors = new ArrayList<>(); andSelectors.add(new IdSelector("@3")); andSelectors.add(new NameSelector("Res 3")); @@ -127,8 +123,9 @@ public class InMemoryQueryTest { InMemoryResourceDao dao = new InMemoryResourceDao(); dao.saveAll(resources); - InMemoryQuery resourceQuery = new InMemoryQuery<>(); + InMemoryQuery resourceQuery = new InMemoryQuery<>(); resourceQuery.setNavigator(new AnyNavigator()); + resourceQuery.setElementVisitor(new NoStrategyVisitor()); List> andSelectors = new ArrayList<>(); andSelectors.add(new IdSelector("@3")); andSelectors.add(new NameSelector("Res 4")); @@ -147,8 +144,9 @@ public class InMemoryQueryTest { InMemoryResourceDao dao = new InMemoryResourceDao(); dao.saveAll(resources); - InMemoryQuery ballQuery = new InMemoryQuery<>(); + InMemoryQuery ballQuery = new InMemoryQuery<>(); ballQuery.setNavigator(new AnyNavigator()); + ballQuery.setElementVisitor(new NoStrategyVisitor()); AndSelector andSelector = new AndSelector<>(); andSelector.with(ParameterSelector. stringSelector("parameters", "color", "red")); andSelector.with(ParameterSelector. booleanSelector("parameters", "forChildren", true)); diff --git a/src/test/java/li/strolch/runtime/query/inmemory/QueryTest.java b/src/test/java/li/strolch/runtime/query/inmemory/QueryTest.java index f4e3b4de7..bf743aaae 100644 --- a/src/test/java/li/strolch/runtime/query/inmemory/QueryTest.java +++ b/src/test/java/li/strolch/runtime/query/inmemory/QueryTest.java @@ -35,7 +35,6 @@ import li.strolch.model.query.OrderQuery; import li.strolch.model.query.ParameterSelection; import li.strolch.model.query.ResourceQuery; import li.strolch.model.query.Selection; -import li.strolch.model.query.StrolchTypeNavigation; import li.strolch.persistence.api.StrolchTransaction; import li.strolch.runtime.StrolchConstants; @@ -64,14 +63,14 @@ public class QueryTest { tx.getResourceMap().add(tx, res1); } - ResourceQuery query = new ResourceQuery(new StrolchTypeNavigation("MyType")); + ResourceQuery query = ResourceQuery.resourceQuery("MyType"); List elementAndSelections = new ArrayList<>(); elementAndSelections.add(new IdSelection("@1")); elementAndSelections.add(ParameterSelection.integerSelection(BAG_ID, "nbOfBooks", 33)); query.and().with(elementAndSelections); InMemoryResourceQueryVisitor resourceQuery = new InMemoryResourceQueryVisitor(); - InMemoryQuery inMemoryQuery = resourceQuery.visit(query); + InMemoryQuery inMemoryQuery = resourceQuery.visit(query); List result; try (StrolchTransaction tx = container.getRealm(StrolchConstants.DEFAULT_REALM).openTx()) { result = inMemoryQuery.doQuery(tx.getPersistenceHandler().getResourceDao(tx)); @@ -94,14 +93,14 @@ public class QueryTest { tx.getOrderMap().add(tx, o1); } - OrderQuery query = new OrderQuery(new StrolchTypeNavigation("MyType")); + OrderQuery query = OrderQuery.orderQuery("MyType"); List elementAndSelections = new ArrayList<>(); elementAndSelections.add(new IdSelection("@1")); elementAndSelections.add(ParameterSelection.integerSelection(BAG_ID, "nbOfBooks", 33)); query.and().with(elementAndSelections); InMemoryOrderQueryVisitor orderQuery = new InMemoryOrderQueryVisitor(); - InMemoryQuery inMemoryQuery = orderQuery.visit(query); + InMemoryQuery inMemoryQuery = orderQuery.visit(query); List result; try (StrolchTransaction tx = container.getRealm(StrolchConstants.DEFAULT_REALM).openTx()) { result = inMemoryQuery.doQuery(tx.getPersistenceHandler().getOrderDao(tx)); @@ -122,7 +121,7 @@ public class QueryTest { tx.getResourceMap().add(tx, res1); } - ResourceQuery query = new ResourceQuery(new StrolchTypeNavigation("MyType")); + ResourceQuery query = ResourceQuery.resourceQuery("MyType"); query.and().with(ParameterSelection.stringSelection(BAG_ID, PARAM_STRING_ID, "olch").contains(true)); List result; try (StrolchTransaction tx = container.getRealm(StrolchConstants.DEFAULT_REALM).openTx()) { @@ -144,7 +143,7 @@ public class QueryTest { tx.getResourceMap().add(tx, res1); } - ResourceQuery query = new ResourceQuery(new StrolchTypeNavigation("MyType")); + ResourceQuery query = ResourceQuery.resourceQuery("MyType"); query.and().with(ParameterSelection.stringSelection(BAG_ID, PARAM_STRING_ID, "str").contains(true)); List result; try (StrolchTransaction tx = container.getRealm(StrolchConstants.DEFAULT_REALM).openTx()) { @@ -165,7 +164,7 @@ public class QueryTest { tx.getResourceMap().add(tx, res1); } - ResourceQuery query = new ResourceQuery(new StrolchTypeNavigation("MyType")); + ResourceQuery query = ResourceQuery.resourceQuery("MyType"); query.and().with(ParameterSelection.stringSelection(BAG_ID, PARAM_STRING_ID, "strolch").caseInsensitive(true)); List result; try (StrolchTransaction tx = container.getRealm(StrolchConstants.DEFAULT_REALM).openTx()) { @@ -187,7 +186,7 @@ public class QueryTest { tx.getResourceMap().add(tx, res1); } - ResourceQuery query = new ResourceQuery(new StrolchTypeNavigation("MyType")); + ResourceQuery query = ResourceQuery.resourceQuery("MyType"); query.and().with(ParameterSelection.stringSelection(BAG_ID, PARAM_STRING_ID, "strolch")); List result; try (StrolchTransaction tx = container.getRealm(StrolchConstants.DEFAULT_REALM).openTx()) { @@ -211,7 +210,7 @@ public class QueryTest { } { - ResourceQuery query = new ResourceQuery(new StrolchTypeNavigation("MyType")); + ResourceQuery query = ResourceQuery.resourceQuery("MyType"); query.not(new IdSelection("@1")); List result; try (StrolchTransaction tx = container.getRealm(StrolchConstants.DEFAULT_REALM).openTx()) { @@ -222,7 +221,7 @@ public class QueryTest { } { - ResourceQuery query = new ResourceQuery(new StrolchTypeNavigation("MyType")); + ResourceQuery query = ResourceQuery.resourceQuery("MyType"); query.not(new IdSelection("@2")); List result; try (StrolchTransaction tx = container.getRealm(StrolchConstants.DEFAULT_REALM).openTx()) { @@ -233,7 +232,7 @@ public class QueryTest { } { - ResourceQuery query = new ResourceQuery(new StrolchTypeNavigation("MyType")); + ResourceQuery query = ResourceQuery.resourceQuery("MyType"); query.not(new IdSelection("@1", "@2")); List result; try (StrolchTransaction tx = container.getRealm(StrolchConstants.DEFAULT_REALM).openTx()) {