From 69eb5ccf383acd5ef6a63e4020a90230b40952ef Mon Sep 17 00:00:00 2001 From: Robert von Burg Date: Mon, 10 Aug 2015 22:21:45 +0200 Subject: [PATCH] [Major] Refactored query API - Now added ordering - added setters for visitors on query - --- ch.eitchnet.utils | 2 +- .../li/strolch/agent/api/ActivityMap.java | 3 +- .../java/li/strolch/agent/api/AuditTrail.java | 5 +- .../java/li/strolch/agent/api/OrderMap.java | 3 +- .../li/strolch/agent/api/ResourceMap.java | 3 +- .../agent/impl/AuditingActivityMap.java | 10 +- .../agent/impl/AuditingAuditMapFacade.java | 16 +-- .../strolch/agent/impl/AuditingOrderMap.java | 10 +- .../agent/impl/AuditingResourceMap.java | 10 +- .../strolch/agent/impl/CachedActivityMap.java | 5 +- .../strolch/agent/impl/CachedAuditTrail.java | 11 +- .../li/strolch/agent/impl/CachedOrderMap.java | 5 +- .../strolch/agent/impl/CachedResourceMap.java | 5 +- .../agent/impl/NoStrategyAuditTrail.java | 8 +- .../agent/impl/TransactionalActivityMap.java | 5 +- .../agent/impl/TransactionalAuditTrail.java | 11 +- .../agent/impl/TransactionalOrderMap.java | 5 +- .../agent/impl/TransactionalResourceMap.java | 5 +- .../persistence/api/AbstractTransaction.java | 84 ++----------- .../strolch/persistence/api/ActivityDao.java | 3 +- .../li/strolch/persistence/api/AuditDao.java | 3 +- .../li/strolch/persistence/api/OrderDao.java | 3 +- .../strolch/persistence/api/ResourceDao.java | 3 +- .../persistence/api/StrolchTransaction.java | 110 ++---------------- .../inmemory/InMemoryActivityDao.java | 5 +- .../inmemory/InMemoryAuditDao.java | 7 +- .../inmemory/InMemoryOrderDao.java | 5 +- .../inmemory/InMemoryResourceDao.java | 5 +- .../query/inmemory/AuditTypeNavigator.java | 3 + .../InMemoryActivityQueryVisitor.java | 8 +- .../inmemory/InMemoryAuditQueryVisitor.java | 10 +- .../inmemory/InMemoryOrderQueryVisitor.java | 8 +- .../runtime/query/inmemory/InMemoryQuery.java | 11 +- .../query/inmemory/InMemoryQueryVisitor.java | 30 ++++- .../InMemoryResourceQueryVisitor.java | 8 +- .../InMemoryStrolchQueryOrderingVisitor.java | 58 +++++++++ .../query/inmemory/AuditQueryTest.java | 52 +++++---- .../query/inmemory/InMemoryQueryTest.java | 93 +++++++-------- .../runtime/query/inmemory/QueryTest.java | 24 ++-- .../strolch/model/audit/ActionSelection.java | 2 +- .../li/strolch/model/audit/AuditQuery.java | 42 +++++-- .../model/audit/AuditQueryVisitor.java | 2 +- .../strolch/model/audit/AuditSelection.java | 6 +- .../strolch/model/audit/ElementSelection.java | 2 +- .../model/audit/IdentitySelection.java | 2 +- .../li/strolch/model/query/ActivityQuery.java | 76 ++++++++++-- .../model/query/ActivityQueryVisitor.java | 5 +- .../li/strolch/model/query/OrderQuery.java | 70 +++++++++-- .../model/query/OrderQueryVisitor.java | 6 +- .../li/strolch/model/query/ResourceQuery.java | 77 ++++++++++-- .../model/query/ResourceQueryVisitor.java | 5 +- .../model/query/StrolchTypeNavigation.java | 3 + .../model/query/ordering/ByIdComparator.java | 25 ++++ .../query/ordering/ByNameComparator.java | 25 ++++ .../query/ordering/ByParamComparator.java | 42 +++++++ .../model/query/ordering/OrderById.java | 44 +++++++ .../model/query/ordering/OrderByName.java | 44 +++++++ .../query/ordering/OrderByParameter.java | 71 +++++++++++ .../query/ordering/StrolchQueryOrdering.java | 38 ++++++ .../ordering/StrolchQueryOrderingVisitor.java | 28 +++++ .../performance/PerformanceTestService.java | 2 +- .../postgresql/PostgreSqlActivityDao.java | 5 +- .../postgresql/PostgreSqlAuditDao.java | 3 +- .../PostgreSqlAuditQueryVisitor.java | 2 +- .../postgresql/PostgreSqlOrderDao.java | 5 +- .../postgresql/PostgreSqlQueryVisitor.java | 78 ++++++++++--- .../postgresql/PostgreSqlResourceDao.java | 5 +- .../postgresql/dao/test/AuditQueryTest.java | 52 +++++---- .../postgresql/dao/test/QueryTest.java | 105 ++++++++--------- .../persistence/xml/XmlActivityDao.java | 3 +- .../strolch/persistence/xml/XmlAuditDao.java | 3 +- .../strolch/persistence/xml/XmlOrderDao.java | 3 +- .../persistence/xml/XmlResourceDao.java | 3 +- .../strolch/rest/endpoint/AuditsService.java | 2 +- .../model/visitor/ToAuditQueryVisitor.java | 5 +- .../migrations/RunMigrationsAction.java | 1 - 76 files changed, 1015 insertions(+), 532 deletions(-) create mode 100644 li.strolch.agent/src/main/java/li/strolch/runtime/query/inmemory/InMemoryStrolchQueryOrderingVisitor.java create mode 100644 li.strolch.model/src/main/java/li/strolch/model/query/ordering/ByIdComparator.java create mode 100644 li.strolch.model/src/main/java/li/strolch/model/query/ordering/ByNameComparator.java create mode 100644 li.strolch.model/src/main/java/li/strolch/model/query/ordering/ByParamComparator.java create mode 100644 li.strolch.model/src/main/java/li/strolch/model/query/ordering/OrderById.java create mode 100644 li.strolch.model/src/main/java/li/strolch/model/query/ordering/OrderByName.java create mode 100644 li.strolch.model/src/main/java/li/strolch/model/query/ordering/OrderByParameter.java create mode 100644 li.strolch.model/src/main/java/li/strolch/model/query/ordering/StrolchQueryOrdering.java create mode 100644 li.strolch.model/src/main/java/li/strolch/model/query/ordering/StrolchQueryOrderingVisitor.java diff --git a/ch.eitchnet.utils b/ch.eitchnet.utils index a3c2a2ed8..f5cf3e3ad 160000 --- a/ch.eitchnet.utils +++ b/ch.eitchnet.utils @@ -1 +1 @@ -Subproject commit a3c2a2ed8f65c5463609f26c2835ce8f7baa5e69 +Subproject commit f5cf3e3ad0a4865ec75ffb4e58b03557b4d1db2e diff --git a/li.strolch.agent/src/main/java/li/strolch/agent/api/ActivityMap.java b/li.strolch.agent/src/main/java/li/strolch/agent/api/ActivityMap.java index 9fe310a1f..7907e4c7f 100644 --- a/li.strolch.agent/src/main/java/li/strolch/agent/api/ActivityMap.java +++ b/li.strolch.agent/src/main/java/li/strolch/agent/api/ActivityMap.java @@ -17,7 +17,6 @@ package li.strolch.agent.api; import java.util.List; -import li.strolch.model.ActivityVisitor; import li.strolch.model.activity.Activity; import li.strolch.model.query.ActivityQuery; import li.strolch.persistence.api.StrolchTransaction; @@ -27,5 +26,5 @@ import li.strolch.persistence.api.StrolchTransaction; */ public interface ActivityMap extends ElementMap { - public List doQuery(StrolchTransaction tx, ActivityQuery query, ActivityVisitor activityVisitor); + public List doQuery(StrolchTransaction tx, ActivityQuery query); } diff --git a/li.strolch.agent/src/main/java/li/strolch/agent/api/AuditTrail.java b/li.strolch.agent/src/main/java/li/strolch/agent/api/AuditTrail.java index cdd8acb2b..eba9cdafe 100644 --- a/li.strolch.agent/src/main/java/li/strolch/agent/api/AuditTrail.java +++ b/li.strolch.agent/src/main/java/li/strolch/agent/api/AuditTrail.java @@ -20,7 +20,6 @@ import java.util.Set; import li.strolch.model.audit.Audit; import li.strolch.model.audit.AuditQuery; -import li.strolch.model.audit.AuditVisitor; import li.strolch.persistence.api.StrolchTransaction; import ch.eitchnet.utils.collections.DateRange; @@ -67,7 +66,5 @@ public interface AuditTrail { public long removeAll(StrolchTransaction tx, String type, DateRange dateRange); - public List doQuery(StrolchTransaction tx, AuditQuery query); - - public List doQuery(StrolchTransaction tx, AuditQuery query, AuditVisitor auditVisitor); + public List doQuery(StrolchTransaction tx, AuditQuery query); } diff --git a/li.strolch.agent/src/main/java/li/strolch/agent/api/OrderMap.java b/li.strolch.agent/src/main/java/li/strolch/agent/api/OrderMap.java index f763c9c89..839d3531b 100644 --- a/li.strolch.agent/src/main/java/li/strolch/agent/api/OrderMap.java +++ b/li.strolch.agent/src/main/java/li/strolch/agent/api/OrderMap.java @@ -18,7 +18,6 @@ package li.strolch.agent.api; 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.StrolchTransaction; @@ -27,5 +26,5 @@ import li.strolch.persistence.api.StrolchTransaction; */ public interface OrderMap extends ElementMap { - public List doQuery(StrolchTransaction tx, OrderQuery query, OrderVisitor orderVisitor); + public List doQuery(StrolchTransaction tx, OrderQuery query); } diff --git a/li.strolch.agent/src/main/java/li/strolch/agent/api/ResourceMap.java b/li.strolch.agent/src/main/java/li/strolch/agent/api/ResourceMap.java index 5fc2002a4..b7d5f9e0e 100644 --- a/li.strolch.agent/src/main/java/li/strolch/agent/api/ResourceMap.java +++ b/li.strolch.agent/src/main/java/li/strolch/agent/api/ResourceMap.java @@ -18,7 +18,6 @@ package li.strolch.agent.api; 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.StrolchTransaction; @@ -27,5 +26,5 @@ import li.strolch.persistence.api.StrolchTransaction; */ public interface ResourceMap extends ElementMap { - public List doQuery(StrolchTransaction tx, ResourceQuery query, ResourceVisitor resourceVisitor); + public List doQuery(StrolchTransaction tx, ResourceQuery query); } diff --git a/li.strolch.agent/src/main/java/li/strolch/agent/impl/AuditingActivityMap.java b/li.strolch.agent/src/main/java/li/strolch/agent/impl/AuditingActivityMap.java index 56bdd9c6e..67090a76f 100644 --- a/li.strolch.agent/src/main/java/li/strolch/agent/impl/AuditingActivityMap.java +++ b/li.strolch.agent/src/main/java/li/strolch/agent/impl/AuditingActivityMap.java @@ -17,6 +17,7 @@ package li.strolch.agent.impl; import java.util.List; +import ch.eitchnet.utils.dbc.DBC; import li.strolch.agent.api.ActivityMap; import li.strolch.agent.api.AuditTrail; import li.strolch.agent.api.ElementMap; @@ -47,11 +48,14 @@ public class AuditingActivityMap extends AuditingElementMapFacade impl } @Override - public List doQuery(StrolchTransaction tx, ActivityQuery query, ActivityVisitor activityVisitor) { - List result = getElementMap().doQuery(tx, query, activity -> { + public List doQuery(StrolchTransaction tx, ActivityQuery query) { + ActivityVisitor activityVisitor = query.getActivityVisitor(); + DBC.PRE.assertNotNull("activityVisitor on query", activityVisitor); + query.setActivityVisitor(activity -> { this.read.add(activity); return activityVisitor.visit(activity); }); - return result; + + return getElementMap().doQuery(tx, query); } } diff --git a/li.strolch.agent/src/main/java/li/strolch/agent/impl/AuditingAuditMapFacade.java b/li.strolch.agent/src/main/java/li/strolch/agent/impl/AuditingAuditMapFacade.java index fdc8effe3..51dc49be1 100644 --- a/li.strolch.agent/src/main/java/li/strolch/agent/impl/AuditingAuditMapFacade.java +++ b/li.strolch.agent/src/main/java/li/strolch/agent/impl/AuditingAuditMapFacade.java @@ -25,7 +25,6 @@ import li.strolch.agent.api.AuditTrail; import li.strolch.model.audit.Audit; import li.strolch.model.audit.AuditQuery; import li.strolch.model.audit.AuditVisitor; -import li.strolch.model.audit.NoStrategyAuditVisitor; import li.strolch.persistence.api.StrolchTransaction; import ch.eitchnet.utils.collections.DateRange; import ch.eitchnet.utils.dbc.DBC; @@ -203,18 +202,13 @@ public class AuditingAuditMapFacade implements AuditTrail { } @Override - public List doQuery(StrolchTransaction tx, AuditQuery query) { - List elements = this.auditTrail.doQuery(tx, query, new NoStrategyAuditVisitor()); - this.read.addAll(elements); - return elements; - } - - @Override - public List doQuery(StrolchTransaction tx, AuditQuery query, AuditVisitor auditVisitor) { - List elements = this.auditTrail.doQuery(tx, query, audit -> { + public List doQuery(StrolchTransaction tx, AuditQuery query) { + AuditVisitor auditVisitor = query.getAuditVisitor(); + query.setAuditVisitor(audit -> { this.read.add(audit); return auditVisitor.visitAudit(audit); }); - return elements; + + return this.auditTrail.doQuery(tx, query); } } diff --git a/li.strolch.agent/src/main/java/li/strolch/agent/impl/AuditingOrderMap.java b/li.strolch.agent/src/main/java/li/strolch/agent/impl/AuditingOrderMap.java index c3197f73e..3b18390ea 100644 --- a/li.strolch.agent/src/main/java/li/strolch/agent/impl/AuditingOrderMap.java +++ b/li.strolch.agent/src/main/java/li/strolch/agent/impl/AuditingOrderMap.java @@ -24,6 +24,7 @@ import li.strolch.model.Order; import li.strolch.model.OrderVisitor; import li.strolch.model.query.OrderQuery; import li.strolch.persistence.api.StrolchTransaction; +import ch.eitchnet.utils.dbc.DBC; /** * This is the {@link AuditTrail} for {@link Order Orders} @@ -47,11 +48,14 @@ public class AuditingOrderMap extends AuditingElementMapFacade implements } @Override - public List doQuery(StrolchTransaction tx, OrderQuery query, OrderVisitor orderVisitor) { - List result = getElementMap().doQuery(tx, query, order -> { + public List doQuery(StrolchTransaction tx, OrderQuery query) { + OrderVisitor orderVisitor = query.getOrderVisitor(); + DBC.PRE.assertNotNull("orderVisitor on query", orderVisitor); + query.setOrderVisitor(order -> { this.read.add(order); return orderVisitor.visit(order); }); - return result; + + return getElementMap().doQuery(tx, query); } } diff --git a/li.strolch.agent/src/main/java/li/strolch/agent/impl/AuditingResourceMap.java b/li.strolch.agent/src/main/java/li/strolch/agent/impl/AuditingResourceMap.java index c843c5985..7ee432312 100644 --- a/li.strolch.agent/src/main/java/li/strolch/agent/impl/AuditingResourceMap.java +++ b/li.strolch.agent/src/main/java/li/strolch/agent/impl/AuditingResourceMap.java @@ -24,6 +24,7 @@ import li.strolch.model.Resource; import li.strolch.model.ResourceVisitor; import li.strolch.model.query.ResourceQuery; import li.strolch.persistence.api.StrolchTransaction; +import ch.eitchnet.utils.dbc.DBC; /** * This is the {@link AuditTrail} for {@link Resource Resources} @@ -47,11 +48,14 @@ public class AuditingResourceMap extends AuditingElementMapFacade impl } @Override - public List doQuery(StrolchTransaction tx, ResourceQuery query, ResourceVisitor resourceVisitor) { - List result = getElementMap().doQuery(tx, query, resource -> { + public List doQuery(StrolchTransaction tx, ResourceQuery query) { + ResourceVisitor resourceVisitor = query.getResourceVisitor(); + DBC.PRE.assertNotNull("resourceVisitor on query", resourceVisitor); + query.setResourceVisitor(resource -> { this.read.add(resource); return resourceVisitor.visit(resource); }); - return result; + + return getElementMap().doQuery(tx, query); } } diff --git a/li.strolch.agent/src/main/java/li/strolch/agent/impl/CachedActivityMap.java b/li.strolch.agent/src/main/java/li/strolch/agent/impl/CachedActivityMap.java index 5bf7dc7a9..87e4510e8 100644 --- a/li.strolch.agent/src/main/java/li/strolch/agent/impl/CachedActivityMap.java +++ b/li.strolch.agent/src/main/java/li/strolch/agent/impl/CachedActivityMap.java @@ -20,7 +20,6 @@ import static li.strolch.model.StrolchModelConstants.INTERPRETATION_ACTIVITY_REF import java.util.List; import li.strolch.agent.api.ActivityMap; -import li.strolch.model.ActivityVisitor; import li.strolch.model.activity.Activity; import li.strolch.model.parameter.Parameter; import li.strolch.model.query.ActivityQuery; @@ -53,7 +52,7 @@ public class CachedActivityMap extends CachedElementMap implements Act } @Override - public List doQuery(StrolchTransaction tx, ActivityQuery query, ActivityVisitor activityVisitor) { - return getCachedDao().doQuery(query, activityVisitor); + public List doQuery(StrolchTransaction tx, ActivityQuery query) { + return getCachedDao().doQuery(query); } } diff --git a/li.strolch.agent/src/main/java/li/strolch/agent/impl/CachedAuditTrail.java b/li.strolch.agent/src/main/java/li/strolch/agent/impl/CachedAuditTrail.java index cc2383038..97156fb6d 100644 --- a/li.strolch.agent/src/main/java/li/strolch/agent/impl/CachedAuditTrail.java +++ b/li.strolch.agent/src/main/java/li/strolch/agent/impl/CachedAuditTrail.java @@ -22,8 +22,6 @@ import java.util.Set; import li.strolch.agent.api.AuditTrail; import li.strolch.model.audit.Audit; import li.strolch.model.audit.AuditQuery; -import li.strolch.model.audit.AuditVisitor; -import li.strolch.model.audit.NoStrategyAuditVisitor; import li.strolch.persistence.api.AuditDao; import li.strolch.persistence.api.StrolchTransaction; import li.strolch.persistence.inmemory.InMemoryAuditDao; @@ -156,12 +154,7 @@ public class CachedAuditTrail implements AuditTrail { } @Override - public List doQuery(StrolchTransaction tx, AuditQuery query) { - return getDbDao(tx).doQuery(query, new NoStrategyAuditVisitor()); - } - - @Override - public List doQuery(StrolchTransaction tx, AuditQuery query, AuditVisitor auditVisitor) { - return getDbDao(tx).doQuery(query, auditVisitor); + public List doQuery(StrolchTransaction tx, AuditQuery query) { + return getDbDao(tx).doQuery(query); } } diff --git a/li.strolch.agent/src/main/java/li/strolch/agent/impl/CachedOrderMap.java b/li.strolch.agent/src/main/java/li/strolch/agent/impl/CachedOrderMap.java index 76ee49584..45dfeb3ad 100644 --- a/li.strolch.agent/src/main/java/li/strolch/agent/impl/CachedOrderMap.java +++ b/li.strolch.agent/src/main/java/li/strolch/agent/impl/CachedOrderMap.java @@ -21,7 +21,6 @@ import java.util.List; import li.strolch.agent.api.OrderMap; import li.strolch.model.Order; -import li.strolch.model.OrderVisitor; import li.strolch.model.parameter.Parameter; import li.strolch.model.query.OrderQuery; import li.strolch.persistence.api.OrderDao; @@ -53,7 +52,7 @@ public class CachedOrderMap extends CachedElementMap implements OrderMap } @Override - public List doQuery(StrolchTransaction tx, OrderQuery query, OrderVisitor orderVisitor) { - return getCachedDao().doQuery(query, orderVisitor); + public List doQuery(StrolchTransaction tx, OrderQuery query) { + return getCachedDao().doQuery(query); } } diff --git a/li.strolch.agent/src/main/java/li/strolch/agent/impl/CachedResourceMap.java b/li.strolch.agent/src/main/java/li/strolch/agent/impl/CachedResourceMap.java index f67a9eaa2..df6660257 100644 --- a/li.strolch.agent/src/main/java/li/strolch/agent/impl/CachedResourceMap.java +++ b/li.strolch.agent/src/main/java/li/strolch/agent/impl/CachedResourceMap.java @@ -21,7 +21,6 @@ import java.util.List; import li.strolch.agent.api.ResourceMap; import li.strolch.model.Resource; -import li.strolch.model.ResourceVisitor; import li.strolch.model.parameter.Parameter; import li.strolch.model.query.ResourceQuery; import li.strolch.persistence.api.ResourceDao; @@ -53,7 +52,7 @@ public class CachedResourceMap extends CachedElementMap implements Res } @Override - public List doQuery(StrolchTransaction tx, ResourceQuery query, ResourceVisitor resourceVisitor) { - return getCachedDao().doQuery(query, resourceVisitor); + public List doQuery(StrolchTransaction tx, ResourceQuery query) { + return getCachedDao().doQuery(query); } } diff --git a/li.strolch.agent/src/main/java/li/strolch/agent/impl/NoStrategyAuditTrail.java b/li.strolch.agent/src/main/java/li/strolch/agent/impl/NoStrategyAuditTrail.java index 476ad7207..0c0742cad 100644 --- a/li.strolch.agent/src/main/java/li/strolch/agent/impl/NoStrategyAuditTrail.java +++ b/li.strolch.agent/src/main/java/li/strolch/agent/impl/NoStrategyAuditTrail.java @@ -21,7 +21,6 @@ import java.util.Set; import li.strolch.agent.api.AuditTrail; import li.strolch.model.audit.Audit; import li.strolch.model.audit.AuditQuery; -import li.strolch.model.audit.AuditVisitor; import li.strolch.persistence.api.StrolchTransaction; import ch.eitchnet.utils.collections.DateRange; @@ -101,12 +100,7 @@ public class NoStrategyAuditTrail implements AuditTrail { } @Override - public List doQuery(StrolchTransaction tx, AuditQuery query) { - return null; - } - - @Override - public List doQuery(StrolchTransaction tx, AuditQuery query, AuditVisitor auditVisitor) { + public List doQuery(StrolchTransaction tx, AuditQuery query) { return null; } } diff --git a/li.strolch.agent/src/main/java/li/strolch/agent/impl/TransactionalActivityMap.java b/li.strolch.agent/src/main/java/li/strolch/agent/impl/TransactionalActivityMap.java index 3b06a72ec..fee085e4c 100644 --- a/li.strolch.agent/src/main/java/li/strolch/agent/impl/TransactionalActivityMap.java +++ b/li.strolch.agent/src/main/java/li/strolch/agent/impl/TransactionalActivityMap.java @@ -20,7 +20,6 @@ import static li.strolch.model.StrolchModelConstants.INTERPRETATION_ACTIVITY_REF import java.util.List; import li.strolch.agent.api.ActivityMap; -import li.strolch.model.ActivityVisitor; import li.strolch.model.activity.Activity; import li.strolch.model.parameter.Parameter; import li.strolch.model.query.ActivityQuery; @@ -40,7 +39,7 @@ public class TransactionalActivityMap extends TransactionalElementMap } @Override - public List doQuery(StrolchTransaction tx, ActivityQuery query, ActivityVisitor activityVisitor) { - return getDao(tx).doQuery(query, activityVisitor); + public List doQuery(StrolchTransaction tx, ActivityQuery query) { + return getDao(tx).doQuery(query); } } diff --git a/li.strolch.agent/src/main/java/li/strolch/agent/impl/TransactionalAuditTrail.java b/li.strolch.agent/src/main/java/li/strolch/agent/impl/TransactionalAuditTrail.java index 6e0412ed6..077714a9a 100644 --- a/li.strolch.agent/src/main/java/li/strolch/agent/impl/TransactionalAuditTrail.java +++ b/li.strolch.agent/src/main/java/li/strolch/agent/impl/TransactionalAuditTrail.java @@ -21,8 +21,6 @@ import java.util.Set; import li.strolch.agent.api.AuditTrail; import li.strolch.model.audit.Audit; import li.strolch.model.audit.AuditQuery; -import li.strolch.model.audit.AuditVisitor; -import li.strolch.model.audit.NoStrategyAuditVisitor; import li.strolch.persistence.api.AuditDao; import li.strolch.persistence.api.StrolchTransaction; import ch.eitchnet.utils.collections.DateRange; @@ -109,12 +107,7 @@ public class TransactionalAuditTrail implements AuditTrail { } @Override - public List doQuery(StrolchTransaction tx, AuditQuery query) { - return getDao(tx).doQuery(query, new NoStrategyAuditVisitor()); - } - - @Override - public List doQuery(StrolchTransaction tx, AuditQuery query, AuditVisitor auditVisitor) { - return getDao(tx).doQuery(query, auditVisitor); + public List doQuery(StrolchTransaction tx, AuditQuery query) { + return getDao(tx).doQuery(query); } } diff --git a/li.strolch.agent/src/main/java/li/strolch/agent/impl/TransactionalOrderMap.java b/li.strolch.agent/src/main/java/li/strolch/agent/impl/TransactionalOrderMap.java index ccb2bcc36..4d4d8cfbf 100644 --- a/li.strolch.agent/src/main/java/li/strolch/agent/impl/TransactionalOrderMap.java +++ b/li.strolch.agent/src/main/java/li/strolch/agent/impl/TransactionalOrderMap.java @@ -21,7 +21,6 @@ import java.util.List; import li.strolch.agent.api.OrderMap; import li.strolch.model.Order; -import li.strolch.model.OrderVisitor; import li.strolch.model.parameter.Parameter; import li.strolch.model.query.OrderQuery; import li.strolch.persistence.api.OrderDao; @@ -40,7 +39,7 @@ public class TransactionalOrderMap extends TransactionalElementMap implem } @Override - public List doQuery(StrolchTransaction tx, OrderQuery query, OrderVisitor orderVisitor) { - return getDao(tx).doQuery(query, orderVisitor); + public List doQuery(StrolchTransaction tx, OrderQuery query) { + return getDao(tx).doQuery(query); } } diff --git a/li.strolch.agent/src/main/java/li/strolch/agent/impl/TransactionalResourceMap.java b/li.strolch.agent/src/main/java/li/strolch/agent/impl/TransactionalResourceMap.java index 6f6eeebfa..700923aee 100644 --- a/li.strolch.agent/src/main/java/li/strolch/agent/impl/TransactionalResourceMap.java +++ b/li.strolch.agent/src/main/java/li/strolch/agent/impl/TransactionalResourceMap.java @@ -21,7 +21,6 @@ import java.util.List; import li.strolch.agent.api.ResourceMap; import li.strolch.model.Resource; -import li.strolch.model.ResourceVisitor; import li.strolch.model.parameter.Parameter; import li.strolch.model.query.ResourceQuery; import li.strolch.persistence.api.ResourceDao; @@ -40,7 +39,7 @@ public class TransactionalResourceMap extends TransactionalElementMap } @Override - public List doQuery(StrolchTransaction tx, ResourceQuery query, ResourceVisitor resourceVisitor) { - return getDao(tx).doQuery(query, resourceVisitor); + public List doQuery(StrolchTransaction tx, ResourceQuery query) { + return getDao(tx).doQuery(query); } } diff --git a/li.strolch.agent/src/main/java/li/strolch/persistence/api/AbstractTransaction.java b/li.strolch.agent/src/main/java/li/strolch/persistence/api/AbstractTransaction.java index a5dced69a..c08bd4840 100644 --- a/li.strolch.agent/src/main/java/li/strolch/persistence/api/AbstractTransaction.java +++ b/li.strolch.agent/src/main/java/li/strolch/persistence/api/AbstractTransaction.java @@ -38,14 +38,11 @@ import li.strolch.agent.impl.AuditingResourceMap; import li.strolch.agent.impl.InternalStrolchRealm; import li.strolch.exception.StrolchAccessDeniedException; import li.strolch.exception.StrolchException; -import li.strolch.model.ActivityVisitor; 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; @@ -53,8 +50,6 @@ import li.strolch.model.activity.Activity; import li.strolch.model.audit.AccessType; import li.strolch.model.audit.Audit; import li.strolch.model.audit.AuditQuery; -import li.strolch.model.audit.AuditVisitor; -import li.strolch.model.audit.NoStrategyAuditVisitor; import li.strolch.model.parameter.Parameter; import li.strolch.model.parameter.StringListParameter; import li.strolch.model.parameter.StringParameter; @@ -65,9 +60,6 @@ import li.strolch.model.query.StrolchQuery; import li.strolch.model.timedstate.StrolchTimedState; import li.strolch.model.timevalue.IValue; import li.strolch.model.visitor.ElementTypeVisitor; -import li.strolch.model.visitor.NoStrategyActivityVisitor; -import li.strolch.model.visitor.NoStrategyOrderVisitor; -import li.strolch.model.visitor.NoStrategyResourceVisitor; import li.strolch.runtime.StrolchConstants; import li.strolch.runtime.privilege.PrivilegeHandler; import li.strolch.service.api.Command; @@ -292,51 +284,31 @@ public abstract class AbstractTransaction implements StrolchTransaction { } @Override - public List doQuery(OrderQuery query) { + public List doQuery(OrderQuery query) { assertQueryAllowed(query); - return getOrderMap().doQuery(this, query, new NoStrategyOrderVisitor()); + DBC.PRE.assertNotNull("orderVisitor", query.getOrderVisitor()); + return getOrderMap().doQuery(this, query); } @Override - public List doQuery(OrderQuery query, OrderVisitor orderVisitor) { + public List doQuery(ResourceQuery query) { assertQueryAllowed(query); - return getOrderMap().doQuery(this, query, orderVisitor); + DBC.PRE.assertNotNull("resourceVisitor", query.getResourceVisitor()); + return getResourceMap().doQuery(this, query); } @Override - public List doQuery(ResourceQuery query) { + public List doQuery(ActivityQuery query) { assertQueryAllowed(query); - return getResourceMap().doQuery(this, query, new NoStrategyResourceVisitor()); + DBC.PRE.assertNotNull("activityVisitor", query.getActivityVisitor()); + return getActivityMap().doQuery(this, query); } @Override - public List doQuery(ResourceQuery query, ResourceVisitor resourceVisitor) { + public List doQuery(AuditQuery query) { assertQueryAllowed(query); - return getResourceMap().doQuery(this, query, resourceVisitor); - } - - @Override - public List doQuery(ActivityQuery query) { - assertQueryAllowed(query); - return getActivityMap().doQuery(this, query, new NoStrategyActivityVisitor()); - } - - @Override - public List doQuery(ActivityQuery query, ActivityVisitor activityVisitor) { - assertQueryAllowed(query); - return getActivityMap().doQuery(this, query, activityVisitor); - } - - @Override - public List doQuery(AuditQuery query) { - assertQueryAllowed(query); - return getAuditTrail().doQuery(this, query, new NoStrategyAuditVisitor()); - } - - @Override - public List doQuery(AuditQuery query, AuditVisitor auditVisitor) { - assertQueryAllowed(query); - return getAuditTrail().doQuery(this, query, auditVisitor); + DBC.PRE.assertNotNull("auditVisitor", query.getAuditVisitor()); + return getAuditTrail().doQuery(this, query); } @SuppressWarnings("unchecked") @@ -514,18 +486,6 @@ public abstract class AbstractTransaction implements StrolchTransaction { DBC.PRE.assertNotNull("refP", refP); return getResourceMap().getBy(this, refP, assertExists); } - - - - - - - - - - - - @Override public Activity getActivityBy(String type, String id) { @@ -566,26 +526,6 @@ public abstract class AbstractTransaction implements StrolchTransaction { return getActivityMap().getBy(this, refP, assertExists); } - - - - - - - - - - - - - - - - - - - - @Override public void flush() { try { diff --git a/li.strolch.agent/src/main/java/li/strolch/persistence/api/ActivityDao.java b/li.strolch.agent/src/main/java/li/strolch/persistence/api/ActivityDao.java index 79e2ea9ad..00fdc94d3 100644 --- a/li.strolch.agent/src/main/java/li/strolch/persistence/api/ActivityDao.java +++ b/li.strolch.agent/src/main/java/li/strolch/persistence/api/ActivityDao.java @@ -17,7 +17,6 @@ package li.strolch.persistence.api; import java.util.List; -import li.strolch.model.ActivityVisitor; import li.strolch.model.activity.Activity; import li.strolch.model.query.ActivityQuery; @@ -26,5 +25,5 @@ import li.strolch.model.query.ActivityQuery; */ public interface ActivityDao extends StrolchDao { - public List doQuery(ActivityQuery query, ActivityVisitor activityVisitor); + public List doQuery(ActivityQuery query); } diff --git a/li.strolch.agent/src/main/java/li/strolch/persistence/api/AuditDao.java b/li.strolch.agent/src/main/java/li/strolch/persistence/api/AuditDao.java index c92d92d32..78fc82b21 100644 --- a/li.strolch.agent/src/main/java/li/strolch/persistence/api/AuditDao.java +++ b/li.strolch.agent/src/main/java/li/strolch/persistence/api/AuditDao.java @@ -20,7 +20,6 @@ import java.util.Set; import li.strolch.model.audit.Audit; import li.strolch.model.audit.AuditQuery; -import li.strolch.model.audit.AuditVisitor; import ch.eitchnet.utils.collections.DateRange; /** @@ -54,5 +53,5 @@ public interface AuditDao { public long removeAll(String type, DateRange dateRange); - public List doQuery(AuditQuery query, AuditVisitor auditVisitor); + public List doQuery(AuditQuery query); } diff --git a/li.strolch.agent/src/main/java/li/strolch/persistence/api/OrderDao.java b/li.strolch.agent/src/main/java/li/strolch/persistence/api/OrderDao.java index e8bfaace6..8090d7afa 100644 --- a/li.strolch.agent/src/main/java/li/strolch/persistence/api/OrderDao.java +++ b/li.strolch.agent/src/main/java/li/strolch/persistence/api/OrderDao.java @@ -18,7 +18,6 @@ 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; /** @@ -26,5 +25,5 @@ import li.strolch.model.query.OrderQuery; */ public interface OrderDao extends StrolchDao { - public List doQuery(OrderQuery query, OrderVisitor orderVisitor); + public List doQuery(OrderQuery query); } diff --git a/li.strolch.agent/src/main/java/li/strolch/persistence/api/ResourceDao.java b/li.strolch.agent/src/main/java/li/strolch/persistence/api/ResourceDao.java index 0968bd962..eccc7fd64 100644 --- a/li.strolch.agent/src/main/java/li/strolch/persistence/api/ResourceDao.java +++ b/li.strolch.agent/src/main/java/li/strolch/persistence/api/ResourceDao.java @@ -18,7 +18,6 @@ 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; /** @@ -26,5 +25,5 @@ import li.strolch.model.query.ResourceQuery; */ public interface ResourceDao extends StrolchDao { - public List doQuery(ResourceQuery query, ResourceVisitor resourceVisitor); + public List doQuery(ResourceQuery query); } diff --git a/li.strolch.agent/src/main/java/li/strolch/persistence/api/StrolchTransaction.java b/li.strolch.agent/src/main/java/li/strolch/persistence/api/StrolchTransaction.java index 081e50bfc..78e9340d6 100644 --- a/li.strolch.agent/src/main/java/li/strolch/persistence/api/StrolchTransaction.java +++ b/li.strolch.agent/src/main/java/li/strolch/persistence/api/StrolchTransaction.java @@ -363,33 +363,10 @@ public interface StrolchTransaction extends AutoCloseable { */ public Audit auditFrom(AccessType accessType, StrolchRootElement element); - /** - *

- * Performs the given {@link OrderQuery} returning the resulting list of {@link Order Orders}. - *

- * - *

- * Note: Should the result be mapped to different objects, then use - * {@link #doQuery(OrderQuery, OrderVisitor)} - *

- * - * @param query - * the query to perform - * - * @return the result list, never null - */ - public List doQuery(OrderQuery query); - /** *

* Performs the given {@link OrderQuery} and each returned {@link Order} is passed through the {@link OrderVisitor} - * and the return value of the visitor is added to the return list - *

- * - *

- * This method is intended for situations where the query result should not be {@link Order} but some other object - * type. For instance in a restful API, the result might have to be mapped to a POJO, thus using this method can - * perform the mapping step for you + * attached to the {@link OrderQuery} and the return value of the visitor is added to the return list *

* * @param query @@ -397,35 +374,13 @@ public interface StrolchTransaction extends AutoCloseable { * * @return the result list of elements as returned by the {@link OrderVisitor}, never null */ - public List doQuery(OrderQuery query, OrderVisitor orderVisitor); - - /** - *

- * Performs the given {@link ResourceQuery} returning the resulting list of {@link Resource Resources}. - *

- * - *

- * Note: Should the result be mapped to different objects, then use - * {@link #doQuery(ResourceQuery, ResourceVisitor)} - *

- * - * @param query - * the query to perform - * - * @return the result list, never null - */ - public List doQuery(ResourceQuery query); + public List doQuery(OrderQuery query); /** *

* Performs the given {@link ResourceQuery} and each returned {@link Resource} is passed through the - * {@link ResourceVisitor} and the return value of the visitor is added to the return list - *

- * - *

- * This method is intended for situations where the query result should not be {@link Resource} but some other - * object type. For instance in a restful API, the result might have to be mapped to a POJO, thus using this method - * can perform the mapping step for you + * {@link ResourceVisitor} attached to the {@link ResourceQuery} and the return value of the visitor is added to the + * return list *

* * @param query @@ -433,35 +388,13 @@ public interface StrolchTransaction extends AutoCloseable { * * @return the result list of elements as returned by the {@link ResourceVisitor}, never null */ - public List doQuery(ResourceQuery query, ResourceVisitor resourceVisitor); - - /** - *

- * Performs the given {@link ActivityQuery} returning the resulting list of {@link Activity Activities}. - *

- * - *

- * Note: Should the result be mapped to different objects, then use - * {@link #doQuery(ActivityQuery, ActivityVisitor)} - *

- * - * @param query - * the query to perform - * - * @return the result list, never null - */ - public List doQuery(ActivityQuery query); + public List doQuery(ResourceQuery query); /** *

* Performs the given {@link ActivityQuery} and each returned {@link Activity} is passed through the - * {@link ActivityVisitor} and the return value of the visitor is added to the return list - *

- * - *

- * This method is intended for situations where the query result should not be {@link Activity} but some other - * object type. For instance in a restful API, the result might have to be mapped to a POJO, thus using this method - * can perform the mapping step for you + * {@link ActivityVisitor} attached to the {@link ActivityQuery} and the return value of the visitor is added to the + * return list *

* * @param query @@ -469,35 +402,12 @@ public interface StrolchTransaction extends AutoCloseable { * * @return the result list of elements as returned by the {@link ActivityVisitor}, never null */ - public List doQuery(ActivityQuery query, ActivityVisitor activityVisitor); - - /** - *

- * Performs the given {@link AuditQuery} returning the resulting list of {@link Audit Audits}. - *

- * - *

- * Note: Should the result be mapped to different objects, then use - * {@link #doQuery(AuditQuery, AuditVisitor)} - *

- * - * @param query - * the query to perform - * - * @return the result list, never null - */ - public List doQuery(AuditQuery query); + public List doQuery(ActivityQuery query); /** *

* Performs the given {@link AuditQuery} and each returned {@link Audit} is passed through the {@link AuditVisitor} - * and the return value of the visitor is added to the return list - *

- * - *

- * This method is intended for situations where the query result should not be {@link Audit} but some other object - * type. For instance in a restful API, the result might have to be mapped to a POJO, thus using this method can - * perform the mapping step for you + * attached to the {@link AuditQuery} and the return value of the visitor is added to the return list *

* * @param query @@ -505,7 +415,7 @@ public interface StrolchTransaction extends AutoCloseable { * * @return the result list of elements as returned by the {@link AuditVisitor}, never null */ - public List doQuery(AuditQuery query, AuditVisitor auditVisitor); + public List doQuery(AuditQuery query); /** *

diff --git a/li.strolch.agent/src/main/java/li/strolch/persistence/inmemory/InMemoryActivityDao.java b/li.strolch.agent/src/main/java/li/strolch/persistence/inmemory/InMemoryActivityDao.java index 665a6b86a..24cc74856 100644 --- a/li.strolch.agent/src/main/java/li/strolch/persistence/inmemory/InMemoryActivityDao.java +++ b/li.strolch.agent/src/main/java/li/strolch/persistence/inmemory/InMemoryActivityDao.java @@ -17,7 +17,6 @@ package li.strolch.persistence.inmemory; import java.util.List; -import li.strolch.model.ActivityVisitor; import li.strolch.model.activity.Activity; import li.strolch.model.query.ActivityQuery; import li.strolch.persistence.api.ActivityDao; @@ -27,9 +26,9 @@ import li.strolch.runtime.query.inmemory.InMemoryQuery; public class InMemoryActivityDao extends InMemoryDao implements ActivityDao { @Override - public List doQuery(ActivityQuery activityQuery, ActivityVisitor activityVisitor) { + public List doQuery(ActivityQuery activityQuery) { InMemoryActivityQueryVisitor visitor = new InMemoryActivityQueryVisitor(); - InMemoryQuery query = visitor.visit(activityQuery, activityVisitor); + InMemoryQuery query = visitor.visit(activityQuery); return query.doQuery(this); } } diff --git a/li.strolch.agent/src/main/java/li/strolch/persistence/inmemory/InMemoryAuditDao.java b/li.strolch.agent/src/main/java/li/strolch/persistence/inmemory/InMemoryAuditDao.java index 73c842b90..048d854e3 100644 --- a/li.strolch.agent/src/main/java/li/strolch/persistence/inmemory/InMemoryAuditDao.java +++ b/li.strolch.agent/src/main/java/li/strolch/persistence/inmemory/InMemoryAuditDao.java @@ -23,7 +23,6 @@ import java.util.Set; import li.strolch.model.audit.Audit; import li.strolch.model.audit.AuditQuery; -import li.strolch.model.audit.AuditVisitor; import li.strolch.persistence.api.AuditDao; import li.strolch.runtime.query.inmemory.InMemoryAuditQuery; import li.strolch.runtime.query.inmemory.InMemoryAuditQueryVisitor; @@ -160,9 +159,9 @@ public class InMemoryAuditDao implements AuditDao { } @Override - public List doQuery(AuditQuery auditQuery, AuditVisitor auditVisitor) { - InMemoryAuditQueryVisitor visitor = new InMemoryAuditQueryVisitor(); - InMemoryAuditQuery query = visitor.visit(auditQuery, auditVisitor); + public List doQuery(AuditQuery auditQuery) { + InMemoryAuditQueryVisitor visitor = new InMemoryAuditQueryVisitor<>(); + InMemoryAuditQuery query = visitor.toInMemory(auditQuery); return query.doQuery(this); } } diff --git a/li.strolch.agent/src/main/java/li/strolch/persistence/inmemory/InMemoryOrderDao.java b/li.strolch.agent/src/main/java/li/strolch/persistence/inmemory/InMemoryOrderDao.java index ef74f6dd1..af629543c 100644 --- a/li.strolch.agent/src/main/java/li/strolch/persistence/inmemory/InMemoryOrderDao.java +++ b/li.strolch.agent/src/main/java/li/strolch/persistence/inmemory/InMemoryOrderDao.java @@ -18,7 +18,6 @@ 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; @@ -27,9 +26,9 @@ import li.strolch.runtime.query.inmemory.InMemoryQuery; public class InMemoryOrderDao extends InMemoryDao implements OrderDao { @Override - public List doQuery(OrderQuery orderQuery, OrderVisitor orderVisitor) { + public List doQuery(OrderQuery orderQuery) { InMemoryOrderQueryVisitor visitor = new InMemoryOrderQueryVisitor(); - InMemoryQuery query = visitor.visit(orderQuery, orderVisitor); + InMemoryQuery query = visitor.visit(orderQuery); return query.doQuery(this); } } diff --git a/li.strolch.agent/src/main/java/li/strolch/persistence/inmemory/InMemoryResourceDao.java b/li.strolch.agent/src/main/java/li/strolch/persistence/inmemory/InMemoryResourceDao.java index 12c7fd277..3dd198682 100644 --- a/li.strolch.agent/src/main/java/li/strolch/persistence/inmemory/InMemoryResourceDao.java +++ b/li.strolch.agent/src/main/java/li/strolch/persistence/inmemory/InMemoryResourceDao.java @@ -18,7 +18,6 @@ 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; @@ -27,9 +26,9 @@ import li.strolch.runtime.query.inmemory.InMemoryResourceQueryVisitor; public class InMemoryResourceDao extends InMemoryDao implements ResourceDao { @Override - public List doQuery(ResourceQuery resourceQuery, ResourceVisitor resourceVisitor) { + public List doQuery(ResourceQuery resourceQuery) { InMemoryResourceQueryVisitor visitor = new InMemoryResourceQueryVisitor(); - InMemoryQuery query = visitor.visit(resourceQuery, resourceVisitor); + InMemoryQuery query = visitor.visit(resourceQuery); return query.doQuery(this); } } diff --git a/li.strolch.agent/src/main/java/li/strolch/runtime/query/inmemory/AuditTypeNavigator.java b/li.strolch.agent/src/main/java/li/strolch/runtime/query/inmemory/AuditTypeNavigator.java index 026575d44..91471dd55 100644 --- a/li.strolch.agent/src/main/java/li/strolch/runtime/query/inmemory/AuditTypeNavigator.java +++ b/li.strolch.agent/src/main/java/li/strolch/runtime/query/inmemory/AuditTypeNavigator.java @@ -20,6 +20,7 @@ import java.util.List; import li.strolch.model.audit.Audit; import li.strolch.persistence.api.AuditDao; import ch.eitchnet.utils.collections.DateRange; +import ch.eitchnet.utils.dbc.DBC; /** * @author Robert von Burg @@ -30,6 +31,8 @@ public class AuditTypeNavigator implements AuditNavigator { private DateRange dateRange; public AuditTypeNavigator(String type, DateRange dateRange) { + DBC.PRE.assertNotNull("type", type); + DBC.PRE.assertNotNull("dateRange", dateRange); this.type = type; this.dateRange = dateRange; } diff --git a/li.strolch.agent/src/main/java/li/strolch/runtime/query/inmemory/InMemoryActivityQueryVisitor.java b/li.strolch.agent/src/main/java/li/strolch/runtime/query/inmemory/InMemoryActivityQueryVisitor.java index 482ef37a7..23940ea2a 100644 --- a/li.strolch.agent/src/main/java/li/strolch/runtime/query/inmemory/InMemoryActivityQueryVisitor.java +++ b/li.strolch.agent/src/main/java/li/strolch/runtime/query/inmemory/InMemoryActivityQueryVisitor.java @@ -40,8 +40,10 @@ public class InMemoryActivityQueryVisitor extends InMemoryQueryVisitor InMemoryQuery visit(ActivityQuery activityQuery, ActivityVisitor activityVisitor) { + public InMemoryQuery visit(ActivityQuery activityQuery) { + ActivityVisitor activityVisitor = activityQuery.getActivityVisitor(); DBC.PRE.assertNotNull("ActivityVisitor may not be null!", activityVisitor); //$NON-NLS-1$ + activityQuery.accept(this); Navigator navigator = getNavigator(); @@ -52,10 +54,10 @@ public class InMemoryActivityQueryVisitor extends InMemoryQueryVisitor> selectors = getSelectors(); if (selectors.isEmpty()) - return new InMemoryQuery<>(navigator, null, activityVisitor); + return new InMemoryQuery<>(navigator, null, activityVisitor, getComparator()); DBC.PRE.assertTrue("Invalid query as it may only contain one selector!", selectors.size() == 1); //$NON-NLS-1$ - return new InMemoryQuery<>(navigator, selectors.get(0), activityVisitor); + return new InMemoryQuery<>(navigator, selectors.get(0), activityVisitor, getComparator()); } @Override diff --git a/li.strolch.agent/src/main/java/li/strolch/runtime/query/inmemory/InMemoryAuditQueryVisitor.java b/li.strolch.agent/src/main/java/li/strolch/runtime/query/inmemory/InMemoryAuditQueryVisitor.java index a77472c8a..b22ba6377 100644 --- a/li.strolch.agent/src/main/java/li/strolch/runtime/query/inmemory/InMemoryAuditQueryVisitor.java +++ b/li.strolch.agent/src/main/java/li/strolch/runtime/query/inmemory/InMemoryAuditQueryVisitor.java @@ -30,13 +30,15 @@ import ch.eitchnet.utils.dbc.DBC; /** * @author Robert von Burg */ -public class InMemoryAuditQueryVisitor implements AuditQueryVisitor { +public class InMemoryAuditQueryVisitor implements AuditQueryVisitor { private AuditTypeNavigator navigator; private List selectors; - public InMemoryAuditQuery visit(AuditQuery auditQuery, AuditVisitor auditVisitor) { - DBC.PRE.assertNotNull("auditVisitor may not be null!", auditVisitor); //$NON-NLS-1$ + public InMemoryAuditQuery toInMemory(AuditQuery auditQuery) { + AuditVisitor auditVisitor = auditQuery.getAuditVisitor(); + DBC.PRE.assertNotNull("auditVisitor", auditVisitor); //$NON-NLS-1$ + this.selectors = new ArrayList<>(); auditQuery.accept(this); @@ -66,7 +68,7 @@ public class InMemoryAuditQueryVisitor implements AuditQueryVisitor { } @Override - public void visit(AuditQuery auditQuery) { + public void visit(AuditQuery auditQuery) { String type = auditQuery.getElementTypeSelection(); DateRange dateRange = auditQuery.getDateRange(); this.navigator = new AuditTypeNavigator(type, dateRange); diff --git a/li.strolch.agent/src/main/java/li/strolch/runtime/query/inmemory/InMemoryOrderQueryVisitor.java b/li.strolch.agent/src/main/java/li/strolch/runtime/query/inmemory/InMemoryOrderQueryVisitor.java index b15ee9a7f..823f33eda 100644 --- a/li.strolch.agent/src/main/java/li/strolch/runtime/query/inmemory/InMemoryOrderQueryVisitor.java +++ b/li.strolch.agent/src/main/java/li/strolch/runtime/query/inmemory/InMemoryOrderQueryVisitor.java @@ -41,8 +41,10 @@ public class InMemoryOrderQueryVisitor extends InMemoryQueryVisitor InMemoryQuery visit(OrderQuery orderQuery, OrderVisitor orderVisitor) { + public InMemoryQuery visit(OrderQuery orderQuery) { + OrderVisitor orderVisitor = orderQuery.getOrderVisitor(); DBC.PRE.assertNotNull("OrderVisitor may not be null!", orderVisitor); //$NON-NLS-1$ + orderQuery.accept(this); Navigator navigator = getNavigator(); @@ -53,10 +55,10 @@ public class InMemoryOrderQueryVisitor extends InMemoryQueryVisitor> selectors = getSelectors(); if (selectors.isEmpty()) - return new InMemoryQuery<>(navigator, null, orderVisitor); + return new InMemoryQuery<>(navigator, null, orderVisitor, getComparator()); DBC.PRE.assertTrue("Invalid query as it may only contain one selector!", selectors.size() == 1); //$NON-NLS-1$ - return new InMemoryQuery<>(navigator, selectors.get(0), orderVisitor); + return new InMemoryQuery<>(navigator, selectors.get(0), orderVisitor, getComparator()); } @Override diff --git a/li.strolch.agent/src/main/java/li/strolch/runtime/query/inmemory/InMemoryQuery.java b/li.strolch.agent/src/main/java/li/strolch/runtime/query/inmemory/InMemoryQuery.java index 1328f5a0c..09e01b56b 100644 --- a/li.strolch.agent/src/main/java/li/strolch/runtime/query/inmemory/InMemoryQuery.java +++ b/li.strolch.agent/src/main/java/li/strolch/runtime/query/inmemory/InMemoryQuery.java @@ -17,6 +17,7 @@ package li.strolch.runtime.query.inmemory; import java.util.ArrayList; import java.util.Collections; +import java.util.Comparator; import java.util.Iterator; import java.util.List; @@ -33,15 +34,18 @@ public class InMemoryQuery { private Navigator navigator; private Selector selector; private StrolchElementVisitor elementVisitor; + private Comparator comparator; public InMemoryQuery() { // empty constructor } - public InMemoryQuery(Navigator navigator, Selector selector, StrolchElementVisitor elementVisitor) { + public InMemoryQuery(Navigator navigator, Selector selector, StrolchElementVisitor elementVisitor, + Comparator comparator) { this.navigator = navigator; this.selector = selector; this.elementVisitor = elementVisitor; + this.comparator = comparator; } /** @@ -73,8 +77,11 @@ public class InMemoryQuery { if (this.selector == null) return Collections.emptyList(); - List result = new ArrayList(); List elements = this.navigator.navigate(dao); + if (this.comparator != null) + elements.sort(this.comparator); + + List result = new ArrayList(); Iterator iter = elements.iterator(); while (iter.hasNext()) { T element = iter.next(); diff --git a/li.strolch.agent/src/main/java/li/strolch/runtime/query/inmemory/InMemoryQueryVisitor.java b/li.strolch.agent/src/main/java/li/strolch/runtime/query/inmemory/InMemoryQueryVisitor.java index 9504e7ac0..8e01a413f 100644 --- a/li.strolch.agent/src/main/java/li/strolch/runtime/query/inmemory/InMemoryQueryVisitor.java +++ b/li.strolch.agent/src/main/java/li/strolch/runtime/query/inmemory/InMemoryQueryVisitor.java @@ -17,6 +17,7 @@ package li.strolch.runtime.query.inmemory; import java.util.ArrayList; import java.util.Collections; +import java.util.Comparator; import java.util.List; import li.strolch.model.GroupedParameterizedElement; @@ -44,6 +45,10 @@ import li.strolch.model.query.ParameterSelection.StringParameterSelection; import li.strolch.model.query.ParameterSelectionVisitor; import li.strolch.model.query.Selection; import li.strolch.model.query.StrolchRootElementSelectionVisitor; +import li.strolch.model.query.ordering.OrderById; +import li.strolch.model.query.ordering.OrderByName; +import li.strolch.model.query.ordering.OrderByParameter; +import li.strolch.model.query.ordering.StrolchQueryOrderingVisitor; import li.strolch.persistence.api.StrolchDao; import li.strolch.runtime.query.inmemory.ParameterBagSelector.NullParameterBagSelector; import li.strolch.runtime.query.inmemory.ParameterSelector.StringParameterSelector; @@ -53,8 +58,9 @@ import ch.eitchnet.utils.dbc.DBC; * @author Robert von Burg */ public abstract class InMemoryQueryVisitor> implements - StrolchRootElementSelectionVisitor, ParameterSelectionVisitor { + StrolchRootElementSelectionVisitor, ParameterSelectionVisitor, StrolchQueryOrderingVisitor { + private Comparator comparator; private Navigator navigator; private List> selectors; private boolean any; @@ -71,6 +77,10 @@ public abstract class InMemoryQueryVisitor getComparator() { + return this.comparator; + } + /** * @param navigator */ @@ -242,4 +252,22 @@ public abstract class InMemoryQueryVisitor(selection.getBagKey())); } + + @Override + public InMemoryQueryVisitor visit(OrderById ordering) { + this.comparator = new InMemoryStrolchQueryOrderingVisitor().visit(ordering).getComparator(); + return this; + } + + @Override + public InMemoryQueryVisitor visit(OrderByName ordering) { + this.comparator = new InMemoryStrolchQueryOrderingVisitor().visit(ordering).getComparator(); + return this; + } + + @Override + public InMemoryQueryVisitor visit(OrderByParameter ordering) { + this.comparator = new InMemoryStrolchQueryOrderingVisitor().visit(ordering).getComparator(); + return this; + } } diff --git a/li.strolch.agent/src/main/java/li/strolch/runtime/query/inmemory/InMemoryResourceQueryVisitor.java b/li.strolch.agent/src/main/java/li/strolch/runtime/query/inmemory/InMemoryResourceQueryVisitor.java index 8d0bb1258..88ad97046 100644 --- a/li.strolch.agent/src/main/java/li/strolch/runtime/query/inmemory/InMemoryResourceQueryVisitor.java +++ b/li.strolch.agent/src/main/java/li/strolch/runtime/query/inmemory/InMemoryResourceQueryVisitor.java @@ -40,8 +40,10 @@ public class InMemoryResourceQueryVisitor extends InMemoryQueryVisitor InMemoryQuery visit(ResourceQuery resourceQuery, ResourceVisitor resourceVisitor) { + public InMemoryQuery visit(ResourceQuery resourceQuery) { + ResourceVisitor resourceVisitor = resourceQuery.getResourceVisitor(); DBC.PRE.assertNotNull("ResourceVisitor may not be null!", resourceVisitor); //$NON-NLS-1$ + resourceQuery.accept(this); Navigator navigator = getNavigator(); @@ -52,10 +54,10 @@ public class InMemoryResourceQueryVisitor extends InMemoryQueryVisitor> selectors = getSelectors(); if (selectors.isEmpty()) - return new InMemoryQuery<>(navigator, null, resourceVisitor); + return new InMemoryQuery<>(navigator, null, resourceVisitor, getComparator()); DBC.INTERIM.assertTrue("Invalid query as it may only contain one selector!", selectors.size() == 1); //$NON-NLS-1$ - return new InMemoryQuery<>(navigator, selectors.get(0), resourceVisitor); + return new InMemoryQuery<>(navigator, selectors.get(0), resourceVisitor, getComparator()); } @Override diff --git a/li.strolch.agent/src/main/java/li/strolch/runtime/query/inmemory/InMemoryStrolchQueryOrderingVisitor.java b/li.strolch.agent/src/main/java/li/strolch/runtime/query/inmemory/InMemoryStrolchQueryOrderingVisitor.java new file mode 100644 index 000000000..81cc5dcb7 --- /dev/null +++ b/li.strolch.agent/src/main/java/li/strolch/runtime/query/inmemory/InMemoryStrolchQueryOrderingVisitor.java @@ -0,0 +1,58 @@ +/* + * Copyright 2015 Robert von Burg + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package li.strolch.runtime.query.inmemory; + +import java.util.Comparator; + +import li.strolch.model.GroupedParameterizedElement; +import li.strolch.model.query.ordering.ByIdComparator; +import li.strolch.model.query.ordering.ByNameComparator; +import li.strolch.model.query.ordering.ByParamComparator; +import li.strolch.model.query.ordering.OrderById; +import li.strolch.model.query.ordering.OrderByName; +import li.strolch.model.query.ordering.OrderByParameter; +import li.strolch.model.query.ordering.StrolchQueryOrderingVisitor; + +/** + * @author Robert von Burg + */ +public class InMemoryStrolchQueryOrderingVisitor implements + StrolchQueryOrderingVisitor { + + private Comparator comparator; + + public Comparator getComparator() { + return this.comparator; + } + + @Override + public InMemoryStrolchQueryOrderingVisitor visit(OrderById ordering) { + this.comparator = new ByIdComparator<>(ordering.isAscending()); + return this; + } + + @Override + public InMemoryStrolchQueryOrderingVisitor visit(OrderByName ordering) { + this.comparator = new ByNameComparator<>(ordering.isAscending()); + return this; + } + + @Override + public InMemoryStrolchQueryOrderingVisitor visit(OrderByParameter ordering) { + this.comparator = new ByParamComparator<>(ordering.getBagKey(), ordering.getParamKey(), ordering.isAscending()); + return this; + } +} diff --git a/li.strolch.agent/src/test/java/li/strolch/runtime/query/inmemory/AuditQueryTest.java b/li.strolch.agent/src/test/java/li/strolch/runtime/query/inmemory/AuditQueryTest.java index c267051bc..54d47e590 100644 --- a/li.strolch.agent/src/test/java/li/strolch/runtime/query/inmemory/AuditQueryTest.java +++ b/li.strolch.agent/src/test/java/li/strolch/runtime/query/inmemory/AuditQueryTest.java @@ -31,6 +31,7 @@ import li.strolch.model.Tags; import li.strolch.model.audit.AccessType; import li.strolch.model.audit.Audit; import li.strolch.model.audit.AuditQuery; +import li.strolch.model.audit.AuditVisitor; import li.strolch.model.audit.NoStrategyAuditVisitor; import li.strolch.persistence.inmemory.InMemoryAuditDao; @@ -72,97 +73,104 @@ public class AuditQueryTest { @Test public void shouldQueryTypeAndDateRange() throws SQLException { - AuditQuery query = new AuditQuery(Tags.AUDIT, new DateRange().from(earlier, true).to(later, true)); + AuditVisitor visitor = new NoStrategyAuditVisitor(); + + AuditQuery query = new AuditQuery<>(visitor, Tags.AUDIT, new DateRange().from(earlier, true).to(later, + true)); performQuery(query, Arrays.asList(0L, 1L, 2L, 3L, 4L)); - query = new AuditQuery(Tags.AUDIT, new DateRange().from(current, true).to(current, true)); + query = new AuditQuery<>(visitor, Tags.AUDIT, new DateRange().from(current, true).to(current, true)); performQuery(query, Arrays.asList(1L, 3L, 4L)); - query = new AuditQuery(Tags.AUDIT, new DateRange().from(current, true)); + query = new AuditQuery<>(visitor, Tags.AUDIT, new DateRange().from(current, true)); performQuery(query, Arrays.asList(1L, 2L, 3L, 4L)); - query = new AuditQuery(Tags.AUDIT, new DateRange().to(current, true)); + query = new AuditQuery<>(visitor, Tags.AUDIT, new DateRange().to(current, true)); performQuery(query, Arrays.asList(0L, 1L, 3L, 4L)); - query = new AuditQuery(Tags.RESOURCE, new DateRange().from(past, true).to(future, true)); + query = new AuditQuery<>(visitor, Tags.RESOURCE, new DateRange().from(past, true).to(future, true)); performQuery(query, Arrays. asList()); } @Test public void shouldQueryAudits() throws SQLException { - AuditQuery query = new AuditQuery(Tags.AUDIT, new DateRange().from(past, true).to(future, true)); + + AuditVisitor visitor = new NoStrategyAuditVisitor(); + + AuditQuery query = new AuditQuery<>(visitor, Tags.AUDIT, new DateRange().from(past, true).to(future, + true)); query.action().accessTypes(AccessType.CREATE, AccessType.READ); performQuery(query, Arrays.asList(0L, 1L, 4L)); - query = new AuditQuery(Tags.AUDIT, new DateRange().from(past, true).to(future, true)); + query = new AuditQuery<>(visitor, Tags.AUDIT, new DateRange().from(past, true).to(future, true)); query.action().accessTypes(AccessType.CREATE); performQuery(query, Arrays.asList(0L, 4L)); - query = new AuditQuery(Tags.AUDIT, new DateRange().from(past, true).to(future, true)); + query = new AuditQuery<>(visitor, Tags.AUDIT, new DateRange().from(past, true).to(future, true)); query.action().accessTypes(AccessType.CREATE, AccessType.READ) .actions(StringMatchMode.EQUALS_CASE_SENSITIVE, "create", "read"); performQuery(query, Arrays.asList(0L, 1L, 4L)); - query = new AuditQuery(Tags.AUDIT, new DateRange().from(past, true).to(future, true)); + query = new AuditQuery<>(visitor, Tags.AUDIT, new DateRange().from(past, true).to(future, true)); query.action().accessTypes(AccessType.CREATE, AccessType.READ) .actions(StringMatchMode.EQUALS_CASE_SENSITIVE, "read"); performQuery(query, Arrays.asList(1L)); - query = new AuditQuery(Tags.AUDIT, new DateRange().from(past, true).to(future, true)); + query = new AuditQuery<>(visitor, Tags.AUDIT, new DateRange().from(past, true).to(future, true)); query.element().elementAccessed(StringMatchMode.CONTAINS_CASE_INSENSITIVE, "crea"); performQuery(query, Arrays.asList(0L, 4L)); - query = new AuditQuery(Tags.AUDIT, new DateRange().from(past, true).to(future, true)); + query = new AuditQuery<>(visitor, Tags.AUDIT, new DateRange().from(past, true).to(future, true)); query.element().elementAccessed(StringMatchMode.CONTAINS_CASE_SENSITIVE, "crea"); performQuery(query, Arrays. asList()); - query = new AuditQuery(Tags.AUDIT, new DateRange().from(past, true).to(future, true)); + query = new AuditQuery<>(visitor, Tags.AUDIT, new DateRange().from(past, true).to(future, true)); query.element().elementAccessed(StringMatchMode.EQUALS_CASE_INSENSITIVE, "create"); performQuery(query, Arrays.asList(0L, 4L)); - query = new AuditQuery(Tags.AUDIT, new DateRange().from(past, true).to(future, true)); + query = new AuditQuery<>(visitor, Tags.AUDIT, new DateRange().from(past, true).to(future, true)); query.identity().usernames(StringMatchMode.EQUALS_CASE_INSENSITIVE, "earlier"); performQuery(query, Arrays.asList(0L)); - query = new AuditQuery(Tags.AUDIT, new DateRange().from(past, true).to(future, true)); + query = new AuditQuery<>(visitor, Tags.AUDIT, new DateRange().from(past, true).to(future, true)); query.identity().usernames(StringMatchMode.EQUALS_CASE_INSENSITIVE, "earlier", "later"); performQuery(query, Arrays.asList(0L, 2L)); - query = new AuditQuery(Tags.AUDIT, new DateRange().from(past, true).to(future, true)); + query = new AuditQuery<>(visitor, Tags.AUDIT, new DateRange().from(past, true).to(future, true)); query.identity().usernames(StringMatchMode.EQUALS_CASE_INSENSITIVE, "earlier") .firstnames(StringMatchMode.CONTAINS_CASE_INSENSITIVE, "enn"); performQuery(query, Arrays.asList(0L)); - query = new AuditQuery(Tags.AUDIT, new DateRange().from(past, true).to(future, true)); + query = new AuditQuery<>(visitor, Tags.AUDIT, new DateRange().from(past, true).to(future, true)); query.identity().usernames(StringMatchMode.EQUALS_CASE_INSENSITIVE, "earlier") .firstnames(StringMatchMode.CONTAINS_CASE_INSENSITIVE, "enn") .lastnames(StringMatchMode.CONTAINS_CASE_INSENSITIVE, "kennedy"); performQuery(query, Arrays.asList(0L)); - query = new AuditQuery(Tags.AUDIT, new DateRange().from(past, true).to(future, true)); + query = new AuditQuery<>(visitor, Tags.AUDIT, new DateRange().from(past, true).to(future, true)); query.identity().firstnames(StringMatchMode.CONTAINS_CASE_INSENSITIVE, "enn") .lastnames(StringMatchMode.CONTAINS_CASE_INSENSITIVE, "kennedy"); performQuery(query, Arrays.asList(0L, 1L, 2L, 3L, 4L)); - query = new AuditQuery(Tags.AUDIT, new DateRange().from(past, true).to(future, true)); + query = new AuditQuery<>(visitor, Tags.AUDIT, new DateRange().from(past, true).to(future, true)); query.element().elementSubTypes(StringMatchMode.EQUALS_CASE_SENSITIVE, "Foo"); performQuery(query, Arrays.asList(0L, 1L, 2L, 3L, 4L)); - query = new AuditQuery(Tags.AUDIT, new DateRange().from(past, true).to(future, true)); + query = new AuditQuery<>(visitor, Tags.AUDIT, new DateRange().from(past, true).to(future, true)); query.element().elementSubTypes(StringMatchMode.EQUALS_CASE_SENSITIVE, "Bar"); performQuery(query, Arrays.asList()); - query = new AuditQuery(Tags.AUDIT, new DateRange().from(past, true).to(future, true)); + query = new AuditQuery<>(visitor, Tags.AUDIT, new DateRange().from(past, true).to(future, true)); query.limit(1).element().elementSubTypes(StringMatchMode.EQUALS_CASE_SENSITIVE, "Foo"); performQuery(query, Arrays.asList(2L)); } - private void performQuery(AuditQuery query, List expected) throws SQLException { + private void performQuery(AuditQuery query, List expected) throws SQLException { InMemoryAuditDao dao = new InMemoryAuditDao(); dao.saveAll(getAudits()); - List result = dao.doQuery(query, new NoStrategyAuditVisitor()); + List result = dao.doQuery(query); Set ids = new HashSet<>(); for (Audit audit : result) { ids.add(audit.getId()); diff --git a/li.strolch.agent/src/test/java/li/strolch/runtime/query/inmemory/InMemoryQueryTest.java b/li.strolch.agent/src/test/java/li/strolch/runtime/query/inmemory/InMemoryQueryTest.java index 3fa47b11d..75c899b63 100644 --- a/li.strolch.agent/src/test/java/li/strolch/runtime/query/inmemory/InMemoryQueryTest.java +++ b/li.strolch.agent/src/test/java/li/strolch/runtime/query/inmemory/InMemoryQueryTest.java @@ -48,9 +48,6 @@ import li.strolch.model.query.NameSelection; import li.strolch.model.query.OrderQuery; import li.strolch.model.query.ParameterSelection; import li.strolch.model.query.ResourceQuery; -import li.strolch.model.query.StrolchTypeNavigation; -import li.strolch.model.visitor.NoStrategyOrderVisitor; -import li.strolch.model.visitor.NoStrategyResourceVisitor; import li.strolch.persistence.inmemory.InMemoryOrderDao; import li.strolch.persistence.inmemory.InMemoryResourceDao; @@ -69,9 +66,9 @@ public class InMemoryQueryTest { InMemoryOrderDao dao = new InMemoryOrderDao(); dao.saveAll(orders); - OrderQuery orderQuery = new OrderQuery(new StrolchTypeNavigation("MyType1")); + OrderQuery orderQuery = OrderQuery.query("MyType1"); orderQuery.with(new IdSelection("@1")); - List result = dao.doQuery(orderQuery, new NoStrategyOrderVisitor()); + List result = dao.doQuery(orderQuery); assertEquals(1, result.size()); assertEquals("@1", result.get(0).getId()); } @@ -83,10 +80,10 @@ public class InMemoryQueryTest { InMemoryResourceDao dao = new InMemoryResourceDao(); dao.saveAll(resources); - ResourceQuery resourceQuery = new ResourceQuery(new StrolchTypeNavigation("MyType1")); + ResourceQuery resourceQuery = ResourceQuery.query("MyType1"); resourceQuery.with(new IdSelection("@1")); - List result = dao.doQuery(resourceQuery, new NoStrategyResourceVisitor()); + List result = dao.doQuery(resourceQuery); assertEquals(1, result.size()); assertEquals("@1", result.get(0).getId()); } @@ -98,10 +95,10 @@ public class InMemoryQueryTest { InMemoryResourceDao dao = new InMemoryResourceDao(); dao.saveAll(resources); - ResourceQuery resourceQuery = new ResourceQuery(new StrolchTypeNavigation("MyType2")); + ResourceQuery resourceQuery = ResourceQuery.query("MyType2"); resourceQuery.or().with(new IdSelection("@3"), new IdSelection("@4")); - List result = dao.doQuery(resourceQuery, new NoStrategyResourceVisitor()); + List result = dao.doQuery(resourceQuery); assertEquals(2, result.size()); assertEquals("@3", result.get(0).getId()); assertEquals("@4", result.get(1).getId()); @@ -114,10 +111,10 @@ public class InMemoryQueryTest { InMemoryResourceDao dao = new InMemoryResourceDao(); dao.saveAll(resources); - ResourceQuery resourceQuery = new ResourceQuery(new StrolchTypeNavigation("MyType2")); + ResourceQuery resourceQuery = ResourceQuery.query("MyType2"); resourceQuery.and().with(new IdSelection("@3"), new NameSelection("Res 3", es())); - List result = dao.doQuery(resourceQuery, new NoStrategyResourceVisitor()); + List result = dao.doQuery(resourceQuery); assertEquals(1, result.size()); assertEquals("@3", result.get(0).getId()); } @@ -129,10 +126,10 @@ public class InMemoryQueryTest { InMemoryResourceDao dao = new InMemoryResourceDao(); dao.saveAll(resources); - ResourceQuery resourceQuery = new ResourceQuery(new StrolchTypeNavigation("MyType1")); + ResourceQuery resourceQuery = ResourceQuery.query("MyType1"); resourceQuery.and().with(new IdSelection("@3"), new NameSelection("@4", es())); - List result = dao.doQuery(resourceQuery, new NoStrategyResourceVisitor()); + List result = dao.doQuery(resourceQuery); assertEquals(0, result.size()); } @@ -144,13 +141,13 @@ public class InMemoryQueryTest { InMemoryResourceDao dao = new InMemoryResourceDao(); dao.saveAll(resources); - ResourceQuery ballQuery = new ResourceQuery(new StrolchTypeNavigation("Ball")); + ResourceQuery ballQuery = ResourceQuery.query("Ball"); ballQuery.and().with( // stringSelection("parameters", "color", "red", es()), booleanSelection("parameters", "forChildren", true), floatSelection("parameters", "diameter", 22.0)); - List result = dao.doQuery(ballQuery, new NoStrategyResourceVisitor()); + List result = dao.doQuery(ballQuery); assertEquals(1, result.size()); } @@ -162,78 +159,78 @@ public class InMemoryQueryTest { InMemoryResourceDao dao = new InMemoryResourceDao(); dao.saveAll(resources); - ResourceQuery ballQuery; + ResourceQuery ballQuery; List result; // string list { - ballQuery = new ResourceQuery(new StrolchTypeNavigation("Ball")); + ballQuery = ResourceQuery.query("Ball"); ballQuery.and().with(stringListSelection("parameters", "stringListValues", Arrays.asList("a", "z"))); - result = dao.doQuery(ballQuery, new NoStrategyResourceVisitor()); + result = dao.doQuery(ballQuery); assertEquals(0, result.size()); - ballQuery = new ResourceQuery(new StrolchTypeNavigation("Ball")); + ballQuery = ResourceQuery.query("Ball"); ballQuery.and().with(stringListSelection("parameters", "stringListValues", Arrays.asList("a"))); - result = dao.doQuery(ballQuery, new NoStrategyResourceVisitor()); + result = dao.doQuery(ballQuery); assertEquals(1, result.size()); - ballQuery = new ResourceQuery(new StrolchTypeNavigation("Ball")); + ballQuery = ResourceQuery.query("Ball"); ballQuery.and().with(stringListSelection("parameters", "stringListValues", Arrays.asList("c", "b", "a"))); - result = dao.doQuery(ballQuery, new NoStrategyResourceVisitor()); + result = dao.doQuery(ballQuery); assertEquals(1, result.size()); } // integer list { - ballQuery = new ResourceQuery(new StrolchTypeNavigation("Ball")); + ballQuery = ResourceQuery.query("Ball"); ballQuery.and().with(integerListSelection("parameters", "intListValues", Arrays.asList(1, 5))); - result = dao.doQuery(ballQuery, new NoStrategyResourceVisitor()); + result = dao.doQuery(ballQuery); assertEquals(0, result.size()); - ballQuery = new ResourceQuery(new StrolchTypeNavigation("Ball")); + ballQuery = ResourceQuery.query("Ball"); ballQuery.and().with(integerListSelection("parameters", "intListValues", Arrays.asList(1))); - result = dao.doQuery(ballQuery, new NoStrategyResourceVisitor()); + result = dao.doQuery(ballQuery); assertEquals(1, result.size()); - ballQuery = new ResourceQuery(new StrolchTypeNavigation("Ball")); + ballQuery = ResourceQuery.query("Ball"); ballQuery.and().with(integerListSelection("parameters", "intListValues", Arrays.asList(3, 2, 1))); - result = dao.doQuery(ballQuery, new NoStrategyResourceVisitor()); + result = dao.doQuery(ballQuery); assertEquals(1, result.size()); } // float list { - ballQuery = new ResourceQuery(new StrolchTypeNavigation("Ball")); + ballQuery = ResourceQuery.query("Ball"); ballQuery.and().with(floatListSelection("parameters", "floatListValues", Arrays.asList(4.0, 8.0))); - result = dao.doQuery(ballQuery, new NoStrategyResourceVisitor()); + result = dao.doQuery(ballQuery); assertEquals(0, result.size()); - ballQuery = new ResourceQuery(new StrolchTypeNavigation("Ball")); + ballQuery = ResourceQuery.query("Ball"); ballQuery.and().with(floatListSelection("parameters", "floatListValues", Arrays.asList(4.0))); - result = dao.doQuery(ballQuery, new NoStrategyResourceVisitor()); + result = dao.doQuery(ballQuery); assertEquals(1, result.size()); - ballQuery = new ResourceQuery(new StrolchTypeNavigation("Ball")); + ballQuery = ResourceQuery.query("Ball"); ballQuery.and().with(floatListSelection("parameters", "floatListValues", Arrays.asList(6.2, 5.1, 4.0))); - result = dao.doQuery(ballQuery, new NoStrategyResourceVisitor()); + result = dao.doQuery(ballQuery); assertEquals(1, result.size()); } // long list { - ballQuery = new ResourceQuery(new StrolchTypeNavigation("Ball")); + ballQuery = ResourceQuery.query("Ball"); ballQuery.and().with(longListSelection("parameters", "longListValues", Arrays.asList(8L, 11L))); - result = dao.doQuery(ballQuery, new NoStrategyResourceVisitor()); + result = dao.doQuery(ballQuery); assertEquals(0, result.size()); - ballQuery = new ResourceQuery(new StrolchTypeNavigation("Ball")); + ballQuery = ResourceQuery.query("Ball"); ballQuery.and().with(longListSelection("parameters", "longListValues", Arrays.asList(8L))); - result = dao.doQuery(ballQuery, new NoStrategyResourceVisitor()); + result = dao.doQuery(ballQuery); assertEquals(1, result.size()); - ballQuery = new ResourceQuery(new StrolchTypeNavigation("Ball")); + ballQuery = ResourceQuery.query("Ball"); ballQuery.and().with(longListSelection("parameters", "longListValues", Arrays.asList(10L, 9L, 8L))); - result = dao.doQuery(ballQuery, new NoStrategyResourceVisitor()); + result = dao.doQuery(ballQuery); assertEquals(1, result.size()); } } @@ -245,11 +242,11 @@ public class InMemoryQueryTest { InMemoryResourceDao dao = new InMemoryResourceDao(); dao.saveAll(resources); - ResourceQuery ballQuery = new ResourceQuery(new StrolchTypeNavigation("Ball")); + ResourceQuery ballQuery = ResourceQuery.query("Ball"); ballQuery.and().with( // ParameterSelection.nullSelection("parameters", "color")); - List result = dao.doQuery(ballQuery, new NoStrategyResourceVisitor()); + List result = dao.doQuery(ballQuery); assertEquals(0, result.size()); } @@ -260,11 +257,11 @@ public class InMemoryQueryTest { InMemoryResourceDao dao = new InMemoryResourceDao(); dao.saveAll(resources); - ResourceQuery ballQuery = new ResourceQuery(new StrolchTypeNavigation("Ball")); + ResourceQuery ballQuery = ResourceQuery.query("Ball"); ballQuery.and().with( // ParameterSelection.nullSelection("parameters", "weight")); - List result = dao.doQuery(ballQuery, new NoStrategyResourceVisitor()); + List result = dao.doQuery(ballQuery); assertEquals(1, result.size()); } @@ -275,11 +272,11 @@ public class InMemoryQueryTest { InMemoryResourceDao dao = new InMemoryResourceDao(); dao.saveAll(resources); - ResourceQuery ballQuery = new ResourceQuery(new StrolchTypeNavigation("Ball")); + ResourceQuery ballQuery = ResourceQuery.query("Ball"); ballQuery.and().with( // ParameterSelection.nullSelection("parameters", "weight")); - List result = dao.doQuery(ballQuery, new NoStrategyResourceVisitor()); + List result = dao.doQuery(ballQuery); assertEquals(1, result.size()); } @@ -291,10 +288,10 @@ public class InMemoryQueryTest { InMemoryResourceDao dao = new InMemoryResourceDao(); dao.saveAll(resources); - ResourceQuery ballQuery = new ResourceQuery(new StrolchTypeNavigation("Ball")); + ResourceQuery ballQuery = ResourceQuery.query("Ball"); ballQuery.with(new NameSelection("ball ", ci())); - List result = dao.doQuery(ballQuery, new NoStrategyResourceVisitor()); + List result = dao.doQuery(ballQuery); assertEquals(1, result.size()); } diff --git a/li.strolch.agent/src/test/java/li/strolch/runtime/query/inmemory/QueryTest.java b/li.strolch.agent/src/test/java/li/strolch/runtime/query/inmemory/QueryTest.java index 944bea21f..737edb549 100644 --- a/li.strolch.agent/src/test/java/li/strolch/runtime/query/inmemory/QueryTest.java +++ b/li.strolch.agent/src/test/java/li/strolch/runtime/query/inmemory/QueryTest.java @@ -35,8 +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.visitor.NoStrategyOrderVisitor; -import li.strolch.model.visitor.NoStrategyResourceVisitor; import li.strolch.persistence.api.StrolchTransaction; import li.strolch.runtime.StrolchConstants; @@ -75,14 +73,14 @@ public class QueryTest { tx.commitOnClose(); } - ResourceQuery query = ResourceQuery.query("MyType"); + ResourceQuery query = ResourceQuery.query("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, new NoStrategyResourceVisitor()); + InMemoryQuery inMemoryQuery = resourceQuery.visit(query); List result; try (StrolchTransaction tx = container.getRealm(StrolchConstants.DEFAULT_REALM).openTx(certificate, "test")) { result = inMemoryQuery.doQuery(tx.getPersistenceHandler().getResourceDao(tx)); @@ -108,14 +106,14 @@ public class QueryTest { tx.commitOnClose(); } - OrderQuery query = OrderQuery.query("MyType"); + OrderQuery query = OrderQuery.query("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, new NoStrategyOrderVisitor()); + InMemoryQuery inMemoryQuery = orderQuery.visit(query); List result; try (StrolchTransaction tx = container.getRealm(StrolchConstants.DEFAULT_REALM).openTx(certificate, "test")) { result = inMemoryQuery.doQuery(tx.getPersistenceHandler().getOrderDao(tx)); @@ -139,7 +137,7 @@ public class QueryTest { tx.commitOnClose(); } - ResourceQuery query = ResourceQuery.query("MyType"); + ResourceQuery query = ResourceQuery.query("MyType"); query.and().with( ParameterSelection.stringSelection(BAG_ID, PARAM_STRING_ID, "olch", StringMatchMode.CONTAINS_CASE_SENSITIVE)); @@ -166,7 +164,7 @@ public class QueryTest { tx.commitOnClose(); } - ResourceQuery query = ResourceQuery.query("MyType"); + ResourceQuery query = ResourceQuery.query("MyType"); query.and().with( ParameterSelection.stringSelection(BAG_ID, PARAM_STRING_ID, "str", StringMatchMode.CONTAINS_CASE_SENSITIVE)); @@ -192,7 +190,7 @@ public class QueryTest { tx.commitOnClose(); } - ResourceQuery query = ResourceQuery.query("MyType"); + ResourceQuery query = ResourceQuery.query("MyType"); query.and().with( ParameterSelection.stringSelection(BAG_ID, PARAM_STRING_ID, "strolch", StringMatchMode.EQUALS_CASE_INSENSITIVE)); @@ -219,7 +217,7 @@ public class QueryTest { tx.commitOnClose(); } - ResourceQuery query = ResourceQuery.query("MyType"); + ResourceQuery query = ResourceQuery.query("MyType"); query.and().with( ParameterSelection.stringSelection(BAG_ID, PARAM_STRING_ID, "strolch", StringMatchMode.EQUALS_CASE_SENSITIVE)); @@ -248,7 +246,7 @@ public class QueryTest { } { - ResourceQuery query = ResourceQuery.query("MyType"); + ResourceQuery query = ResourceQuery.query("MyType"); query.not(new IdSelection("@1")); List result; try (StrolchTransaction tx = container.getRealm(StrolchConstants.DEFAULT_REALM).openTx(certificate, "test")) { @@ -259,7 +257,7 @@ public class QueryTest { } { - ResourceQuery query = ResourceQuery.query("MyType"); + ResourceQuery query = ResourceQuery.query("MyType"); query.not(new IdSelection("@2")); List result; try (StrolchTransaction tx = container.getRealm(StrolchConstants.DEFAULT_REALM).openTx(certificate, "test")) { @@ -270,7 +268,7 @@ public class QueryTest { } { - ResourceQuery query = ResourceQuery.query("MyType"); + ResourceQuery query = ResourceQuery.query("MyType"); query.not(new IdSelection("@1", "@2")); List result; try (StrolchTransaction tx = container.getRealm(StrolchConstants.DEFAULT_REALM).openTx(certificate, "test")) { diff --git a/li.strolch.model/src/main/java/li/strolch/model/audit/ActionSelection.java b/li.strolch.model/src/main/java/li/strolch/model/audit/ActionSelection.java index 6a85a9627..60c6ed1ca 100644 --- a/li.strolch.model/src/main/java/li/strolch/model/audit/ActionSelection.java +++ b/li.strolch.model/src/main/java/li/strolch/model/audit/ActionSelection.java @@ -26,7 +26,7 @@ public class ActionSelection extends AuditSelection { private StringSelection actionSelection; private AccessType[] accessTypes; - public ActionSelection(AuditQuery query) { + public ActionSelection(AuditQuery query) { super(query); } diff --git a/li.strolch.model/src/main/java/li/strolch/model/audit/AuditQuery.java b/li.strolch.model/src/main/java/li/strolch/model/audit/AuditQuery.java index 9970c2039..e5f5c5caf 100644 --- a/li.strolch.model/src/main/java/li/strolch/model/audit/AuditQuery.java +++ b/li.strolch.model/src/main/java/li/strolch/model/audit/AuditQuery.java @@ -23,23 +23,43 @@ import ch.eitchnet.utils.collections.DateRange; import ch.eitchnet.utils.dbc.DBC; /** + * + *

+ * The {@link AuditVisitor} is intended for situations where the query result should not be {@link Audit} but some other + * object type. For instance in a restful API, the result might have to be mapped to a POJO, thus using this method can + * perform the mapping step for you + *

+ * * @author Robert von Burg */ -public class AuditQuery implements StrolchQuery { +public class AuditQuery implements StrolchQuery { - private String elementTypeSelection; - private List selections; - private DateRange dateRange; - private long limit; + protected String elementTypeSelection; + protected List selections; + protected DateRange dateRange; + protected long limit; + protected AuditVisitor auditVisitor; - public AuditQuery(String elementTypeSelection, DateRange dateRange) { + public AuditQuery(AuditVisitor auditVisitor, String elementTypeSelection, DateRange dateRange) { + DBC.PRE.assertNotNull("auditVisitor", auditVisitor); DBC.PRE.assertNotEmpty("No elementTypeSelection (navigation) set!", elementTypeSelection); //$NON-NLS-1$ DBC.PRE.assertFalse("dateRange may not be unbounded!", dateRange.isUnbounded()); + this.auditVisitor = auditVisitor; this.elementTypeSelection = elementTypeSelection; this.dateRange = dateRange; this.selections = new ArrayList<>(); } + public AuditVisitor getAuditVisitor() { + return this.auditVisitor; + } + + public AuditQuery setAuditVisitor(AuditVisitor auditVisitor) { + DBC.PRE.assertNotNull("auditVisitor", auditVisitor); + this.auditVisitor = auditVisitor; + return this; + } + public String getElementTypeSelection() { return this.elementTypeSelection; } @@ -52,7 +72,7 @@ public class AuditQuery implements StrolchQuery { return limit; } - public AuditQuery limit(long limit) { + public AuditQuery limit(long limit) { this.limit = limit; return this; } @@ -97,4 +117,12 @@ public class AuditQuery implements StrolchQuery { public Object getPrivilegeValue() { return getClass().getName(); } + + public static AuditQuery query(String elementTypeSelection, DateRange dateRange) { + return new AuditQuery(new NoStrategyAuditVisitor(), elementTypeSelection, dateRange); + } + + public static AuditQuery query(String elementTypeSelection, DateRange dateRange, AuditVisitor orderVisitor) { + return new AuditQuery(orderVisitor, elementTypeSelection, dateRange); + } } diff --git a/li.strolch.model/src/main/java/li/strolch/model/audit/AuditQueryVisitor.java b/li.strolch.model/src/main/java/li/strolch/model/audit/AuditQueryVisitor.java index 03fc601de..c99c12268 100644 --- a/li.strolch.model/src/main/java/li/strolch/model/audit/AuditQueryVisitor.java +++ b/li.strolch.model/src/main/java/li/strolch/model/audit/AuditQueryVisitor.java @@ -26,5 +26,5 @@ public interface AuditQueryVisitor { public void visit(ActionSelection selection); - public void visit(AuditQuery auditQuery); + public void visit(AuditQuery auditQuery); } diff --git a/li.strolch.model/src/main/java/li/strolch/model/audit/AuditSelection.java b/li.strolch.model/src/main/java/li/strolch/model/audit/AuditSelection.java index f2e1cae63..eae1f1643 100644 --- a/li.strolch.model/src/main/java/li/strolch/model/audit/AuditSelection.java +++ b/li.strolch.model/src/main/java/li/strolch/model/audit/AuditSelection.java @@ -20,14 +20,14 @@ package li.strolch.model.audit; */ public abstract class AuditSelection { - private AuditQuery query; + private AuditQuery query; - public AuditSelection(AuditQuery query) { + public AuditSelection(AuditQuery query) { super(); this.query = query; } - public AuditQuery query() { + public AuditQuery query() { return this.query; } diff --git a/li.strolch.model/src/main/java/li/strolch/model/audit/ElementSelection.java b/li.strolch.model/src/main/java/li/strolch/model/audit/ElementSelection.java index ad2e3517e..b24014aaa 100644 --- a/li.strolch.model/src/main/java/li/strolch/model/audit/ElementSelection.java +++ b/li.strolch.model/src/main/java/li/strolch/model/audit/ElementSelection.java @@ -26,7 +26,7 @@ public class ElementSelection extends AuditSelection { private StringSelection elementSubTypeSelection; private StringSelection elementAccessedSelection; - public ElementSelection(AuditQuery query) { + public ElementSelection(AuditQuery query) { super(query); } diff --git a/li.strolch.model/src/main/java/li/strolch/model/audit/IdentitySelection.java b/li.strolch.model/src/main/java/li/strolch/model/audit/IdentitySelection.java index 899442ff6..0c6e88689 100644 --- a/li.strolch.model/src/main/java/li/strolch/model/audit/IdentitySelection.java +++ b/li.strolch.model/src/main/java/li/strolch/model/audit/IdentitySelection.java @@ -27,7 +27,7 @@ public class IdentitySelection extends AuditSelection { private StringSelection firstnameSelection; private StringSelection lastnameSelection; - public IdentitySelection(AuditQuery query) { + public IdentitySelection(AuditQuery query) { super(query); } diff --git a/li.strolch.model/src/main/java/li/strolch/model/query/ActivityQuery.java b/li.strolch.model/src/main/java/li/strolch/model/query/ActivityQuery.java index 8ec8c16dd..42b3d3b96 100644 --- a/li.strolch.model/src/main/java/li/strolch/model/query/ActivityQuery.java +++ b/li.strolch.model/src/main/java/li/strolch/model/query/ActivityQuery.java @@ -18,49 +18,101 @@ package li.strolch.model.query; import li.strolch.model.ActivityVisitor; import li.strolch.model.activity.Action; import li.strolch.model.activity.Activity; +import li.strolch.model.query.ordering.StrolchQueryOrdering; +import li.strolch.model.visitor.NoStrategyActivityVisitor; +import ch.eitchnet.utils.dbc.DBC; /** + *

* {@link ActivityQuery} is the user API to query {@link Activity Activities} in Strolch. The {@link Navigation} is used * to navigate to a type of activity on which any further {@link Selection Selections} will be performed. The * {@link ActivityVisitor} is used to transform the returned object into a domain specific object (if required). This * mechanism allows you to query e.g. a specific {@link Action} instead of having to return all the elements and then * performing this transformation. + *

+ * + *

+ * The {@link ActivityVisitor} is intended for situations where the query result should not be {@link Activity} but some + * other object type. For instance in a restful API, the result might have to be mapped to a POJO, thus using this + * method can perform the mapping step for you + *

+ * + * @param + * defines the return type of this query. Depending on the user {@link ActivityVisitor} this query can return + * an {@link Activity}, or any type of object to which the visitor mapped the activity * * @author Robert von Burg */ -public class ActivityQuery extends StrolchElementQuery { +public class ActivityQuery extends StrolchElementQuery { + + protected ActivityVisitor activityVisitor; + protected StrolchQueryOrdering ordering; - /** - * @param navigation - * @param elementVisitor - */ public ActivityQuery(Navigation navigation) { super(navigation); } + public ActivityVisitor getActivityVisitor() { + return this.activityVisitor; + } + + public ActivityQuery setActivityVisitor(ActivityVisitor activityVisitor) { + DBC.PRE.assertNotNull("activityVisitor", activityVisitor); + this.activityVisitor = activityVisitor; + return this; + } + + public StrolchQueryOrdering getOrdering() { + return this.ordering; + } + + public ActivityQuery setOrdering(StrolchQueryOrdering ordering) { + this.ordering = ordering; + return this; + } + @Override - public ActivityQuery with(Selection selection) { + public ActivityQuery with(Selection selection) { super.with(selection); return this; } @Override - public ActivityQuery not(Selection selection) { + public ActivityQuery not(Selection selection) { super.not(selection); return this; } @Override - public ActivityQuery withAny() { + public ActivityQuery withAny() { super.withAny(); return this; } - public static ActivityQuery query(Navigation navigation) { - return new ActivityQuery(navigation); + @Override + public void accept(ActivityQueryVisitor visitor) { + super.accept(visitor); + if (this.ordering != null) + this.ordering.accept(visitor); } - public static ActivityQuery query(String type) { - return new ActivityQuery(new StrolchTypeNavigation(type)); + public static ActivityQuery query(String type) { + return new ActivityQuery(new StrolchTypeNavigation(type)) + .setActivityVisitor(new NoStrategyActivityVisitor()); + } + + public static ActivityQuery query(String type, StrolchQueryOrdering ordering) { + return new ActivityQuery(new StrolchTypeNavigation(type)).setActivityVisitor( + new NoStrategyActivityVisitor()).setOrdering(ordering); + } + + public static ActivityQuery query(String type, ActivityVisitor activityVisitor) { + return new ActivityQuery(new StrolchTypeNavigation(type)).setActivityVisitor(activityVisitor); + } + + public static ActivityQuery query(String type, ActivityVisitor activityVisitor, + StrolchQueryOrdering ordering) { + return new ActivityQuery(new StrolchTypeNavigation(type)).setActivityVisitor(activityVisitor).setOrdering( + ordering); } } diff --git a/li.strolch.model/src/main/java/li/strolch/model/query/ActivityQueryVisitor.java b/li.strolch.model/src/main/java/li/strolch/model/query/ActivityQueryVisitor.java index 56540f8a4..4f8a12fec 100644 --- a/li.strolch.model/src/main/java/li/strolch/model/query/ActivityQueryVisitor.java +++ b/li.strolch.model/src/main/java/li/strolch/model/query/ActivityQueryVisitor.java @@ -15,10 +15,13 @@ */ package li.strolch.model.query; +import li.strolch.model.query.ordering.StrolchQueryOrderingVisitor; + /** * @author Robert von Burg */ -public interface ActivityQueryVisitor extends StrolchRootElementSelectionVisitor, ParameterSelectionVisitor { +public interface ActivityQueryVisitor extends StrolchRootElementSelectionVisitor, ParameterSelectionVisitor, + StrolchQueryOrderingVisitor { // marker interface } diff --git a/li.strolch.model/src/main/java/li/strolch/model/query/OrderQuery.java b/li.strolch.model/src/main/java/li/strolch/model/query/OrderQuery.java index b7d3347c9..7ea8c78a6 100644 --- a/li.strolch.model/src/main/java/li/strolch/model/query/OrderQuery.java +++ b/li.strolch.model/src/main/java/li/strolch/model/query/OrderQuery.java @@ -18,45 +18,99 @@ package li.strolch.model.query; import li.strolch.model.Order; import li.strolch.model.OrderVisitor; import li.strolch.model.parameter.Parameter; +import li.strolch.model.query.ordering.StrolchQueryOrdering; +import li.strolch.model.visitor.NoStrategyOrderVisitor; +import ch.eitchnet.utils.dbc.DBC; /** + *

* {@link OrderQuery} is the user API to query {@link Order Orders} in Strolch. The {@link Navigation} is used to * navigate to a type of order on which any further {@link Selection Selections} will be performed. The * {@link OrderVisitor} is used to transform the returned object into a domain specific object (if required). This * mechanism allows you to query only the values of a {@link Parameter} instead of having to return all the elements and * then performing this transformation. + *

+ * + *

+ * The {@link OrderVisitor} is intended for situations where the query result should not be {@link Order} but some other + * object type. For instance in a restful API, the result might have to be mapped to a POJO, thus using this method can + * perform the mapping step for you + *

+ * + * @param + * defines the return type of this query. Depending on the user {@link OrderVisitor} this query can return an + * {@link Order}, or any type of object to which the visitor mapped the order * * @author Robert von Burg */ -public class OrderQuery extends StrolchElementQuery { +public class OrderQuery extends StrolchElementQuery { + + protected OrderVisitor orderVisitor; + protected StrolchQueryOrdering ordering; public OrderQuery(Navigation navigation) { super(navigation); } + public OrderVisitor getOrderVisitor() { + return this.orderVisitor; + } + + public OrderQuery setOrderVisitor(OrderVisitor orderVisitor) { + DBC.PRE.assertNotNull("orderVisitor", orderVisitor); + this.orderVisitor = orderVisitor; + return this; + } + + public StrolchQueryOrdering getOrdering() { + return this.ordering; + } + + public OrderQuery setOrdering(StrolchQueryOrdering ordering) { + this.ordering = ordering; + return this; + } + @Override - public OrderQuery with(Selection selection) { + public OrderQuery with(Selection selection) { super.with(selection); return this; } @Override - public OrderQuery not(Selection selection) { + public OrderQuery not(Selection selection) { super.not(selection); return this; } @Override - public OrderQuery withAny() { + public OrderQuery withAny() { super.withAny(); return this; } - public static OrderQuery query(Navigation navigation) { - return new OrderQuery(navigation); + @Override + public void accept(OrderQueryVisitor visitor) { + DBC.PRE.assertNotNull("orderVisitor", this.orderVisitor); + super.accept(visitor); + if (this.ordering != null) + this.ordering.accept(visitor); } - public static OrderQuery query(String type) { - return new OrderQuery(new StrolchTypeNavigation(type)); + public static OrderQuery query(String type) { + return new OrderQuery(new StrolchTypeNavigation(type)).setOrderVisitor(new NoStrategyOrderVisitor()); + } + + public static OrderQuery query(String type, StrolchQueryOrdering ordering) { + return new OrderQuery(new StrolchTypeNavigation(type)).setOrderVisitor(new NoStrategyOrderVisitor()) + .setOrdering(ordering); + } + + public static OrderQuery query(String type, OrderVisitor orderVisitor) { + return new OrderQuery(new StrolchTypeNavigation(type)).setOrderVisitor(orderVisitor); + } + + public static OrderQuery query(String type, OrderVisitor orderVisitor, StrolchQueryOrdering ordering) { + return new OrderQuery(new StrolchTypeNavigation(type)).setOrdering(ordering).setOrderVisitor(orderVisitor); } } diff --git a/li.strolch.model/src/main/java/li/strolch/model/query/OrderQueryVisitor.java b/li.strolch.model/src/main/java/li/strolch/model/query/OrderQueryVisitor.java index 91196a0f3..313555197 100644 --- a/li.strolch.model/src/main/java/li/strolch/model/query/OrderQueryVisitor.java +++ b/li.strolch.model/src/main/java/li/strolch/model/query/OrderQueryVisitor.java @@ -15,11 +15,13 @@ */ package li.strolch.model.query; +import li.strolch.model.query.ordering.StrolchQueryOrderingVisitor; + /** * @author Robert von Burg - * */ -public interface OrderQueryVisitor extends OrderSelectionVisitor, ParameterSelectionVisitor { +public interface OrderQueryVisitor extends OrderSelectionVisitor, ParameterSelectionVisitor, + StrolchQueryOrderingVisitor { // marker interface } diff --git a/li.strolch.model/src/main/java/li/strolch/model/query/ResourceQuery.java b/li.strolch.model/src/main/java/li/strolch/model/query/ResourceQuery.java index 900d2659a..63b027e37 100644 --- a/li.strolch.model/src/main/java/li/strolch/model/query/ResourceQuery.java +++ b/li.strolch.model/src/main/java/li/strolch/model/query/ResourceQuery.java @@ -18,49 +18,102 @@ package li.strolch.model.query; import li.strolch.model.Resource; import li.strolch.model.ResourceVisitor; import li.strolch.model.parameter.Parameter; +import li.strolch.model.query.ordering.StrolchQueryOrdering; +import li.strolch.model.visitor.NoStrategyResourceVisitor; +import ch.eitchnet.utils.dbc.DBC; /** + *

* {@link ResourceQuery} is the user API to query {@link Resource Resources} in Strolch. The {@link Navigation} is used * to navigate to a type of resource on which any further {@link Selection Selections} will be performed. The * {@link ResourceVisitor} is used to transform the returned object into a domain specific object (if required). This * mechanism allows you to query only the values of a {@link Parameter} instead of having to return all the elements and * then performing this transformation. + *

+ * + *

+ * The {@link ResourceVisitor} is intended for situations where the query result should not be {@link Resource} but some + * other object type. For instance in a restful API, the result might have to be mapped to a POJO, thus using this + * method can perform the mapping step for you + *

+ * + * @param + * defines the return type of this query. Depending on the user {@link ResourceVisitor} this query can return + * a {@link Resource}, or any type of object to which the visitor mapped the resource * * @author Robert von Burg */ -public class ResourceQuery extends StrolchElementQuery { +public class ResourceQuery extends StrolchElementQuery { + + protected ResourceVisitor resourceVisitor; + protected StrolchQueryOrdering ordering; - /** - * @param navigation - * @param elementVisitor - */ public ResourceQuery(Navigation navigation) { super(navigation); } + public ResourceVisitor getResourceVisitor() { + return this.resourceVisitor; + } + + public ResourceQuery setResourceVisitor(ResourceVisitor resourceVisitor) { + DBC.PRE.assertNotNull("resourceVisitor", resourceVisitor); + this.resourceVisitor = resourceVisitor; + return this; + } + + public StrolchQueryOrdering getOrdering() { + return this.ordering; + } + + public ResourceQuery setOrdering(StrolchQueryOrdering ordering) { + this.ordering = ordering; + return this; + } + @Override - public ResourceQuery with(Selection selection) { + public ResourceQuery with(Selection selection) { super.with(selection); return this; } @Override - public ResourceQuery not(Selection selection) { + public ResourceQuery not(Selection selection) { super.not(selection); return this; } @Override - public ResourceQuery withAny() { + public ResourceQuery withAny() { super.withAny(); return this; } - public static ResourceQuery query(Navigation navigation) { - return new ResourceQuery(navigation); + @Override + public void accept(ResourceQueryVisitor visitor) { + DBC.PRE.assertNotNull("resourceVisitor", this.resourceVisitor); + super.accept(visitor); + if (this.ordering != null) + this.ordering.accept(visitor); } - public static ResourceQuery query(String type) { - return new ResourceQuery(new StrolchTypeNavigation(type)); + public static ResourceQuery query(String type) { + return new ResourceQuery(new StrolchTypeNavigation(type)) + .setResourceVisitor(new NoStrategyResourceVisitor()); + } + + public static ResourceQuery query(String type, StrolchQueryOrdering ordering) { + return new ResourceQuery(new StrolchTypeNavigation(type)).setResourceVisitor( + new NoStrategyResourceVisitor()).setOrdering(ordering); + } + + public static ResourceQuery query(String type, ResourceVisitor resourceVisitor) { + return new ResourceQuery(new StrolchTypeNavigation(type)).setResourceVisitor(resourceVisitor); + } + + public static ResourceQuery query(String type, ResourceVisitor resourceVisitor, + StrolchQueryOrdering ordering) { + return new ResourceQuery(new StrolchTypeNavigation(type)).setResourceVisitor(resourceVisitor).setOrdering( + ordering); } } diff --git a/li.strolch.model/src/main/java/li/strolch/model/query/ResourceQueryVisitor.java b/li.strolch.model/src/main/java/li/strolch/model/query/ResourceQueryVisitor.java index 867e0b344..0badac2b9 100644 --- a/li.strolch.model/src/main/java/li/strolch/model/query/ResourceQueryVisitor.java +++ b/li.strolch.model/src/main/java/li/strolch/model/query/ResourceQueryVisitor.java @@ -15,10 +15,13 @@ */ package li.strolch.model.query; +import li.strolch.model.query.ordering.StrolchQueryOrderingVisitor; + /** * @author Robert von Burg */ -public interface ResourceQueryVisitor extends StrolchRootElementSelectionVisitor, ParameterSelectionVisitor { +public interface ResourceQueryVisitor extends StrolchRootElementSelectionVisitor, ParameterSelectionVisitor, + StrolchQueryOrderingVisitor { // marker interface } diff --git a/li.strolch.model/src/main/java/li/strolch/model/query/StrolchTypeNavigation.java b/li.strolch.model/src/main/java/li/strolch/model/query/StrolchTypeNavigation.java index 99d216dbb..026209047 100644 --- a/li.strolch.model/src/main/java/li/strolch/model/query/StrolchTypeNavigation.java +++ b/li.strolch.model/src/main/java/li/strolch/model/query/StrolchTypeNavigation.java @@ -15,6 +15,8 @@ */ package li.strolch.model.query; +import ch.eitchnet.utils.dbc.DBC; + /** * @author Robert von Burg */ @@ -23,6 +25,7 @@ public class StrolchTypeNavigation implements Navigation { private String type; public StrolchTypeNavigation(String type) { + DBC.PRE.assertNotEmpty("type", type); this.type = type; } diff --git a/li.strolch.model/src/main/java/li/strolch/model/query/ordering/ByIdComparator.java b/li.strolch.model/src/main/java/li/strolch/model/query/ordering/ByIdComparator.java new file mode 100644 index 000000000..03633df2c --- /dev/null +++ b/li.strolch.model/src/main/java/li/strolch/model/query/ordering/ByIdComparator.java @@ -0,0 +1,25 @@ +/* + * Copyright 2013 Robert von Burg + */ +package li.strolch.model.query.ordering; + +import java.util.Comparator; + +import li.strolch.model.GroupedParameterizedElement; + +/** + * @author Robert von Burg + */ +public class ByIdComparator implements Comparator { + + private boolean ascending; + + public ByIdComparator(boolean ascending) { + this.ascending = ascending; + } + + @Override + public int compare(T o1, T o2) { + return this.ascending ? o1.getId().compareTo(o2.getId()) : o2.getId().compareTo(o1.getId()); + } +} diff --git a/li.strolch.model/src/main/java/li/strolch/model/query/ordering/ByNameComparator.java b/li.strolch.model/src/main/java/li/strolch/model/query/ordering/ByNameComparator.java new file mode 100644 index 000000000..fccf768be --- /dev/null +++ b/li.strolch.model/src/main/java/li/strolch/model/query/ordering/ByNameComparator.java @@ -0,0 +1,25 @@ +/* + * Copyright 2013 Robert von Burg + */ +package li.strolch.model.query.ordering; + +import java.util.Comparator; + +import li.strolch.model.GroupedParameterizedElement; + +/** + * @author Robert von Burg + */ +public class ByNameComparator implements Comparator { + + private boolean ascending; + + public ByNameComparator(boolean ascending) { + this.ascending = ascending; + } + + @Override + public int compare(T o1, T o2) { + return this.ascending ? o1.getName().compareTo(o2.getName()) : o2.getName().compareTo(o1.getName()); + } +} diff --git a/li.strolch.model/src/main/java/li/strolch/model/query/ordering/ByParamComparator.java b/li.strolch.model/src/main/java/li/strolch/model/query/ordering/ByParamComparator.java new file mode 100644 index 000000000..175eced36 --- /dev/null +++ b/li.strolch.model/src/main/java/li/strolch/model/query/ordering/ByParamComparator.java @@ -0,0 +1,42 @@ +/* + * Copyright 2013 Robert von Burg + */ +package li.strolch.model.query.ordering; + +import java.util.Comparator; + +import li.strolch.exception.StrolchException; +import li.strolch.model.GroupedParameterizedElement; +import li.strolch.model.parameter.Parameter; + +/** + * @author Robert von Burg + */ +public class ByParamComparator implements Comparator { + + private String bagKey; + private String paramKey; + private boolean ascending; + + public ByParamComparator(String bagKey, String paramKey, boolean ascending) { + this.bagKey = bagKey; + this.paramKey = paramKey; + this.ascending = ascending; + } + + @Override + public int compare(T o1, T o2) { + + Parameter param1 = o1.getParameter(bagKey, paramKey); + if (param1 == null) + throw new StrolchException("Sorting parameter bag=" + bagKey + ", param=" + paramKey + + " does not exist on " + o1.getLocator()); + + Parameter param2 = o2.getParameter(bagKey, paramKey); + if (param2 == null) + throw new StrolchException("Sorting parameter bag=" + bagKey + ", param=" + paramKey + + " does not exist on " + o2.getLocator()); + + return this.ascending ? param1.compareTo(param2) : param2.compareTo(param1); + } +} diff --git a/li.strolch.model/src/main/java/li/strolch/model/query/ordering/OrderById.java b/li.strolch.model/src/main/java/li/strolch/model/query/ordering/OrderById.java new file mode 100644 index 000000000..16997388f --- /dev/null +++ b/li.strolch.model/src/main/java/li/strolch/model/query/ordering/OrderById.java @@ -0,0 +1,44 @@ +/* + * Copyright 2015 Robert von Burg + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package li.strolch.model.query.ordering; + +/** + * @author Robert von Burg + */ +public class OrderById extends StrolchQueryOrdering { + + /** + * Creates this ordering with ascending order + */ + public OrderById() { + super(true); + } + + /** + * Creates this ordering the given ascending order + * + * @param ascending + * true for ascending, false for descending order + */ + public OrderById(boolean ascending) { + super(ascending); + } + + @Override + public void accept(StrolchQueryOrderingVisitor visitor) { + visitor.visit(this); + } +} diff --git a/li.strolch.model/src/main/java/li/strolch/model/query/ordering/OrderByName.java b/li.strolch.model/src/main/java/li/strolch/model/query/ordering/OrderByName.java new file mode 100644 index 000000000..5f55003f3 --- /dev/null +++ b/li.strolch.model/src/main/java/li/strolch/model/query/ordering/OrderByName.java @@ -0,0 +1,44 @@ +/* + * Copyright 2015 Robert von Burg + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package li.strolch.model.query.ordering; + +/** + * @author Robert von Burg + */ +public class OrderByName extends StrolchQueryOrdering { + + /** + * Creates this ordering with ascending order + */ + public OrderByName() { + super(true); + } + + /** + * Creates this ordering the given ascending order + * + * @param ascending + * true for ascending, false for descending order + */ + public OrderByName(boolean ascending) { + super(ascending); + } + + @Override + public void accept(StrolchQueryOrderingVisitor visitor) { + visitor.visit(this); + } +} diff --git a/li.strolch.model/src/main/java/li/strolch/model/query/ordering/OrderByParameter.java b/li.strolch.model/src/main/java/li/strolch/model/query/ordering/OrderByParameter.java new file mode 100644 index 000000000..1dd8e621c --- /dev/null +++ b/li.strolch.model/src/main/java/li/strolch/model/query/ordering/OrderByParameter.java @@ -0,0 +1,71 @@ +/* + * Copyright 2015 Robert von Burg + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package li.strolch.model.query.ordering; + +import li.strolch.model.ParameterBag; +import li.strolch.model.parameter.Parameter; + +/** + * @author Robert von Burg + */ +public class OrderByParameter extends StrolchQueryOrdering { + + private String bagKey; + private String paramKey; + + /** + * Creates this ordering with the given bagKey and paramKey with ascending order + * + * @param bagKey + * the {@link ParameterBag} in which to retrieve the {@link Parameter} for ordering + * @param paramKey + * the {@link Parameter} with which to order + */ + public OrderByParameter(String bagKey, String paramKey) { + super(true); + this.bagKey = bagKey; + this.paramKey = paramKey; + } + + /** + * Creates this ordering with the given bagKey and paramKey and ascending order + * + * @param ascending + * true for ascending, false for descending order + * @param bagKey + * the {@link ParameterBag} in which to retrieve the {@link Parameter} for ordering + * @param paramKey + * the {@link Parameter} with which to order + */ + public OrderByParameter(boolean ascending, String bagKey, String paramKey) { + super(ascending); + this.bagKey = bagKey; + this.paramKey = paramKey; + } + + public String getBagKey() { + return this.bagKey; + } + + public String getParamKey() { + return this.paramKey; + } + + @Override + public void accept(StrolchQueryOrderingVisitor visitor) { + visitor.visit(this); + } +} diff --git a/li.strolch.model/src/main/java/li/strolch/model/query/ordering/StrolchQueryOrdering.java b/li.strolch.model/src/main/java/li/strolch/model/query/ordering/StrolchQueryOrdering.java new file mode 100644 index 000000000..03e3b2f6d --- /dev/null +++ b/li.strolch.model/src/main/java/li/strolch/model/query/ordering/StrolchQueryOrdering.java @@ -0,0 +1,38 @@ +/* + * Copyright 2015 Robert von Burg + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package li.strolch.model.query.ordering; + +/** + * @author Robert von Burg + */ +public abstract class StrolchQueryOrdering { + + private boolean ascending; + + public StrolchQueryOrdering(boolean ascending) { + this.ascending = ascending; + } + + public boolean isAscending() { + return this.ascending; + } + + public void setAscending(boolean ascending) { + this.ascending = ascending; + } + + public abstract void accept(StrolchQueryOrderingVisitor visitor); +} diff --git a/li.strolch.model/src/main/java/li/strolch/model/query/ordering/StrolchQueryOrderingVisitor.java b/li.strolch.model/src/main/java/li/strolch/model/query/ordering/StrolchQueryOrderingVisitor.java new file mode 100644 index 000000000..76f0bd9e2 --- /dev/null +++ b/li.strolch.model/src/main/java/li/strolch/model/query/ordering/StrolchQueryOrderingVisitor.java @@ -0,0 +1,28 @@ +/* + * Copyright 2015 Robert von Burg + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package li.strolch.model.query.ordering; + +/** + * @author Robert von Burg + */ +public interface StrolchQueryOrderingVisitor { + + public StrolchQueryOrderingVisitor visit(OrderById orderById); + + public StrolchQueryOrderingVisitor visit(OrderByName orderByName); + + public StrolchQueryOrderingVisitor visit(OrderByParameter orderByParameter); +} diff --git a/li.strolch.performancetest/src/test/java/li/strolch/performance/PerformanceTestService.java b/li.strolch.performancetest/src/test/java/li/strolch/performance/PerformanceTestService.java index 3823770dc..2212ffd1b 100644 --- a/li.strolch.performancetest/src/test/java/li/strolch/performance/PerformanceTestService.java +++ b/li.strolch.performancetest/src/test/java/li/strolch/performance/PerformanceTestService.java @@ -81,7 +81,7 @@ public class PerformanceTestService extends AbstractService implements Ac } @Override - public List doQuery(ActivityQuery query, ActivityVisitor activityVisitor) { + public List doQuery(ActivityQuery query) { PostgreSqlActivityQueryVisitor queryVisitor = new PostgreSqlActivityQueryVisitor("id, asxml"); query.accept(queryVisitor); @@ -167,7 +166,7 @@ public class PostgreSqlActivityDao extends PostgresqlDao implements Ac String id = result.getString("id"); SQLXML sqlxml = result.getSQLXML("asxml"); Activity t = parseFromXml(id, queryVisitor.getType(), sqlxml); - list.add(activityVisitor.visit(t)); + list.add(query.getActivityVisitor().visit(t)); } } } catch (SQLException e) { diff --git a/li.strolch.persistence.postgresql/src/main/java/li/strolch/persistence/postgresql/PostgreSqlAuditDao.java b/li.strolch.persistence.postgresql/src/main/java/li/strolch/persistence/postgresql/PostgreSqlAuditDao.java index fc0251cd6..93094c74a 100644 --- a/li.strolch.persistence.postgresql/src/main/java/li/strolch/persistence/postgresql/PostgreSqlAuditDao.java +++ b/li.strolch.persistence.postgresql/src/main/java/li/strolch/persistence/postgresql/PostgreSqlAuditDao.java @@ -29,7 +29,6 @@ import java.util.Set; import li.strolch.model.audit.AccessType; import li.strolch.model.audit.Audit; import li.strolch.model.audit.AuditQuery; -import li.strolch.model.audit.AuditVisitor; import li.strolch.persistence.api.AuditDao; import li.strolch.persistence.api.StrolchPersistenceException; import ch.eitchnet.utils.collections.DateRange; @@ -293,7 +292,7 @@ public class PostgreSqlAuditDao implements AuditDao { } @Override - public List doQuery(AuditQuery query, AuditVisitor auditVisitor) { + public List doQuery(AuditQuery query) { PostgreSqlAuditQueryVisitor queryVisitor = new PostgreSqlAuditQueryVisitor(FIELDS); query.accept(queryVisitor); diff --git a/li.strolch.persistence.postgresql/src/main/java/li/strolch/persistence/postgresql/PostgreSqlAuditQueryVisitor.java b/li.strolch.persistence.postgresql/src/main/java/li/strolch/persistence/postgresql/PostgreSqlAuditQueryVisitor.java index 56c1d31dc..f3be5d0df 100644 --- a/li.strolch.persistence.postgresql/src/main/java/li/strolch/persistence/postgresql/PostgreSqlAuditQueryVisitor.java +++ b/li.strolch.persistence.postgresql/src/main/java/li/strolch/persistence/postgresql/PostgreSqlAuditQueryVisitor.java @@ -77,7 +77,7 @@ public class PostgreSqlAuditQueryVisitor implements AuditQueryVisitor { } @Override - public void visit(AuditQuery auditQuery) { + public void visit(AuditQuery auditQuery) { ensureAnd(); this.sb.append(this.indent); this.sb.append(PostgreSqlAuditDao.ELEMENT_TYPE); diff --git a/li.strolch.persistence.postgresql/src/main/java/li/strolch/persistence/postgresql/PostgreSqlOrderDao.java b/li.strolch.persistence.postgresql/src/main/java/li/strolch/persistence/postgresql/PostgreSqlOrderDao.java index 1f8c3770b..f6a1d11c9 100644 --- a/li.strolch.persistence.postgresql/src/main/java/li/strolch/persistence/postgresql/PostgreSqlOrderDao.java +++ b/li.strolch.persistence.postgresql/src/main/java/li/strolch/persistence/postgresql/PostgreSqlOrderDao.java @@ -33,7 +33,6 @@ import javax.xml.parsers.SAXParserFactory; import javax.xml.transform.sax.SAXResult; import li.strolch.model.Order; -import li.strolch.model.OrderVisitor; import li.strolch.model.Tags; import li.strolch.model.query.OrderQuery; import li.strolch.model.xml.OrderToSaxVisitor; @@ -157,7 +156,7 @@ public class PostgreSqlOrderDao extends PostgresqlDao implements OrderDao } @Override - public List doQuery(OrderQuery query, OrderVisitor orderVisitor) { + public List doQuery(OrderQuery query) { PostgreSqlOrderQueryVisitor queryVisitor = new PostgreSqlOrderQueryVisitor("id, asxml"); query.accept(queryVisitor); @@ -174,7 +173,7 @@ public class PostgreSqlOrderDao extends PostgresqlDao implements OrderDao String id = result.getString("id"); SQLXML sqlxml = result.getSQLXML("asxml"); Order t = parseFromXml(id, queryVisitor.getType(), sqlxml); - list.add(orderVisitor.visit(t)); + list.add(query.getOrderVisitor().visit(t)); } } } catch (SQLException e) { diff --git a/li.strolch.persistence.postgresql/src/main/java/li/strolch/persistence/postgresql/PostgreSqlQueryVisitor.java b/li.strolch.persistence.postgresql/src/main/java/li/strolch/persistence/postgresql/PostgreSqlQueryVisitor.java index 460b67d2e..221c05e26 100644 --- a/li.strolch.persistence.postgresql/src/main/java/li/strolch/persistence/postgresql/PostgreSqlQueryVisitor.java +++ b/li.strolch.persistence.postgresql/src/main/java/li/strolch/persistence/postgresql/PostgreSqlQueryVisitor.java @@ -47,17 +47,24 @@ import li.strolch.model.query.ParameterSelectionVisitor; import li.strolch.model.query.Selection; import li.strolch.model.query.StrolchRootElementSelectionVisitor; import li.strolch.model.query.StrolchTypeNavigation; +import li.strolch.model.query.ordering.OrderById; +import li.strolch.model.query.ordering.OrderByName; +import li.strolch.model.query.ordering.OrderByParameter; +import li.strolch.model.query.ordering.StrolchQueryOrderingVisitor; import ch.eitchnet.utils.StringMatchMode; import ch.eitchnet.utils.dbc.DBC; +import ch.eitchnet.utils.helper.StringHelper; import ch.eitchnet.utils.iso8601.ISO8601FormatFactory; /** * @author Robert von Burg */ -public abstract class PostgreSqlQueryVisitor implements StrolchRootElementSelectionVisitor, ParameterSelectionVisitor { +public abstract class PostgreSqlQueryVisitor implements StrolchRootElementSelectionVisitor, ParameterSelectionVisitor, + StrolchQueryOrderingVisitor { protected StringBuilder sql; protected StringBuilder sb; + protected String ordering; protected String type; protected List values; protected boolean any; @@ -70,9 +77,9 @@ public abstract class PostgreSqlQueryVisitor implements StrolchRootElementSelect this.sb = new StringBuilder(); this.values = new ArrayList<>(); - this.sql.append("select "); + this.sql.append("SELECT "); this.sql.append(fields); - this.sql.append("\nfrom\n"); + this.sql.append("\nFROM\n"); this.sql.append(" "); this.sql.append(getTableName()); this.indent = " "; @@ -82,22 +89,32 @@ public abstract class PostgreSqlQueryVisitor implements StrolchRootElementSelect if (this.sqlAsString != null) return this.sqlAsString; - this.sql.append("\nwhere\n"); + this.sql.append("\nWHERE\n"); this.sql.append(this.indent); if (this.any) { this.sql.append("type = ?"); + appendOrdering(); this.sqlAsString = this.sql.toString(); return this.sqlAsString; } - this.sql.append("type = ? and\n"); - + this.sql.append("type = ? AND\n"); this.sql.append(this.sb.toString()); + + appendOrdering(); + this.sqlAsString = this.sql.toString(); return this.sqlAsString; } + private void appendOrdering() { + if (StringHelper.isNotEmpty(this.ordering)) { + this.sql.append("\n"); + this.sql.append(this.ordering); + } + } + /** * @return the any */ @@ -133,7 +150,7 @@ public abstract class PostgreSqlQueryVisitor implements StrolchRootElementSelect this.sb.append("id = ?\n"); this.values.add(ids.get(0)); } else { - this.sb.append("id in ("); + this.sb.append("id IN ("); Iterator iter = ids.iterator(); while (iter.hasNext()) { String id = iter.next(); @@ -172,7 +189,7 @@ public abstract class PostgreSqlQueryVisitor implements StrolchRootElementSelect selection.accept(this); if (iter.hasNext()) { this.sb.append(indent); - this.sb.append("and\n"); + this.sb.append("AND\n"); } } this.indent = indent; @@ -193,7 +210,7 @@ public abstract class PostgreSqlQueryVisitor implements StrolchRootElementSelect selection.accept(this); if (iter.hasNext()) { this.sb.append(indent); - this.sb.append("or\n"); + this.sb.append("OR\n"); } } this.indent = indent; @@ -205,7 +222,7 @@ public abstract class PostgreSqlQueryVisitor implements StrolchRootElementSelect public void visitNot(NotSelection notSelection) { this.sb.append(this.indent); List selections = notSelection.getSelections(); - this.sb.append("not ( \n"); + this.sb.append("NOT ( \n"); Iterator iter = selections.iterator(); String indent = this.indent; this.indent += " "; @@ -214,7 +231,7 @@ public abstract class PostgreSqlQueryVisitor implements StrolchRootElementSelect selection.accept(this); if (iter.hasNext()) { this.sb.append(indent); - this.sb.append("and\n"); + this.sb.append("AND\n"); } } this.indent = indent; @@ -223,7 +240,7 @@ public abstract class PostgreSqlQueryVisitor implements StrolchRootElementSelect } private void xpath(String bagKey, String paramKey, String paramValue) { - String xpath = "cast(xpath('//${className}/ParameterBag[@Id=\"${bagKey}\"]/Parameter[@Id=\"${paramKey}\" and @Value=\"${paramValue}\"]', asxml) as text[]) != '{}'\n"; + String xpath = "CAST(XPATH('//${className}/ParameterBag[@Id=\"${bagKey}\"]/Parameter[@Id=\"${paramKey}\" and @Value=\"${paramValue}\"]', asxml) AS TEXT[]) != '{}'\n"; this.sb.append(this.indent); xpath = xpath.replace("${className}", getClassName()); xpath = xpath.replace("${bagKey}", bagKey); @@ -236,13 +253,13 @@ public abstract class PostgreSqlQueryVisitor implements StrolchRootElementSelect public void visit(StringParameterSelection selection) { String value = selection.getValue(); - String xpath = "xpath('//${className}/ParameterBag[@Id=\"${bagKey}\"]/Parameter[@Id=\"${paramKey}\"]/@Value', asxml))::TEXT AS content"; + String xpath = "XPATH('//${className}/ParameterBag[@Id=\"${bagKey}\"]/Parameter[@Id=\"${paramKey}\"]/@Value', asxml))::TEXT AS content"; xpath = xpath.replace("${className}", getClassName()); xpath = xpath.replace("${bagKey}", selection.getBagKey()); xpath = xpath.replace("${paramKey}", selection.getParamKey()); this.sb.append(this.indent); - this.sb.append("id in (\n"); + this.sb.append("id IN (\n"); this.sb.append(this.indent); this.sb.append(" SELECT id\n"); this.sb.append(this.indent); @@ -252,7 +269,7 @@ public abstract class PostgreSqlQueryVisitor implements StrolchRootElementSelect this.sb.append(xpath); this.sb.append("\n"); this.sb.append(this.indent); - this.sb.append("from "); + this.sb.append("FROM "); this.sb.append(getTableName()); this.sb.append("\n"); this.sb.append(this.indent); @@ -315,7 +332,7 @@ public abstract class PostgreSqlQueryVisitor implements StrolchRootElementSelect @Override public void visit(NullParameterSelection selection) { - String xpath = "cast(xpath('//${className}/ParameterBag[@Id=\"${bagKey}\"]/Parameter[@Id=\"${paramKey}\"]', asxml) as text[]) = '{}'\n"; + String xpath = "CAST(XPATH('//${className}/ParameterBag[@Id=\"${bagKey}\"]/Parameter[@Id=\"${paramKey}\"]', asxml) AS text[]) = '{}'\n"; this.sb.append(this.indent); xpath = xpath.replace("${className}", getClassName()); xpath = xpath.replace("${bagKey}", selection.getBagKey()); @@ -325,7 +342,7 @@ public abstract class PostgreSqlQueryVisitor implements StrolchRootElementSelect @Override public void visit(ParameterBagSelection selection) { - String xpath = "cast(xpath('//${className}/ParameterBag[@Id=\"${bagKey}\"]', asxml) as text[]) != '{}'\n"; + String xpath = "CAST(XPATH('//${className}/ParameterBag[@Id=\"${bagKey}\"]', asxml) AS text[]) != '{}'\n"; this.sb.append(this.indent); xpath = xpath.replace("${className}", getClassName()); xpath = xpath.replace("${bagKey}", selection.getBagKey()); @@ -334,7 +351,7 @@ public abstract class PostgreSqlQueryVisitor implements StrolchRootElementSelect @Override public void visit(NullParameterBagSelection selection) { - String xpath = "cast(xpath('//${className}/ParameterBag[@Id=\"${bagKey}\"]', asxml) as text[]) = '{}'\n"; + String xpath = "CAST(XPATH('//${className}/ParameterBag[@Id=\"${bagKey}\"]', asxml) AS text[]) = '{}'\n"; this.sb.append(this.indent); xpath = xpath.replace("${className}", getClassName()); xpath = xpath.replace("${bagKey}", selection.getBagKey()); @@ -366,6 +383,31 @@ public abstract class PostgreSqlQueryVisitor implements StrolchRootElementSelect throw new UnsupportedOperationException("Not yet supported!"); } + @Override + public PostgreSqlQueryVisitor visit(OrderById ordering) { + if (ordering.isAscending()) + this.ordering = "ORDER BY id"; + else + this.ordering = "ORDER BY id DESC"; + + return this; + } + + @Override + public PostgreSqlQueryVisitor visit(OrderByName ordering) { + if (ordering.isAscending()) + this.ordering = "ORDER BY name"; + else + this.ordering = "ORDER BY name DESC"; + + return this; + } + + @Override + public PostgreSqlQueryVisitor visit(OrderByParameter ordering) { + throw new UnsupportedOperationException("Not yet supported!"); + } + /** * @param ps * @throws SQLException diff --git a/li.strolch.persistence.postgresql/src/main/java/li/strolch/persistence/postgresql/PostgreSqlResourceDao.java b/li.strolch.persistence.postgresql/src/main/java/li/strolch/persistence/postgresql/PostgreSqlResourceDao.java index 3a5c779ff..c3cb71cbf 100644 --- a/li.strolch.persistence.postgresql/src/main/java/li/strolch/persistence/postgresql/PostgreSqlResourceDao.java +++ b/li.strolch.persistence.postgresql/src/main/java/li/strolch/persistence/postgresql/PostgreSqlResourceDao.java @@ -31,7 +31,6 @@ import javax.xml.parsers.SAXParserFactory; import javax.xml.transform.sax.SAXResult; import li.strolch.model.Resource; -import li.strolch.model.ResourceVisitor; import li.strolch.model.Tags; import li.strolch.model.query.ResourceQuery; import li.strolch.model.xml.ResourceToSaxVisitor; @@ -149,7 +148,7 @@ public class PostgreSqlResourceDao extends PostgresqlDao implements Re } @Override - public List doQuery(ResourceQuery query, ResourceVisitor resourceVisitor) { + public List doQuery(ResourceQuery query) { PostgreSqlResourceQueryVisitor queryVisitor = new PostgreSqlResourceQueryVisitor("id, asxml"); query.accept(queryVisitor); @@ -166,7 +165,7 @@ public class PostgreSqlResourceDao extends PostgresqlDao implements Re String id = result.getString("id"); SQLXML sqlxml = result.getSQLXML("asxml"); Resource t = parseFromXml(id, queryVisitor.getType(), sqlxml); - list.add(resourceVisitor.visit(t)); + list.add(query.getResourceVisitor().visit(t)); } } } catch (SQLException e) { diff --git a/li.strolch.persistence.postgresql/src/test/java/li/strolch/persistence/postgresql/dao/test/AuditQueryTest.java b/li.strolch.persistence.postgresql/src/test/java/li/strolch/persistence/postgresql/dao/test/AuditQueryTest.java index d5fdfb1fd..f075605cc 100644 --- a/li.strolch.persistence.postgresql/src/test/java/li/strolch/persistence/postgresql/dao/test/AuditQueryTest.java +++ b/li.strolch.persistence.postgresql/src/test/java/li/strolch/persistence/postgresql/dao/test/AuditQueryTest.java @@ -44,6 +44,8 @@ import li.strolch.model.Tags; import li.strolch.model.audit.AccessType; import li.strolch.model.audit.Audit; import li.strolch.model.audit.AuditQuery; +import li.strolch.model.audit.AuditVisitor; +import li.strolch.model.audit.NoStrategyAuditVisitor; import li.strolch.persistence.api.AbstractTransaction; import li.strolch.persistence.api.StrolchTransaction; import li.strolch.persistence.postgresql.PostgreSqlAuditQueryVisitor; @@ -172,92 +174,100 @@ public class AuditQueryTest { @Test public void shouldQueryTypeAndDateRange() throws SQLException { - AuditQuery query = new AuditQuery(Tags.AUDIT, new DateRange().from(earlier, true).to(later, true)); + + AuditVisitor visitor = new NoStrategyAuditVisitor(); + + AuditQuery query = new AuditQuery<>(visitor, Tags.AUDIT, new DateRange().from(earlier, true).to(later, + true)); performQuery(query, Arrays.asList("0", "1", "2", "3", "4")); - query = new AuditQuery(Tags.AUDIT, new DateRange().from(current, true).to(current, true)); + query = new AuditQuery<>(visitor, Tags.AUDIT, new DateRange().from(current, true).to(current, true)); performQuery(query, Arrays.asList("1", "3", "4")); - query = new AuditQuery(Tags.AUDIT, new DateRange().from(current, true)); + query = new AuditQuery<>(visitor, Tags.AUDIT, new DateRange().from(current, true)); performQuery(query, Arrays.asList("1", "2", "3", "4")); - query = new AuditQuery(Tags.AUDIT, new DateRange().to(current, true)); + query = new AuditQuery<>(visitor, Tags.AUDIT, new DateRange().to(current, true)); performQuery(query, Arrays.asList("0", "1", "3", "4")); - query = new AuditQuery(Tags.RESOURCE, new DateRange().from(past, true).to(future, true)); + query = new AuditQuery<>(visitor, Tags.RESOURCE, new DateRange().from(past, true).to(future, true)); performQuery(query, Arrays. asList()); } @Test public void shouldQueryAudits() throws SQLException { - AuditQuery query = new AuditQuery(Tags.AUDIT, new DateRange().from(past, true).to(future, true)); + + AuditVisitor visitor = new NoStrategyAuditVisitor(); + + AuditQuery query = new AuditQuery<>(visitor, Tags.AUDIT, new DateRange().from(past, true).to(future, + true)); query.action().accessTypes(AccessType.CREATE, AccessType.READ); performQuery(query, Arrays.asList("0", "1", "4")); - query = new AuditQuery(Tags.AUDIT, new DateRange().from(past, true).to(future, true)); + query = new AuditQuery<>(visitor, Tags.AUDIT, new DateRange().from(past, true).to(future, true)); query.action().accessTypes(AccessType.CREATE); performQuery(query, Arrays.asList("0", "4")); - query = new AuditQuery(Tags.AUDIT, new DateRange().from(past, true).to(future, true)); + query = new AuditQuery<>(visitor, Tags.AUDIT, new DateRange().from(past, true).to(future, true)); query.action().accessTypes(AccessType.CREATE, AccessType.READ) .actions(StringMatchMode.EQUALS_CASE_SENSITIVE, "create", "read"); performQuery(query, Arrays.asList("0", "1", "4")); - query = new AuditQuery(Tags.AUDIT, new DateRange().from(past, true).to(future, true)); + query = new AuditQuery<>(visitor, Tags.AUDIT, new DateRange().from(past, true).to(future, true)); query.action().accessTypes(AccessType.CREATE, AccessType.READ) .actions(StringMatchMode.EQUALS_CASE_SENSITIVE, "read"); performQuery(query, Arrays.asList("1")); - query = new AuditQuery(Tags.AUDIT, new DateRange().from(past, true).to(future, true)); + query = new AuditQuery<>(visitor, Tags.AUDIT, new DateRange().from(past, true).to(future, true)); query.element().elementAccessed(StringMatchMode.CONTAINS_CASE_INSENSITIVE, "crea"); performQuery(query, Arrays.asList("0", "4")); - query = new AuditQuery(Tags.AUDIT, new DateRange().from(past, true).to(future, true)); + query = new AuditQuery<>(visitor, Tags.AUDIT, new DateRange().from(past, true).to(future, true)); query.element().elementAccessed(StringMatchMode.CONTAINS_CASE_SENSITIVE, "crea"); performQuery(query, Arrays. asList()); - query = new AuditQuery(Tags.AUDIT, new DateRange().from(past, true).to(future, true)); + query = new AuditQuery<>(visitor, Tags.AUDIT, new DateRange().from(past, true).to(future, true)); query.element().elementAccessed(StringMatchMode.EQUALS_CASE_INSENSITIVE, "create"); performQuery(query, Arrays.asList("0", "4")); - query = new AuditQuery(Tags.AUDIT, new DateRange().from(past, true).to(future, true)); + query = new AuditQuery<>(visitor, Tags.AUDIT, new DateRange().from(past, true).to(future, true)); query.identity().usernames(StringMatchMode.EQUALS_CASE_INSENSITIVE, "earlier"); performQuery(query, Arrays.asList("0")); - query = new AuditQuery(Tags.AUDIT, new DateRange().from(past, true).to(future, true)); + query = new AuditQuery<>(visitor, Tags.AUDIT, new DateRange().from(past, true).to(future, true)); query.identity().usernames(StringMatchMode.EQUALS_CASE_INSENSITIVE, "earlier", "later"); performQuery(query, Arrays.asList("0", "2")); - query = new AuditQuery(Tags.AUDIT, new DateRange().from(past, true).to(future, true)); + query = new AuditQuery<>(visitor, Tags.AUDIT, new DateRange().from(past, true).to(future, true)); query.identity().usernames(StringMatchMode.EQUALS_CASE_INSENSITIVE, "earlier") .firstnames(StringMatchMode.CONTAINS_CASE_INSENSITIVE, "enn"); performQuery(query, Arrays.asList("0")); - query = new AuditQuery(Tags.AUDIT, new DateRange().from(past, true).to(future, true)); + query = new AuditQuery<>(visitor, Tags.AUDIT, new DateRange().from(past, true).to(future, true)); query.identity().usernames(StringMatchMode.EQUALS_CASE_INSENSITIVE, "earlier") .firstnames(StringMatchMode.CONTAINS_CASE_INSENSITIVE, "enn") .lastnames(StringMatchMode.CONTAINS_CASE_INSENSITIVE, "kennedy"); performQuery(query, Arrays.asList("0")); - query = new AuditQuery(Tags.AUDIT, new DateRange().from(past, true).to(future, true)); + query = new AuditQuery<>(visitor, Tags.AUDIT, new DateRange().from(past, true).to(future, true)); query.identity().firstnames(StringMatchMode.CONTAINS_CASE_INSENSITIVE, "enn") .lastnames(StringMatchMode.CONTAINS_CASE_INSENSITIVE, "kennedy"); performQuery(query, Arrays.asList("0", "1", "2", "3", "4")); - query = new AuditQuery(Tags.AUDIT, new DateRange().from(past, true).to(future, true)); + query = new AuditQuery<>(visitor, Tags.AUDIT, new DateRange().from(past, true).to(future, true)); query.element().elementSubTypes(StringMatchMode.EQUALS_CASE_SENSITIVE, "Foo"); performQuery(query, Arrays.asList("0", "1", "2", "3", "4")); - query = new AuditQuery(Tags.AUDIT, new DateRange().from(past, true).to(future, true)); + query = new AuditQuery<>(visitor, Tags.AUDIT, new DateRange().from(past, true).to(future, true)); query.element().elementSubTypes(StringMatchMode.EQUALS_CASE_SENSITIVE, "Bar"); performQuery(query, Arrays.asList()); - query = new AuditQuery(Tags.AUDIT, new DateRange().from(past, true).to(future, true)); + query = new AuditQuery<>(visitor, Tags.AUDIT, new DateRange().from(past, true).to(future, true)); query.limit(1).element().elementSubTypes(StringMatchMode.EQUALS_CASE_SENSITIVE, "Foo"); performQuery(query, Arrays.asList("2")); } - private void performQuery(AuditQuery query, List expected) throws SQLException { + private void performQuery(AuditQuery query, List expected) throws SQLException { PostgreSqlAuditQueryVisitor visitor = new PostgreSqlAuditQueryVisitor("id"); query.accept(visitor); List ids = queryIds(visitor); diff --git a/li.strolch.persistence.postgresql/src/test/java/li/strolch/persistence/postgresql/dao/test/QueryTest.java b/li.strolch.persistence.postgresql/src/test/java/li/strolch/persistence/postgresql/dao/test/QueryTest.java index aff8f847f..a3cc7cb60 100644 --- a/li.strolch.persistence.postgresql/src/test/java/li/strolch/persistence/postgresql/dao/test/QueryTest.java +++ b/li.strolch.persistence.postgresql/src/test/java/li/strolch/persistence/postgresql/dao/test/QueryTest.java @@ -34,13 +34,14 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; import java.util.Date; -import java.util.HashSet; import java.util.List; import li.strolch.agent.api.OrderMap; import li.strolch.agent.api.ResourceMap; import li.strolch.agent.api.StrolchRealm; import li.strolch.model.ModelGenerator; +import li.strolch.model.Order; +import li.strolch.model.Resource; import li.strolch.model.State; import li.strolch.model.query.DateSelection; import li.strolch.model.query.IdSelection; @@ -52,7 +53,7 @@ import li.strolch.model.query.ParameterBagSelection.NullParameterBagSelection; import li.strolch.model.query.ParameterSelection; import li.strolch.model.query.ResourceQuery; import li.strolch.model.query.StateSelection; -import li.strolch.model.query.StrolchTypeNavigation; +import li.strolch.model.query.ordering.OrderById; import li.strolch.persistence.api.StrolchTransaction; import li.strolch.persistence.postgresql.PostgreSqlOrderQueryVisitor; import li.strolch.persistence.postgresql.PostgreSqlQueryVisitor; @@ -149,7 +150,7 @@ public class QueryTest { @Test public void shouldQueryOrderAll() throws SQLException { - OrderQuery query = new OrderQuery(new StrolchTypeNavigation("MyType1")); + OrderQuery query = OrderQuery.query("MyType1", new OrderById()); query.withAny(); performOrderQuery(query, Arrays.asList("@1", "@2", "@3")); } @@ -157,51 +158,51 @@ public class QueryTest { @Test public void shouldQueryResourceAll() throws SQLException { - ResourceQuery query = new ResourceQuery(new StrolchTypeNavigation("MyType2")); + ResourceQuery query = ResourceQuery.query("MyType2", new OrderById(false)); query.withAny(); - performResourceQuery(query, Arrays.asList("@4", "@5", "@6")); + performResourceQuery(query, Arrays.asList("@6", "@5", "@4")); } @Test public void shouldQueryOrderByDate() throws SQLException { // range - OrderQuery query = new OrderQuery(new StrolchTypeNavigation("MyType1")); + OrderQuery query = OrderQuery.query("MyType1", new OrderById()); query.and().with(new DateSelection().from(earlier, false).to(later, false)); performOrderQuery(query, Arrays.asList("@1", "@2", "@3")); // equals current - query = new OrderQuery(new StrolchTypeNavigation("MyType1")); + query = OrderQuery.query("MyType1"); query.and().with(new DateSelection().from(current, false).to(current, false)); performOrderQuery(query, Arrays.asList("@2")); // equals later - query = new OrderQuery(new StrolchTypeNavigation("MyType1")); + query = OrderQuery.query("MyType1"); query.and().with(new DateSelection().from(later, false).to(later, false)); performOrderQuery(query, Arrays. asList("@3")); // equals earlier - query = new OrderQuery(new StrolchTypeNavigation("MyType1")); + query = OrderQuery.query("MyType1"); query.and().with(new DateSelection().from(earlier, false).to(earlier, false)); performOrderQuery(query, Arrays. asList("@1")); // past - query = new OrderQuery(new StrolchTypeNavigation("MyType1")); + query = OrderQuery.query("MyType1"); query.and().with(new DateSelection().to(past, false)); performOrderQuery(query, Arrays. asList()); // future - query = new OrderQuery(new StrolchTypeNavigation("MyType1")); + query = OrderQuery.query("MyType1"); query.and().with(new DateSelection().from(future, false)); performOrderQuery(query, Arrays. asList()); // earlier - query = new OrderQuery(new StrolchTypeNavigation("MyType1")); + query = OrderQuery.query("MyType1"); query.and().with(new DateSelection().from(past, false).to(earlier, true)); performOrderQuery(query, Arrays. asList("@1")); // later - query = new OrderQuery(new StrolchTypeNavigation("MyType1")); + query = OrderQuery.query("MyType1"); query.and().with(new DateSelection().from(later, false).to(future, true)); performOrderQuery(query, Arrays. asList("@3")); } @@ -209,11 +210,11 @@ public class QueryTest { @Test public void shouldQueryOrderByState() throws SQLException { - OrderQuery query = new OrderQuery(new StrolchTypeNavigation("MyType1")); + OrderQuery query = OrderQuery.query("MyType1"); query.and().with(new StateSelection(State.CREATED)); performOrderQuery(query, Arrays.asList("@1")); - query = new OrderQuery(new StrolchTypeNavigation("MyType1")); + query = OrderQuery.query("MyType1"); query.and().with(new StateSelection(State.OPEN)); performOrderQuery(query, Arrays. asList("@2")); } @@ -221,7 +222,7 @@ public class QueryTest { @Test public void shouldQueryOrder1() throws SQLException { - OrderQuery query = new OrderQuery(new StrolchTypeNavigation("MyType1")); + OrderQuery query = OrderQuery.query("MyType1", new OrderById()); query.and().with(new IdSelection("@1", "@2"), new NameSelection("Order 1", StringMatchMode.EQUALS_CASE_SENSITIVE)); performOrderQuery(query, Arrays.asList("@1")); @@ -230,7 +231,7 @@ public class QueryTest { @Test public void shouldQueryOrder2() throws SQLException { - OrderQuery query = new OrderQuery(new StrolchTypeNavigation("MyType1")); + OrderQuery query = OrderQuery.query("MyType1", new OrderById()); query.or().with(new IdSelection("@1", "@2"), new NameSelection("order 1", StringMatchMode.EQUALS_CASE_SENSITIVE)); performOrderQuery(query, Arrays.asList("@1", "@2")); @@ -238,28 +239,28 @@ public class QueryTest { @Test public void shouldQueryOrderByBooleParam() throws SQLException { - OrderQuery query = new OrderQuery(new StrolchTypeNavigation("MyType1")); + OrderQuery query = OrderQuery.query("MyType1", new OrderById()); query.and().with(ParameterSelection.booleanSelection("@bag01", "@param1", true)); performOrderQuery(query, Arrays.asList("@1", "@2", "@3")); } @Test public void shouldQueryOrderByFloagParam() throws SQLException { - OrderQuery query = new OrderQuery(new StrolchTypeNavigation("MyType1")); + OrderQuery query = OrderQuery.query("MyType1", new OrderById()); query.and().with(ParameterSelection.floatSelection("@bag01", "@param2", 44.3)); performOrderQuery(query, Arrays.asList("@1", "@2", "@3")); } @Test public void shouldQueryOrderByIntegerParam() throws SQLException { - OrderQuery query = new OrderQuery(new StrolchTypeNavigation("MyType1")); + OrderQuery query = OrderQuery.query("MyType1", new OrderById()); query.and().with(ParameterSelection.integerSelection("@bag01", "@param3", 77)); performOrderQuery(query, Arrays.asList("@1", "@2", "@3")); } @Test public void shouldQueryOrderByLongParam() throws SQLException { - OrderQuery query = new OrderQuery(new StrolchTypeNavigation("MyType2")); + OrderQuery query = OrderQuery.query("MyType2", new OrderById()); query.and().with(ParameterSelection.longSelection("@bag01", "@param4", 4453234566L)); performOrderQuery(query, Arrays.asList("@4", "@5", "@6")); } @@ -269,25 +270,25 @@ public class QueryTest { List expected = Arrays.asList("@1", "@2", "@3"); - OrderQuery query = new OrderQuery(new StrolchTypeNavigation("MyType1")); + OrderQuery query = OrderQuery.query("MyType1", new OrderById()); query.and().with( ParameterSelection.stringSelection("@bag01", "@param5", "Strolch", StringMatchMode.EQUALS_CASE_SENSITIVE)); performOrderQuery(query, expected); - query = new OrderQuery(new StrolchTypeNavigation("MyType1")); + query = OrderQuery.query("MyType1", new OrderById()); query.and().with( ParameterSelection.stringSelection("@bag01", "@param5", "strolch", StringMatchMode.EQUALS_CASE_SENSITIVE)); performOrderQuery(query, Arrays. asList()); - query = new OrderQuery(new StrolchTypeNavigation("MyType1")); + query = OrderQuery.query("MyType1", new OrderById()); query.and().with( ParameterSelection.stringSelection("@bag01", "@param5", "strolch", StringMatchMode.EQUALS_CASE_INSENSITIVE)); performOrderQuery(query, expected); - query = new OrderQuery(new StrolchTypeNavigation("MyType1")); + query = OrderQuery.query("MyType1", new OrderById()); query.and().with( ParameterSelection.stringSelection("@bag01", "@param5", "olch", StringMatchMode.CONTAINS_CASE_INSENSITIVE)); @@ -296,42 +297,42 @@ public class QueryTest { @Test public void shouldQueryOrderByDateParam() throws SQLException { - OrderQuery query = new OrderQuery(new StrolchTypeNavigation("MyType1")); + OrderQuery query = OrderQuery.query("MyType1", new OrderById()); query.and().with(ParameterSelection.dateSelection("@bag01", "@param6", new Date(1354295525628L))); performOrderQuery(query, Arrays.asList("@1", "@2", "@3")); } @Test public void shouldQueryOrderByDurationParam() throws SQLException { - OrderQuery query = new OrderQuery(new StrolchTypeNavigation("MyType1")); + OrderQuery query = OrderQuery.query("MyType1", new OrderById()); query.and().with(ParameterSelection.durationSelection("@bag01", "@param8", "P1D")); performOrderQuery(query, Arrays.asList("@1", "@2", "@3")); } @Test public void shouldQueryOrderByNullParam1() throws SQLException { - OrderQuery query = new OrderQuery(new StrolchTypeNavigation("MyType1")); + OrderQuery query = OrderQuery.query("MyType1", new OrderById()); query.and().with(ParameterSelection.nullSelection("@bag01", "@param6")); performOrderQuery(query, Arrays. asList()); } @Test public void shouldQueryOrderByNullParam2() throws SQLException { - OrderQuery query = new OrderQuery(new StrolchTypeNavigation("MyType1")); + OrderQuery query = OrderQuery.query("MyType1", new OrderById()); query.and().with(ParameterSelection.nullSelection("@bag01", "@param")); performOrderQuery(query, Arrays.asList("@1", "@2", "@3")); } @Test public void shouldQueryOrderByBag() throws SQLException { - OrderQuery query = new OrderQuery(new StrolchTypeNavigation("MyType1")); + OrderQuery query = OrderQuery.query("MyType1", new OrderById()); query.and().with(new ParameterBagSelection("@bag01")); performOrderQuery(query, Arrays.asList("@1", "@2", "@3")); } @Test public void shouldQueryOrderByNullBag() throws SQLException { - OrderQuery query = new OrderQuery(new StrolchTypeNavigation("MyType1")); + OrderQuery query = OrderQuery.query("MyType1", new OrderById()); query.and().with(new NullParameterBagSelection("@bag01")); performOrderQuery(query, Arrays. asList()); } @@ -339,7 +340,7 @@ public class QueryTest { @Test public void shouldQueryResource1() throws SQLException { - ResourceQuery query = new ResourceQuery(new StrolchTypeNavigation("MyType1")); + ResourceQuery query = ResourceQuery.query("MyType1", new OrderById()); query.or().with(new IdSelection("@1", "@2"), new NameSelection("Resource 1", StringMatchMode.EQUALS_CASE_SENSITIVE)); performResourceQuery(query, Arrays.asList("@1", "@2")); @@ -347,7 +348,7 @@ public class QueryTest { @Test public void shouldQueryResource2() throws SQLException { - ResourceQuery query = new ResourceQuery(new StrolchTypeNavigation("MyType1")); + ResourceQuery query = ResourceQuery.query("MyType1", new OrderById()); query.and().with( new OrSelection(new IdSelection("@1"), new IdSelection("@2")), new OrSelection(new NameSelection("Resource 1", StringMatchMode.EQUALS_CASE_SENSITIVE), @@ -357,28 +358,28 @@ public class QueryTest { @Test public void shouldQueryResourceByBooleParam() throws SQLException { - ResourceQuery query = new ResourceQuery(new StrolchTypeNavigation("MyType1")); + ResourceQuery query = ResourceQuery.query("MyType1", new OrderById()); query.and().with(ParameterSelection.booleanSelection("@bag01", "@param1", true)); performResourceQuery(query, Arrays.asList("@1", "@2", "@3")); } @Test public void shouldQueryResourceByFloagParam() throws SQLException { - ResourceQuery query = new ResourceQuery(new StrolchTypeNavigation("MyType1")); + ResourceQuery query = ResourceQuery.query("MyType1", new OrderById()); query.and().with(ParameterSelection.floatSelection("@bag01", "@param2", 44.3)); performResourceQuery(query, Arrays.asList("@1", "@2", "@3")); } @Test public void shouldQueryResourceByIntegerParam() throws SQLException { - ResourceQuery query = new ResourceQuery(new StrolchTypeNavigation("MyType1")); + ResourceQuery query = ResourceQuery.query("MyType1", new OrderById()); query.and().with(ParameterSelection.integerSelection("@bag01", "@param3", 77)); performResourceQuery(query, Arrays.asList("@1", "@2", "@3")); } @Test public void shouldQueryResourceByLongParam() throws SQLException { - ResourceQuery query = new ResourceQuery(new StrolchTypeNavigation("MyType2")); + ResourceQuery query = ResourceQuery.query("MyType2", new OrderById()); query.and().with(ParameterSelection.longSelection("@bag01", "@param4", 4453234566L)); performResourceQuery(query, Arrays.asList("@4", "@5", "@6")); } @@ -388,31 +389,31 @@ public class QueryTest { List expected = Arrays.asList("@1", "@2", "@3"); - ResourceQuery query = new ResourceQuery(new StrolchTypeNavigation("MyType1")); + ResourceQuery query = ResourceQuery.query("MyType1", new OrderById()); query.and().with( ParameterSelection.stringSelection("@bag01", "@param5", "Strolch", StringMatchMode.EQUALS_CASE_SENSITIVE)); performResourceQuery(query, expected); - query = new ResourceQuery(new StrolchTypeNavigation("MyType1")); + query = ResourceQuery.query("MyType1", new OrderById()); query.and().with( ParameterSelection.stringSelection("@bag01", "@param5", "strolch", StringMatchMode.EQUALS_CASE_SENSITIVE)); performResourceQuery(query, Arrays. asList()); - query = new ResourceQuery(new StrolchTypeNavigation("MyType1")); + query = ResourceQuery.query("MyType1", new OrderById()); query.and().with( ParameterSelection.stringSelection("@bag01", "@param5", "strolch", StringMatchMode.EQUALS_CASE_INSENSITIVE)); performResourceQuery(query, expected); - query = new ResourceQuery(new StrolchTypeNavigation("MyType1")); + query = ResourceQuery.query("MyType1", new OrderById()); query.and().with( ParameterSelection.stringSelection("@bag01", "@param5", "olch", StringMatchMode.CONTAINS_CASE_INSENSITIVE)); performResourceQuery(query, expected); - query = new ResourceQuery(new StrolchTypeNavigation("MyType1")); + query = ResourceQuery.query("MyType1", new OrderById()); query.and().with( ParameterSelection.stringSelection("@bag01", "@param5", "olch", StringMatchMode.CONTAINS_CASE_INSENSITIVE), @@ -425,58 +426,58 @@ public class QueryTest { @Test public void shouldQueryResourceByDateParam() throws SQLException { - ResourceQuery query = new ResourceQuery(new StrolchTypeNavigation("MyType1")); + ResourceQuery query = ResourceQuery.query("MyType1", new OrderById()); query.and().with(ParameterSelection.dateSelection("@bag01", "@param6", new Date(1354295525628L))); performResourceQuery(query, Arrays.asList("@1", "@2", "@3")); } @Test public void shouldQueryResourceByDurationParam() throws SQLException { - ResourceQuery query = new ResourceQuery(new StrolchTypeNavigation("MyType1")); + ResourceQuery query = ResourceQuery.query("MyType1", new OrderById()); query.and().with(ParameterSelection.durationSelection("@bag01", "@param8", "P1D")); performResourceQuery(query, Arrays.asList("@1", "@2", "@3")); } @Test public void shouldQueryResourceByNullParam1() throws SQLException { - ResourceQuery query = new ResourceQuery(new StrolchTypeNavigation("MyType1")); + ResourceQuery query = ResourceQuery.query("MyType1", new OrderById()); query.and().with(ParameterSelection.nullSelection("@bag01", "@param6")); performResourceQuery(query, Arrays. asList()); } @Test public void shouldQueryResourceByNullParam2() throws SQLException { - ResourceQuery query = new ResourceQuery(new StrolchTypeNavigation("MyType1")); + ResourceQuery query = ResourceQuery.query("MyType1", new OrderById()); query.and().with(ParameterSelection.nullSelection("@bag01", "@param")); performResourceQuery(query, Arrays.asList("@1", "@2", "@3")); } @Test public void shouldQueryResourceByBag() throws SQLException { - ResourceQuery query = new ResourceQuery(new StrolchTypeNavigation("MyType1")); + ResourceQuery query = ResourceQuery.query("MyType1", new OrderById()); query.and().with(new ParameterBagSelection("@bag01")); performResourceQuery(query, Arrays.asList("@1", "@2", "@3")); } @Test public void shouldQueryResourceByNullBag() throws SQLException { - ResourceQuery query = new ResourceQuery(new StrolchTypeNavigation("MyType1")); + ResourceQuery query = ResourceQuery.query("MyType1", new OrderById()); query.and().with(new NullParameterBagSelection("@bag01")); performResourceQuery(query, Arrays. asList()); } - private void performOrderQuery(OrderQuery query, List expected) throws SQLException { + private void performOrderQuery(OrderQuery query, List expected) throws SQLException { PostgreSqlOrderQueryVisitor visitor = new PostgreSqlOrderQueryVisitor("id"); query.accept(visitor); List ids = queryIds(visitor); - assertEquals(new HashSet<>(expected), new HashSet<>(ids)); + assertEquals(expected, ids); } - private void performResourceQuery(ResourceQuery query, List expected) throws SQLException { + private void performResourceQuery(ResourceQuery query, List expected) throws SQLException { PostgreSqlResourceQueryVisitor visitor = new PostgreSqlResourceQueryVisitor("id"); query.accept(visitor); List ids = queryIds(visitor); - assertEquals(new HashSet<>(expected), new HashSet<>(ids)); + assertEquals(expected, ids); } private List queryIds(PostgreSqlQueryVisitor visitor) throws SQLException { diff --git a/li.strolch.persistence.xml/src/main/java/li/strolch/persistence/xml/XmlActivityDao.java b/li.strolch.persistence.xml/src/main/java/li/strolch/persistence/xml/XmlActivityDao.java index 80a800652..6b8fd86b2 100644 --- a/li.strolch.persistence.xml/src/main/java/li/strolch/persistence/xml/XmlActivityDao.java +++ b/li.strolch.persistence.xml/src/main/java/li/strolch/persistence/xml/XmlActivityDao.java @@ -17,7 +17,6 @@ package li.strolch.persistence.xml; import java.util.List; -import li.strolch.model.ActivityVisitor; import li.strolch.model.Tags; import li.strolch.model.activity.Activity; import li.strolch.model.query.ActivityQuery; @@ -36,7 +35,7 @@ public class XmlActivityDao extends AbstractDao implements ActivityDao } @Override - public List doQuery(ActivityQuery query, ActivityVisitor activityVisitor) { + public List doQuery(ActivityQuery query) { // TODO implement XML file based querying... throw new UnsupportedOperationException("not yet implemented!"); } diff --git a/li.strolch.persistence.xml/src/main/java/li/strolch/persistence/xml/XmlAuditDao.java b/li.strolch.persistence.xml/src/main/java/li/strolch/persistence/xml/XmlAuditDao.java index 47695ece7..d135713f5 100644 --- a/li.strolch.persistence.xml/src/main/java/li/strolch/persistence/xml/XmlAuditDao.java +++ b/li.strolch.persistence.xml/src/main/java/li/strolch/persistence/xml/XmlAuditDao.java @@ -22,7 +22,6 @@ import java.util.Set; import li.strolch.model.Tags; import li.strolch.model.audit.Audit; import li.strolch.model.audit.AuditQuery; -import li.strolch.model.audit.AuditVisitor; import li.strolch.persistence.api.AuditDao; import li.strolch.persistence.api.StrolchTransaction; import ch.eitchnet.utils.collections.DateRange; @@ -190,7 +189,7 @@ public class XmlAuditDao implements AuditDao { } @Override - public List doQuery(AuditQuery query, AuditVisitor auditVisitor) { + public List doQuery(AuditQuery query) { // TODO implement XML file based querying... throw new UnsupportedOperationException("not yet implemented!"); } diff --git a/li.strolch.persistence.xml/src/main/java/li/strolch/persistence/xml/XmlOrderDao.java b/li.strolch.persistence.xml/src/main/java/li/strolch/persistence/xml/XmlOrderDao.java index a5b109d50..a4c97ce71 100644 --- a/li.strolch.persistence.xml/src/main/java/li/strolch/persistence/xml/XmlOrderDao.java +++ b/li.strolch.persistence.xml/src/main/java/li/strolch/persistence/xml/XmlOrderDao.java @@ -18,7 +18,6 @@ package li.strolch.persistence.xml; import java.util.List; import li.strolch.model.Order; -import li.strolch.model.OrderVisitor; import li.strolch.model.Tags; import li.strolch.model.query.OrderQuery; import li.strolch.persistence.api.OrderDao; @@ -36,7 +35,7 @@ public class XmlOrderDao extends AbstractDao implements OrderDao { } @Override - public List doQuery(OrderQuery query, OrderVisitor orderVisitor) { + public List doQuery(OrderQuery query) { // TODO implement XML file based querying... throw new UnsupportedOperationException("not yet implemented!"); } diff --git a/li.strolch.persistence.xml/src/main/java/li/strolch/persistence/xml/XmlResourceDao.java b/li.strolch.persistence.xml/src/main/java/li/strolch/persistence/xml/XmlResourceDao.java index 1e8c1f114..12d72b0c1 100644 --- a/li.strolch.persistence.xml/src/main/java/li/strolch/persistence/xml/XmlResourceDao.java +++ b/li.strolch.persistence.xml/src/main/java/li/strolch/persistence/xml/XmlResourceDao.java @@ -18,7 +18,6 @@ package li.strolch.persistence.xml; import java.util.List; import li.strolch.model.Resource; -import li.strolch.model.ResourceVisitor; import li.strolch.model.Tags; import li.strolch.model.query.ResourceQuery; import li.strolch.persistence.api.ResourceDao; @@ -36,7 +35,7 @@ public class XmlResourceDao extends AbstractDao implements ResourceDao } @Override - public List doQuery(ResourceQuery query, ResourceVisitor resourceVisitor) { + public List doQuery(ResourceQuery query) { // TODO implement XML file based querying... throw new UnsupportedOperationException("not yet implemented!"); } diff --git a/li.strolch.rest/src/main/java/li/strolch/rest/endpoint/AuditsService.java b/li.strolch.rest/src/main/java/li/strolch/rest/endpoint/AuditsService.java index d8c3e3002..b8c4ab59d 100644 --- a/li.strolch.rest/src/main/java/li/strolch/rest/endpoint/AuditsService.java +++ b/li.strolch.rest/src/main/java/li/strolch/rest/endpoint/AuditsService.java @@ -67,7 +67,7 @@ public class AuditsService { try (StrolchTransaction tx = realm.openTx(cert, AuditsService.class)) { - li.strolch.model.audit.AuditQuery auditQuery = new ToAuditQueryVisitor().create(query); + li.strolch.model.audit.AuditQuery auditQuery = new ToAuditQueryVisitor().create(query); List audits = tx.getAuditTrail().doQuery(tx, auditQuery); return Response.ok(new AuditQueryResult(audits), MediaType.APPLICATION_JSON).build(); diff --git a/li.strolch.rest/src/main/java/li/strolch/rest/model/visitor/ToAuditQueryVisitor.java b/li.strolch.rest/src/main/java/li/strolch/rest/model/visitor/ToAuditQueryVisitor.java index c611ce488..7c2dc9552 100644 --- a/li.strolch.rest/src/main/java/li/strolch/rest/model/visitor/ToAuditQueryVisitor.java +++ b/li.strolch.rest/src/main/java/li/strolch/rest/model/visitor/ToAuditQueryVisitor.java @@ -18,6 +18,7 @@ package li.strolch.rest.model.visitor; import java.util.List; import li.strolch.model.audit.AccessType; +import li.strolch.model.audit.Audit; import li.strolch.rest.model.ActionSelection; import li.strolch.rest.model.AuditQuery; import li.strolch.rest.model.DateRange; @@ -27,7 +28,7 @@ import ch.eitchnet.utils.helper.StringHelper; public class ToAuditQueryVisitor { - public li.strolch.model.audit.AuditQuery create(AuditQuery query) { + public li.strolch.model.audit.AuditQuery create(AuditQuery query) { // validate element type String elementType = query.getElementType(); @@ -45,7 +46,7 @@ public class ToAuditQueryVisitor { dateRange.isToInclusive()); // create query - li.strolch.model.audit.AuditQuery auditQuery = new li.strolch.model.audit.AuditQuery(elementType, dr); + li.strolch.model.audit.AuditQuery auditQuery = li.strolch.model.audit.AuditQuery.query(elementType, dr); // limit auditQuery.limit(query.getLimit()); diff --git a/li.strolch.service/src/main/java/li/strolch/migrations/RunMigrationsAction.java b/li.strolch.service/src/main/java/li/strolch/migrations/RunMigrationsAction.java index 911bb45f1..4ee126ec6 100644 --- a/li.strolch.service/src/main/java/li/strolch/migrations/RunMigrationsAction.java +++ b/li.strolch.service/src/main/java/li/strolch/migrations/RunMigrationsAction.java @@ -19,7 +19,6 @@ import java.util.Map; import ch.eitchnet.privilege.handler.SystemUserAction; import ch.eitchnet.privilege.model.PrivilegeContext; -import ch.eitchnet.utils.Version; /** * @author Robert von Burg