[New] Added limit and sorting to Audit query incl. REST API
This commit is contained in:
parent
5d7cf8469f
commit
6bd1ed58ad
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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());
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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)) {
|
||||
|
|
Loading…
Reference in New Issue