[New] Moved *Visitor transformations in query into query method

This is better than keeping the Visitor in the instance of the query,
where it might be to early to instantiate it.
This commit is contained in:
Robert von Burg 2014-08-06 18:42:38 +02:00
parent c49bd5f87f
commit 546524b113
9 changed files with 60 additions and 34 deletions

View File

@ -28,13 +28,19 @@ 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.OrderVisitor;
import li.strolch.model.ParameterBag;
import li.strolch.model.Resource;
import li.strolch.model.ResourceVisitor;
import li.strolch.model.StrolchElement;
import li.strolch.model.StrolchRootElement;
import li.strolch.model.Tags;
import li.strolch.model.parameter.Parameter;
import li.strolch.model.query.OrderQuery;
import li.strolch.model.query.ResourceQuery;
import li.strolch.model.visitor.NoStrategyOrderVisitor;
import li.strolch.model.visitor.NoStrategyResourceVisitor;
import li.strolch.persistence.inmemory.InMemoryTransaction;
import li.strolch.runtime.observer.ObserverHandler;
import li.strolch.service.api.Command;
@ -164,13 +170,23 @@ public abstract class AbstractTransaction implements StrolchTransaction {
}
@Override
public <U> List<U> doQuery(OrderQuery<U> query) {
return getPersistenceHandler().getOrderDao(this).doQuery(query);
public List<Order> doQuery(OrderQuery query) {
return getPersistenceHandler().getOrderDao(this).doQuery(query, new NoStrategyOrderVisitor());
}
@Override
public <U> List<U> doQuery(ResourceQuery<U> query) {
return getPersistenceHandler().getResourceDao(this).doQuery(query);
public <U> List<U> doQuery(OrderQuery query, OrderVisitor<U> orderVisitor) {
return getPersistenceHandler().getOrderDao(this).doQuery(query, orderVisitor);
}
@Override
public List<Resource> doQuery(ResourceQuery query) {
return getPersistenceHandler().getResourceDao(this).doQuery(query, new NoStrategyResourceVisitor());
}
@Override
public <U> List<U> doQuery(ResourceQuery query, ResourceVisitor<U> resourceVisitor) {
return getPersistenceHandler().getResourceDao(this).doQuery(query, resourceVisitor);
}
@SuppressWarnings("unchecked")

View File

@ -18,6 +18,7 @@ package li.strolch.persistence.api;
import java.util.List;
import li.strolch.model.Order;
import li.strolch.model.OrderVisitor;
import li.strolch.model.query.OrderQuery;
/**
@ -25,5 +26,5 @@ import li.strolch.model.query.OrderQuery;
*/
public interface OrderDao extends StrolchDao<Order> {
public <U> List<U> doQuery(OrderQuery<U> query);
public <U> List<U> doQuery(OrderQuery query, OrderVisitor<U> orderVisitor);
}

View File

@ -18,6 +18,7 @@ package li.strolch.persistence.api;
import java.util.List;
import li.strolch.model.Resource;
import li.strolch.model.ResourceVisitor;
import li.strolch.model.query.ResourceQuery;
/**
@ -25,5 +26,5 @@ import li.strolch.model.query.ResourceQuery;
*/
public interface ResourceDao extends StrolchDao<Resource> {
public <U> List<U> doQuery(ResourceQuery<U> query);
public <U> List<U> doQuery(ResourceQuery query, ResourceVisitor<U> resourceVisitor);
}

View File

@ -22,8 +22,10 @@ import li.strolch.agent.api.ResourceMap;
import li.strolch.exception.StrolchException;
import li.strolch.model.Locator;
import li.strolch.model.Order;
import li.strolch.model.OrderVisitor;
import li.strolch.model.ParameterBag;
import li.strolch.model.Resource;
import li.strolch.model.ResourceVisitor;
import li.strolch.model.StrolchElement;
import li.strolch.model.StrolchRootElement;
import li.strolch.model.parameter.Parameter;
@ -64,9 +66,13 @@ public interface StrolchTransaction extends AutoCloseable {
public void addCommand(Command command);
public <U> List<U> doQuery(OrderQuery<U> query);
public List<Order> doQuery(OrderQuery query);
public <U> List<U> doQuery(ResourceQuery<U> query);
public <U> List<U> doQuery(OrderQuery query, OrderVisitor<U> orderVisitor);
public List<Resource> doQuery(ResourceQuery query);
public <U> List<U> doQuery(ResourceQuery query, ResourceVisitor<U> resourceVisitor);
/**
* <p>

View File

@ -3,6 +3,7 @@ package li.strolch.persistence.inmemory;
import java.util.List;
import li.strolch.model.Order;
import li.strolch.model.OrderVisitor;
import li.strolch.model.query.OrderQuery;
import li.strolch.persistence.api.OrderDao;
import li.strolch.runtime.query.inmemory.InMemoryOrderQueryVisitor;
@ -11,9 +12,9 @@ import li.strolch.runtime.query.inmemory.InMemoryQuery;
public class InMemoryOrderDao extends InMemoryDao<Order> implements OrderDao {
@Override
public <U> List<U> doQuery(OrderQuery<U> orderQuery) {
public <U> List<U> doQuery(OrderQuery orderQuery, OrderVisitor<U> orderVisitor) {
InMemoryOrderQueryVisitor visitor = new InMemoryOrderQueryVisitor();
InMemoryQuery<Order, U> query = visitor.visit(orderQuery);
InMemoryQuery<Order, U> query = visitor.visit(orderQuery, orderVisitor);
return query.doQuery(this);
}
}

View File

@ -3,6 +3,7 @@ package li.strolch.persistence.inmemory;
import java.util.List;
import li.strolch.model.Resource;
import li.strolch.model.ResourceVisitor;
import li.strolch.model.query.ResourceQuery;
import li.strolch.persistence.api.ResourceDao;
import li.strolch.runtime.query.inmemory.InMemoryQuery;
@ -11,9 +12,9 @@ import li.strolch.runtime.query.inmemory.InMemoryResourceQueryVisitor;
public class InMemoryResourceDao extends InMemoryDao<Resource> implements ResourceDao {
@Override
public <U> List<U> doQuery(ResourceQuery<U> resourceQuery) {
public <U> List<U> doQuery(ResourceQuery resourceQuery, ResourceVisitor<U> resourceVisitor) {
InMemoryResourceQueryVisitor visitor = new InMemoryResourceQueryVisitor();
InMemoryQuery<Resource, U> query = visitor.visit(resourceQuery);
InMemoryQuery<Resource, U> query = visitor.visit(resourceQuery, resourceVisitor);
return query.doQuery(this);
}
}

View File

@ -39,8 +39,8 @@ public class InMemoryOrderQueryVisitor extends InMemoryQueryVisitor<Order, Order
return new InMemoryOrderQueryVisitor();
}
public <U> InMemoryQuery<Order, U> visit(OrderQuery<U> orderQuery) {
DBC.PRE.assertNotNull("OrderVisitor may not be null!", orderQuery.getElementVisitor());
public <U> InMemoryQuery<Order, U> visit(OrderQuery orderQuery, OrderVisitor<U> orderVisitor) {
DBC.PRE.assertNotNull("OrderVisitor may not be null!", orderVisitor);
orderQuery.accept(this);
if (this.navigator == null) {
@ -48,12 +48,11 @@ public class InMemoryOrderQueryVisitor extends InMemoryQueryVisitor<Order, Order
throw new QueryException(msg);
}
OrderVisitor<U> elementVisitor = orderQuery.getElementVisitor();
if (this.selectors.isEmpty())
return new InMemoryQuery<>(this.navigator, null, elementVisitor);
return new InMemoryQuery<>(this.navigator, null, orderVisitor);
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), elementVisitor);
return new InMemoryQuery<>(this.navigator, this.selectors.get(0), orderVisitor);
}
@Override

View File

@ -15,13 +15,13 @@
*/
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;
import li.strolch.persistence.api.ResourceDao;
import ch.eitchnet.utils.dbc.DBC;
/**
* @author Robert von Burg <eitch@eitchnet.ch>
@ -38,8 +38,8 @@ public class InMemoryResourceQueryVisitor extends InMemoryQueryVisitor<Resource,
return new InMemoryResourceQueryVisitor();
}
public <U> InMemoryQuery<Resource, U> visit(ResourceQuery<U> resourceQuery) {
DBC.PRE.assertNotNull("ResourceVisitor may not be null!", resourceQuery.getElementVisitor());
public <U> InMemoryQuery<Resource, U> visit(ResourceQuery resourceQuery, ResourceVisitor<U> resourceVisitor) {
DBC.PRE.assertNotNull("ResourceVisitor may not be null!", resourceVisitor);
resourceQuery.accept(this);
if (this.navigator == null) {
@ -47,12 +47,11 @@ public class InMemoryResourceQueryVisitor extends InMemoryQueryVisitor<Resource,
throw new QueryException(msg);
}
ResourceVisitor<U> elementVisitor = resourceQuery.getElementVisitor();
if (this.selectors.isEmpty())
return new InMemoryQuery<>(this.navigator, null, elementVisitor);
return new InMemoryQuery<>(this.navigator, null, resourceVisitor);
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);
return new InMemoryQuery<>(this.navigator, this.selectors.get(0), resourceVisitor);
}
@Override

View File

@ -35,6 +35,8 @@ 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.visitor.NoStrategyOrderVisitor;
import li.strolch.model.visitor.NoStrategyResourceVisitor;
import li.strolch.persistence.api.StrolchTransaction;
import li.strolch.runtime.StrolchConstants;
@ -63,14 +65,14 @@ public class QueryTest {
tx.getResourceMap().add(tx, res1);
}
ResourceQuery<Resource> query = ResourceQuery.query("MyType");
ResourceQuery query = ResourceQuery.query("MyType");
List<Selection> 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<Resource, Resource> inMemoryQuery = resourceQuery.visit(query);
InMemoryQuery<Resource, Resource> inMemoryQuery = resourceQuery.visit(query, new NoStrategyResourceVisitor());
List<Resource> result;
try (StrolchTransaction tx = container.getRealm(StrolchConstants.DEFAULT_REALM).openTx()) {
result = inMemoryQuery.doQuery(tx.getPersistenceHandler().getResourceDao(tx));
@ -93,14 +95,14 @@ public class QueryTest {
tx.getOrderMap().add(tx, o1);
}
OrderQuery<Order> query = OrderQuery.query("MyType");
OrderQuery query = OrderQuery.query("MyType");
List<Selection> 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<Order, Order> inMemoryQuery = orderQuery.visit(query);
InMemoryQuery<Order, Order> inMemoryQuery = orderQuery.visit(query, new NoStrategyOrderVisitor());
List<Order> result;
try (StrolchTransaction tx = container.getRealm(StrolchConstants.DEFAULT_REALM).openTx()) {
result = inMemoryQuery.doQuery(tx.getPersistenceHandler().getOrderDao(tx));
@ -121,7 +123,7 @@ public class QueryTest {
tx.getResourceMap().add(tx, res1);
}
ResourceQuery<Resource> query = ResourceQuery.query("MyType");
ResourceQuery query = ResourceQuery.query("MyType");
query.and().with(ParameterSelection.stringSelection(BAG_ID, PARAM_STRING_ID, "olch").contains(true));
List<Resource> result;
try (StrolchTransaction tx = container.getRealm(StrolchConstants.DEFAULT_REALM).openTx()) {
@ -143,7 +145,7 @@ public class QueryTest {
tx.getResourceMap().add(tx, res1);
}
ResourceQuery<Resource> query = ResourceQuery.query("MyType");
ResourceQuery query = ResourceQuery.query("MyType");
query.and().with(ParameterSelection.stringSelection(BAG_ID, PARAM_STRING_ID, "str").contains(true));
List<Resource> result;
try (StrolchTransaction tx = container.getRealm(StrolchConstants.DEFAULT_REALM).openTx()) {
@ -164,7 +166,7 @@ public class QueryTest {
tx.getResourceMap().add(tx, res1);
}
ResourceQuery<Resource> query = ResourceQuery.query("MyType");
ResourceQuery query = ResourceQuery.query("MyType");
query.and().with(ParameterSelection.stringSelection(BAG_ID, PARAM_STRING_ID, "strolch").caseInsensitive(true));
List<Resource> result;
try (StrolchTransaction tx = container.getRealm(StrolchConstants.DEFAULT_REALM).openTx()) {
@ -186,7 +188,7 @@ public class QueryTest {
tx.getResourceMap().add(tx, res1);
}
ResourceQuery<Resource> query = ResourceQuery.query("MyType");
ResourceQuery query = ResourceQuery.query("MyType");
query.and().with(ParameterSelection.stringSelection(BAG_ID, PARAM_STRING_ID, "strolch"));
List<Resource> result;
try (StrolchTransaction tx = container.getRealm(StrolchConstants.DEFAULT_REALM).openTx()) {
@ -210,7 +212,7 @@ public class QueryTest {
}
{
ResourceQuery<Resource> query = ResourceQuery.query("MyType");
ResourceQuery query = ResourceQuery.query("MyType");
query.not(new IdSelection("@1"));
List<Resource> result;
try (StrolchTransaction tx = container.getRealm(StrolchConstants.DEFAULT_REALM).openTx()) {
@ -221,7 +223,7 @@ public class QueryTest {
}
{
ResourceQuery<Resource> query = ResourceQuery.query("MyType");
ResourceQuery query = ResourceQuery.query("MyType");
query.not(new IdSelection("@2"));
List<Resource> result;
try (StrolchTransaction tx = container.getRealm(StrolchConstants.DEFAULT_REALM).openTx()) {
@ -232,7 +234,7 @@ public class QueryTest {
}
{
ResourceQuery<Resource> query = ResourceQuery.query("MyType");
ResourceQuery query = ResourceQuery.query("MyType");
query.not(new IdSelection("@1", "@2"));
List<Resource> result;
try (StrolchTransaction tx = container.getRealm(StrolchConstants.DEFAULT_REALM).openTx()) {