[New] Added doQuery() methods to DAOs and hooked up InMemory querying

This commit is contained in:
Robert von Burg 2013-12-26 01:12:51 +01:00
parent 986492854b
commit a514ceec99
19 changed files with 111 additions and 112 deletions

View File

@ -1,9 +1,19 @@
package li.strolch.persistence.inmemory;
import java.util.List;
import li.strolch.model.Order;
import li.strolch.model.query.OrderQuery;
import li.strolch.persistence.api.OrderDao;
import li.strolch.runtime.query.inmemory.InMemoryOrderQueryVisitor;
import li.strolch.runtime.query.inmemory.InMemoryQuery;
public class InMemoryOrderDao extends InMemoryDao<Order> implements OrderDao {
// marker class
@Override
public List<Order> doQuery(OrderQuery orderQuery) {
InMemoryOrderQueryVisitor visitor = new InMemoryOrderQueryVisitor();
InMemoryQuery<Order> query = visitor.visit(orderQuery);
return query.doQuery(this);
}
}

View File

@ -1,9 +1,19 @@
package li.strolch.persistence.inmemory;
import java.util.List;
import li.strolch.model.Resource;
import li.strolch.model.query.ResourceQuery;
import li.strolch.persistence.api.ResourceDao;
import li.strolch.runtime.query.inmemory.InMemoryQuery;
import li.strolch.runtime.query.inmemory.InMemoryResourceQueryVisitor;
public class InMemoryResourceDao extends InMemoryDao<Resource> implements ResourceDao {
// marker class
@Override
public List<Resource> doQuery(ResourceQuery resourceQuery) {
InMemoryResourceQueryVisitor visitor = new InMemoryResourceQueryVisitor();
InMemoryQuery<Resource> query = visitor.visit(resourceQuery);
return query.doQuery(this);
}
}

View File

@ -15,10 +15,8 @@
*/
package li.strolch.runtime.agent.api;
/**
* @author Robert von Burg <eitch@eitchnet.ch>
*
*/
public interface ComponentContainer {

View File

@ -19,9 +19,8 @@ import li.strolch.model.Order;
/**
* @author Robert von Burg <eitch@eitchnet.ch>
*
*/
public interface OrderMap extends ElementMap<Order> {
//
// marker interface
}

View File

@ -19,9 +19,8 @@ import li.strolch.model.Resource;
/**
* @author Robert von Burg <eitch@eitchnet.ch>
*
*/
public interface ResourceMap extends ElementMap<Resource> {
//
// marker interface
}

View File

@ -4,6 +4,7 @@ import java.util.List;
import java.util.Set;
import li.strolch.model.StrolchElement;
import li.strolch.model.query.StrolchQuery;
import li.strolch.persistence.api.PersistenceHandler;
import li.strolch.persistence.api.StrolchDao;
import li.strolch.persistence.api.StrolchTransaction;
@ -11,10 +12,11 @@ import li.strolch.runtime.agent.api.ElementMap;
/**
* @author Robert von Burg <eitch@eitchnet.ch>
*
*
* @param <T>
*/
public abstract class TransactionalElementMap<T extends StrolchElement> implements ElementMap<T> {
public abstract class TransactionalElementMap<T extends StrolchElement, U extends StrolchQuery<?>> implements
ElementMap<T> {
private PersistenceHandler persistenceHandler;
private String realm;
@ -28,6 +30,10 @@ public abstract class TransactionalElementMap<T extends StrolchElement> implemen
return this.realm;
}
protected PersistenceHandler getPersistenceHandler() {
return this.persistenceHandler;
}
protected abstract StrolchDao<T> getDao(StrolchTransaction tx);
@Override

View File

@ -1,12 +1,13 @@
package li.strolch.runtime.agent.impl;
import li.strolch.model.Order;
import li.strolch.model.query.OrderQuery;
import li.strolch.persistence.api.OrderDao;
import li.strolch.persistence.api.PersistenceHandler;
import li.strolch.persistence.api.StrolchTransaction;
import li.strolch.runtime.agent.api.OrderMap;
public class TransactionalOrderMap extends TransactionalElementMap<Order> implements OrderMap {
public class TransactionalOrderMap extends TransactionalElementMap<Order, OrderQuery> implements OrderMap {
public TransactionalOrderMap(String realm, PersistenceHandler persistenceHandler) {
super(realm, persistenceHandler);

View File

@ -1,12 +1,13 @@
package li.strolch.runtime.agent.impl;
import li.strolch.model.Resource;
import li.strolch.model.query.ResourceQuery;
import li.strolch.persistence.api.PersistenceHandler;
import li.strolch.persistence.api.ResourceDao;
import li.strolch.persistence.api.StrolchTransaction;
import li.strolch.runtime.agent.api.ResourceMap;
public class TransactionalResourceMap extends TransactionalElementMap<Resource> implements ResourceMap {
public class TransactionalResourceMap extends TransactionalElementMap<Resource, ResourceQuery> implements ResourceMap {
public TransactionalResourceMap(String realm, PersistenceHandler persistenceHandler) {
super(realm, persistenceHandler);

View File

@ -18,21 +18,15 @@ package li.strolch.runtime.query.inmemory;
import java.util.List;
import li.strolch.model.StrolchElement;
import li.strolch.persistence.api.StrolchTransaction;
import li.strolch.persistence.api.StrolchDao;
/**
* @author Robert von Burg <eitch@eitchnet.ch>
*/
public class ListNavigator<T extends StrolchElement> implements Navigator<T> {
private List<T> input;
public ListNavigator(List<T> input) {
this.input = input;
}
public class AnyNavigator<T extends StrolchElement> implements Navigator<T> {
@Override
public List<T> navigate(StrolchTransaction tx) {
return this.input;
public List<T> navigate(StrolchDao<T> dao) {
return dao.queryAll();
}
}

View File

@ -21,20 +21,20 @@ import li.strolch.model.query.OrderQuery;
import li.strolch.model.query.OrderQueryVisitor;
import li.strolch.model.query.StateSelection;
import li.strolch.model.query.StrolchTypeNavigation;
import li.strolch.runtime.agent.api.ComponentContainer;
import li.strolch.persistence.api.OrderDao;
/**
* @author Robert von Burg <eitch@eitchnet.ch>
*/
public class InMemoryOrderQueryVisitor extends InMemoryQueryVisitor<Order> implements OrderQueryVisitor {
public class InMemoryOrderQueryVisitor extends InMemoryQueryVisitor<Order, OrderDao> implements OrderQueryVisitor {
public InMemoryOrderQueryVisitor(ComponentContainer container) {
super(container);
public InMemoryOrderQueryVisitor() {
super();
}
@Override
protected InMemoryQueryVisitor<Order> newInstance() {
return new InMemoryOrderQueryVisitor(this.container);
protected InMemoryQueryVisitor<Order, OrderDao> newInstance() {
return new InMemoryOrderQueryVisitor();
}
public InMemoryQuery<Order> visit(OrderQuery orderQuery) {
@ -50,7 +50,7 @@ public class InMemoryOrderQueryVisitor extends InMemoryQueryVisitor<Order> imple
@Override
public void visit(StrolchTypeNavigation navigation) {
this.navigator = new OrderTypeNavigator(navigation.getType(), this.container);
this.navigator = new OrderTypeNavigator(navigation.getType());
}
@Override

View File

@ -20,7 +20,7 @@ import java.util.Iterator;
import java.util.List;
import li.strolch.model.StrolchElement;
import li.strolch.persistence.api.StrolchTransaction;
import li.strolch.persistence.api.StrolchDao;
/**
* @author Robert von Burg <eitch@eitchnet.ch>
@ -51,9 +51,9 @@ public class InMemoryQuery<T extends StrolchElement> {
this.selectors.add(selector);
}
public List<T> doQuery(StrolchTransaction tx) {
public List<T> doQuery(StrolchDao<T> dao) {
List<T> elements = this.navigator.navigate(tx);
List<T> elements = this.navigator.navigate(dao);
Iterator<T> iter = elements.iterator();
while (iter.hasNext()) {
T element = iter.next();
@ -66,6 +66,7 @@ public class InMemoryQuery<T extends StrolchElement> {
}
private boolean isAccepted(T element) {
for (Selector<T> selector : this.selectors) {
if (!selector.select(element))
return false;

View File

@ -24,9 +24,6 @@ import li.strolch.model.query.BooleanSelection;
import li.strolch.model.query.IdSelection;
import li.strolch.model.query.NameSelection;
import li.strolch.model.query.OrSelection;
import li.strolch.model.query.ParameterSelectionVisitor;
import li.strolch.model.query.Selection;
import li.strolch.model.query.StrolchElementSelectionVisitor;
import li.strolch.model.query.ParameterSelection.BooleanParameterSelection;
import li.strolch.model.query.ParameterSelection.DateParameterSelection;
import li.strolch.model.query.ParameterSelection.FloatParameterSelection;
@ -34,20 +31,21 @@ import li.strolch.model.query.ParameterSelection.IntegerParameterSelection;
import li.strolch.model.query.ParameterSelection.LongParameterSelection;
import li.strolch.model.query.ParameterSelection.StringListParameterSelection;
import li.strolch.model.query.ParameterSelection.StringParameterSelection;
import li.strolch.runtime.agent.api.ComponentContainer;
import li.strolch.model.query.ParameterSelectionVisitor;
import li.strolch.model.query.Selection;
import li.strolch.model.query.StrolchElementSelectionVisitor;
import li.strolch.persistence.api.StrolchDao;
/**
* @author Robert von Burg <eitch@eitchnet.ch>
*/
public abstract class InMemoryQueryVisitor<T extends GroupedParameterizedElement> implements
public abstract class InMemoryQueryVisitor<T extends GroupedParameterizedElement, S extends StrolchDao<?>> implements
StrolchElementSelectionVisitor, ParameterSelectionVisitor {
protected ComponentContainer container;
protected Navigator<T> navigator;
protected List<Selector<T>> selectors;
public InMemoryQueryVisitor(ComponentContainer container) {
this.container = container;
public InMemoryQueryVisitor() {
this.selectors = new ArrayList<>();
}
@ -64,11 +62,11 @@ public abstract class InMemoryQueryVisitor<T extends GroupedParameterizedElement
*
* @return a new instance of this concrete type
*/
protected abstract InMemoryQueryVisitor<T> newInstance();
protected abstract InMemoryQueryVisitor<T, S> newInstance();
@Override
public <U extends Selection> void visitAnd(AndSelection<U> andSelection) {
InMemoryQueryVisitor<T> query = newInstance();
InMemoryQueryVisitor<T, S> query = newInstance();
List<U> selections = andSelection.getSelections();
for (U selection : selections) {
selection.accept(query);
@ -79,7 +77,7 @@ public abstract class InMemoryQueryVisitor<T extends GroupedParameterizedElement
@Override
public <U extends Selection> void visitOr(OrSelection<U> orSelection) {
InMemoryQueryVisitor<T> query = newInstance();
InMemoryQueryVisitor<T, S> query = newInstance();
List<U> selections = orSelection.getSelections();
for (U selection : selections) {
selection.accept(query);

View File

@ -15,34 +15,25 @@
*/
package li.strolch.runtime.query.inmemory;
import java.util.ArrayList;
import java.util.List;
import li.strolch.model.Resource;
import li.strolch.model.query.ResourceQuery;
import li.strolch.model.query.ResourceQueryVisitor;
import li.strolch.model.query.StrolchTypeNavigation;
import li.strolch.runtime.agent.api.ComponentContainer;
import li.strolch.persistence.api.ResourceDao;
/**
* @author Robert von Burg <eitch@eitchnet.ch>
*/
public class InMemoryResourceQueryVisitor extends InMemoryQueryVisitor<Resource> implements ResourceQueryVisitor {
public class InMemoryResourceQueryVisitor extends InMemoryQueryVisitor<Resource, ResourceDao> implements
ResourceQueryVisitor {
private ComponentContainer container;
private Navigator<Resource> navigator;
private List<Selector<Resource>> selectors;
public InMemoryResourceQueryVisitor(ComponentContainer container) {
super(container);
this.container = container;
this.selectors = new ArrayList<>();
public InMemoryResourceQueryVisitor() {
super();
}
@Override
protected InMemoryQueryVisitor<Resource> newInstance() {
return new InMemoryResourceQueryVisitor(this.container);
protected InMemoryQueryVisitor<Resource, ResourceDao> newInstance() {
return new InMemoryResourceQueryVisitor();
}
public InMemoryQuery<Resource> visit(ResourceQuery resourceQuery) {
@ -58,6 +49,6 @@ public class InMemoryResourceQueryVisitor extends InMemoryQueryVisitor<Resource>
@Override
public void visit(StrolchTypeNavigation navigation) {
this.navigator = new ResourceTypeNavigator(navigation.getType(), this.container);
this.navigator = new ResourceTypeNavigator(navigation.getType());
}
}

View File

@ -18,12 +18,12 @@ package li.strolch.runtime.query.inmemory;
import java.util.List;
import li.strolch.model.StrolchElement;
import li.strolch.persistence.api.StrolchTransaction;
import li.strolch.persistence.api.StrolchDao;
/**
* @author Robert von Burg <eitch@eitchnet.ch>
*/
public interface Navigator<T extends StrolchElement>{
public interface Navigator<T extends StrolchElement> {
public List<T> navigate(StrolchTransaction tx);
public List<T> navigate(StrolchDao<T> dao);
}

View File

@ -16,26 +16,16 @@
package li.strolch.runtime.query.inmemory;
import li.strolch.model.Order;
import li.strolch.runtime.agent.api.ComponentContainer;
import li.strolch.runtime.agent.api.ElementMap;
/**
* @author Robert von Burg <eitch@eitchnet.ch>
*/
public class OrderTypeNavigator extends StrolchTypeNavigator<Order> {
private ComponentContainer container;
/**
* @param type
*/
public OrderTypeNavigator(String type, ComponentContainer container) {
public OrderTypeNavigator(String type) {
super(type);
this.container = container;
}
@Override
protected ElementMap<Order> getElementMap() {
return this.container.getOrderMap();
}
}

View File

@ -16,26 +16,16 @@
package li.strolch.runtime.query.inmemory;
import li.strolch.model.Resource;
import li.strolch.runtime.agent.api.ComponentContainer;
import li.strolch.runtime.agent.api.ElementMap;
/**
* @author Robert von Burg <eitch@eitchnet.ch>
*/
public class ResourceTypeNavigator extends StrolchTypeNavigator<Resource> {
private ComponentContainer container;
/**
* @param type
*/
public ResourceTypeNavigator(String type, ComponentContainer container) {
public ResourceTypeNavigator(String type) {
super(type);
this.container = container;
}
@Override
protected ElementMap<Resource> getElementMap() {
return this.container.getResourceMap();
}
}

View File

@ -18,8 +18,7 @@ package li.strolch.runtime.query.inmemory;
import java.util.List;
import li.strolch.model.StrolchElement;
import li.strolch.persistence.api.StrolchTransaction;
import li.strolch.runtime.agent.api.ElementMap;
import li.strolch.persistence.api.StrolchDao;
/**
* @author Robert von Burg <eitch@eitchnet.ch>
@ -33,9 +32,7 @@ public abstract class StrolchTypeNavigator<T extends StrolchElement> implements
}
@Override
public List<T> navigate(StrolchTransaction tx) {
return getElementMap().getElementsBy(tx, this.type);
public List<T> navigate(StrolchDao<T> dao) {
return dao.queryAll(this.type);
}
protected abstract ElementMap<T> getElementMap();
}

View File

@ -29,11 +29,13 @@ 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.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.ListNavigator;
import li.strolch.runtime.query.inmemory.NameSelector;
import li.strolch.runtime.query.inmemory.OrSelector;
import li.strolch.runtime.query.inmemory.ParameterSelector;
@ -52,12 +54,14 @@ public class InMemoryQueryTest {
public void shouldQueryOrderById() {
List<Order> orders = getOrders();
InMemoryOrderDao dao = new InMemoryOrderDao();
dao.saveAll(orders);
InMemoryQuery<Order> orderQuery = new InMemoryQuery<>();
orderQuery.setNavigator(new ListNavigator<>(orders));
orderQuery.setNavigator(new AnyNavigator<Order>());
orderQuery.addSelector(new IdSelector<Order>("@1"));
List<Order> result = orderQuery.doQuery(null);
List<Order> result = orderQuery.doQuery(dao);
assertEquals(1, result.size());
assertEquals("@1", result.get(0).getId());
}
@ -66,12 +70,14 @@ public class InMemoryQueryTest {
public void shouldQueryResourceById() {
List<Resource> resources = getResources();
InMemoryResourceDao dao = new InMemoryResourceDao();
dao.saveAll(resources);
InMemoryQuery<Resource> resourceQuery = new InMemoryQuery<>();
resourceQuery.setNavigator(new ListNavigator<>(resources));
resourceQuery.setNavigator(new AnyNavigator<Resource>());
resourceQuery.addSelector(new IdSelector<Resource>("@1"));
List<Resource> result = resourceQuery.doQuery(null);
List<Resource> result = resourceQuery.doQuery(dao);
assertEquals(1, result.size());
assertEquals("@1", result.get(0).getId());
}
@ -80,14 +86,16 @@ public class InMemoryQueryTest {
public void shouldQueryResourceByIdOr() {
List<Resource> resources = getResources();
InMemoryResourceDao dao = new InMemoryResourceDao();
dao.saveAll(resources);
InMemoryQuery<Resource> resourceQuery = new InMemoryQuery<>();
resourceQuery.setNavigator(new ListNavigator<>(resources));
resourceQuery.setNavigator(new AnyNavigator<Resource>());
BooleanSelector<Resource> andSelector = new OrSelector<>(new IdSelector<Resource>("@3"),
new IdSelector<Resource>("@4"));
resourceQuery.addSelector(andSelector);
List<Resource> result = resourceQuery.doQuery(null);
List<Resource> result = resourceQuery.doQuery(dao);
assertEquals(2, result.size());
assertEquals("@3", result.get(0).getId());
assertEquals("@4", result.get(1).getId());
@ -97,16 +105,18 @@ public class InMemoryQueryTest {
public void shouldQueryResourceByIdAnd() {
List<Resource> resources = getResources();
InMemoryResourceDao dao = new InMemoryResourceDao();
dao.saveAll(resources);
InMemoryQuery<Resource> resourceQuery = new InMemoryQuery<>();
resourceQuery.setNavigator(new ListNavigator<>(resources));
resourceQuery.setNavigator(new AnyNavigator<Resource>());
List<Selector<Resource>> andSelectors = new ArrayList<>();
andSelectors.add(new IdSelector<Resource>("@3"));
andSelectors.add(new NameSelector<Resource>("Res 3"));
BooleanSelector<Resource> andSelector = new AndSelector<Resource>(andSelectors);
resourceQuery.addSelector(andSelector);
List<Resource> result = resourceQuery.doQuery(null);
List<Resource> result = resourceQuery.doQuery(dao);
assertEquals(1, result.size());
assertEquals("@3", result.get(0).getId());
}
@ -115,16 +125,18 @@ public class InMemoryQueryTest {
public void shouldNotQueryResourceByIdAnd() {
List<Resource> resources = getResources();
InMemoryResourceDao dao = new InMemoryResourceDao();
dao.saveAll(resources);
InMemoryQuery<Resource> resourceQuery = new InMemoryQuery<>();
resourceQuery.setNavigator(new ListNavigator<>(resources));
resourceQuery.setNavigator(new AnyNavigator<Resource>());
List<Selector<Resource>> andSelectors = new ArrayList<>();
andSelectors.add(new IdSelector<Resource>("@3"));
andSelectors.add(new NameSelector<Resource>("Res 4"));
BooleanSelector<Resource> andSelector = new AndSelector<Resource>(andSelectors);
resourceQuery.addSelector(andSelector);
List<Resource> result = resourceQuery.doQuery(null);
List<Resource> result = resourceQuery.doQuery(dao);
assertEquals(0, result.size());
}
@ -133,14 +145,16 @@ public class InMemoryQueryTest {
List<Resource> resources = getResources();
resources.add(getBallResource());
InMemoryResourceDao dao = new InMemoryResourceDao();
dao.saveAll(resources);
InMemoryQuery<Resource> ballQuery = new InMemoryQuery<>();
ballQuery.setNavigator(new ListNavigator<>(resources));
ballQuery.addSelector(ParameterSelector.<Resource>stringSelector("parameters", "color", "red"));
ballQuery.addSelector(ParameterSelector.<Resource>booleanSelector("parameters", "forChildren", true));
ballQuery.addSelector(ParameterSelector.<Resource>floatSelector("parameters", "diameter", 22.0));
List<Resource> result = ballQuery.doQuery(null);
ballQuery.setNavigator(new AnyNavigator<Resource>());
ballQuery.addSelector(ParameterSelector.<Resource> stringSelector("parameters", "color", "red"));
ballQuery.addSelector(ParameterSelector.<Resource> booleanSelector("parameters", "forChildren", true));
ballQuery.addSelector(ParameterSelector.<Resource> floatSelector("parameters", "diameter", 22.0));
List<Resource> result = ballQuery.doQuery(dao);
assertEquals(1, result.size());
}

View File

@ -73,11 +73,11 @@ public class QueryTest {
ResourceQuery query = new ResourceQuery(new StrolchTypeNavigation("MyType"));
query.addSelection(andSelection);
InMemoryResourceQueryVisitor resourceQuery = new InMemoryResourceQueryVisitor(agent.getContainer());
InMemoryResourceQueryVisitor resourceQuery = new InMemoryResourceQueryVisitor();
InMemoryQuery<Resource> inMemoryQuery = resourceQuery.visit(query);
List<Resource> result;
try (StrolchTransaction tx = resourceMap.openTx()) {
result = inMemoryQuery.doQuery(tx);
result = inMemoryQuery.doQuery(tx.getResourceDao());
}
assertEquals(1, result.size());
assertEquals("@1", result.get(0).getId());
@ -103,11 +103,11 @@ public class QueryTest {
OrderQuery query = new OrderQuery(new StrolchTypeNavigation("MyType"));
query.addSelection(andSelection);
InMemoryOrderQueryVisitor orderQuery = new InMemoryOrderQueryVisitor(agent.getContainer());
InMemoryOrderQueryVisitor orderQuery = new InMemoryOrderQueryVisitor();
InMemoryQuery<Order> inMemoryQuery = orderQuery.visit(query);
List<Order> result;
try (StrolchTransaction tx = orderMap.openTx()) {
result = inMemoryQuery.doQuery(tx);
result = inMemoryQuery.doQuery(tx.getOrderDao());
}
assertEquals(1, result.size());
assertEquals("@1", result.get(0).getId());