[New] Added limit and sorting to Audit query incl. REST API

This commit is contained in:
Robert von Burg 2015-04-04 18:29:33 +02:00
parent 5d7cf8469f
commit 6bd1ed58ad
8 changed files with 63 additions and 7 deletions

View File

@ -32,17 +32,15 @@ public class InMemoryAuditQuery<U> {
private AuditTypeNavigator navigator;
private List<AuditSelector> selectors;
private AuditVisitor<U> auditVisitor;
private long limit;
/**
* @param navigator
* @param selectors
* @param auditVisitor
*/
public InMemoryAuditQuery(AuditTypeNavigator navigator, List<AuditSelector> selectors, AuditVisitor<U> auditVisitor) {
public InMemoryAuditQuery(AuditTypeNavigator navigator, long limit, List<AuditSelector> selectors,
AuditVisitor<U> auditVisitor) {
DBC.PRE.assertNotNull("Navigator must be set!", navigator); //$NON-NLS-1$
DBC.PRE.assertNotNull("selectors must be set!", selectors); //$NON-NLS-1$
DBC.PRE.assertNotNull("auditVisitor must be set!", auditVisitor); //$NON-NLS-1$
this.navigator = navigator;
this.limit = limit;
this.selectors = selectors;
this.auditVisitor = auditVisitor;
}
@ -51,6 +49,9 @@ public class InMemoryAuditQuery<U> {
List<U> result = new ArrayList<>();
List<Audit> elements = this.navigator.navigate(dao);
elements.sort((a1, a2) -> a2.getDate().compareTo(a1.getDate()));
for (Audit audit : elements) {
if (!this.selectors.isEmpty()) {
@ -69,6 +70,9 @@ public class InMemoryAuditQuery<U> {
U returnValue = this.auditVisitor.visitAudit(audit);
DBC.INTERIM.assertNotNull("Visitor may not return null in query!", returnValue); //$NON-NLS-1$
result.add(returnValue);
if (this.limit > 0 && result.size() >= this.limit)
break;
}
return result;

View File

@ -44,8 +44,10 @@ public class InMemoryAuditQueryVisitor implements AuditQueryVisitor {
String msg = "Query is missing a navigation!"; //$NON-NLS-1$
throw new QueryException(msg);
}
long limit = auditQuery.getLimit();
return new InMemoryAuditQuery<U>(this.navigator, this.selectors, auditVisitor);
return new InMemoryAuditQuery<U>(this.navigator, limit, this.selectors, auditVisitor);
}
@Override

View File

@ -143,6 +143,18 @@ public class AuditQueryTest {
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.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.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.limit(1).element().elementSubTypes(StringMatchMode.EQUALS_CASE_SENSITIVE, "Foo");
performQuery(query, Arrays.asList(2L));
}
private void performQuery(AuditQuery query, List<Long> expected) throws SQLException {

View File

@ -30,6 +30,7 @@ public class AuditQuery implements StrolchQuery {
private String elementTypeSelection;
private List<AuditSelection> selections;
private DateRange dateRange;
private long limit;
public AuditQuery(String elementTypeSelection, DateRange dateRange) {
DBC.PRE.assertNotEmpty("No elementTypeSelection (navigation) set!", elementTypeSelection); //$NON-NLS-1$
@ -47,6 +48,15 @@ public class AuditQuery implements StrolchQuery {
return this.dateRange;
}
public long getLimit() {
return limit;
}
public AuditQuery limit(long limit) {
this.limit = limit;
return this;
}
public ActionSelection action() {
ActionSelection selection = new ActionSelection(this);
this.selections.add(selection);

View File

@ -37,6 +37,9 @@ public class PostgreSqlAuditQueryVisitor implements AuditQueryVisitor {
protected StringBuilder sql;
protected StringBuilder sb;
protected List<Object> values;
protected long limit;
protected String indent;
private String sqlAsString;
@ -63,6 +66,12 @@ public class PostgreSqlAuditQueryVisitor implements AuditQueryVisitor {
this.sql.append("\nwhere\n");
this.sql.append(this.sb.toString());
this.sql.append("ORDER BY date DESC\n");
if (limit != 0)
this.sql.append("LIMIT " + limit + "\n");
this.sqlAsString = this.sql.toString();
return this.sqlAsString;
}
@ -73,6 +82,7 @@ public class PostgreSqlAuditQueryVisitor implements AuditQueryVisitor {
this.sb.append(this.indent);
this.sb.append(PostgreSqlAuditDao.ELEMENT_TYPE);
this.sb.append(" = ?\n");
this.limit = auditQuery.getLimit();
ensureAnd();
this.values.add(auditQuery.getElementTypeSelection());
PostgreSqlHelper.toSql(this.indent, this.sb, this.values, PostgreSqlAuditDao.DATE, auditQuery.getDateRange());

View File

@ -251,6 +251,10 @@ public class AuditQueryTest {
query = new AuditQuery(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.limit(1).element().elementSubTypes(StringMatchMode.EQUALS_CASE_SENSITIVE, "Foo");
performQuery(query, Arrays.asList("2"));
}
private void performQuery(AuditQuery query, List<String> expected) throws SQLException {

View File

@ -46,6 +46,9 @@ public class AuditQuery {
@XmlElement(name = "dateRange")
private DateRange dateRange;
@XmlElement(name = "limit")
private long limit;
public String getElementType() {
return elementType;
}
@ -93,4 +96,12 @@ public class AuditQuery {
public void setDateRange(DateRange dateRange) {
this.dateRange = dateRange;
}
public long getLimit() {
return limit;
}
public void setLimit(long limit) {
this.limit = limit;
}
}

View File

@ -32,6 +32,9 @@ public class ToAuditQueryVisitor {
// create query
li.strolch.model.audit.AuditQuery auditQuery = new li.strolch.model.audit.AuditQuery(elementType, dr);
// limit
auditQuery.limit(query.getLimit());
// element
String elementSubType = query.getElementSubType();
if (StringHelper.isNotEmpty(elementSubType)) {