From 5347f69d433171d8476ad3b67bec5a37b16d3193 Mon Sep 17 00:00:00 2001 From: Claudio Mezzasalma Date: Tue, 6 Aug 2019 16:10:54 +0200 Subject: [PATCH] Filter messages according to metrics in Data view Signed-off-by: Claudio Mezzasalma --- .../data/server/GwtDataServiceImpl.java | 8 ++ .../datastore/model/query/OrPredicate.java | 29 ++++++ .../model/query/StorablePredicateFactory.java | 3 + .../internal/model/query/OrPredicateImpl.java | 90 +++++++++++++++++++ .../model/query/PredicateConstants.java | 5 ++ .../query/StorablePredicateFactoryImpl.java | 6 ++ 6 files changed, 141 insertions(+) create mode 100644 service/datastore/api/src/main/java/org/eclipse/kapua/service/datastore/model/query/OrPredicate.java create mode 100644 service/datastore/internal/src/main/java/org/eclipse/kapua/service/datastore/internal/model/query/OrPredicateImpl.java diff --git a/console/module/data/src/main/java/org/eclipse/kapua/app/console/module/data/server/GwtDataServiceImpl.java b/console/module/data/src/main/java/org/eclipse/kapua/app/console/module/data/server/GwtDataServiceImpl.java index e62ac0ec123..56c5fdadc4e 100644 --- a/console/module/data/src/main/java/org/eclipse/kapua/app/console/module/data/server/GwtDataServiceImpl.java +++ b/console/module/data/src/main/java/org/eclipse/kapua/app/console/module/data/server/GwtDataServiceImpl.java @@ -64,6 +64,7 @@ import org.eclipse.kapua.service.datastore.model.query.ClientInfoQuery; import org.eclipse.kapua.service.datastore.model.query.MessageQuery; import org.eclipse.kapua.service.datastore.model.query.MetricInfoQuery; +import org.eclipse.kapua.service.datastore.model.query.OrPredicate; import org.eclipse.kapua.service.datastore.model.query.RangePredicate; import org.eclipse.kapua.service.datastore.model.query.SortDirection; import org.eclipse.kapua.service.datastore.model.query.SortField; @@ -442,6 +443,13 @@ private PagingLoadResult findMessages(PagingLoadConfig loadConfig, S } RangePredicate dateRangePredicate = STORABLE_PREDICATE_FACTORY.newRangePredicate(MessageField.TIMESTAMP.field(), startDate, endDate); andPredicate.getPredicates().add(dateRangePredicate); + if (headers != null) { + OrPredicate metricsPredicate = STORABLE_PREDICATE_FACTORY.newOrPredicate(); + for (GwtHeader header : headers) { + metricsPredicate.getPredicates().add(STORABLE_PREDICATE_FACTORY.newExistsPredicate(String.format(MessageSchema.MESSAGE_METRICS + ".%s", header.getName()))); + } + andPredicate.getPredicates().add(metricsPredicate); + } query.setPredicate(andPredicate); if (!StringUtils.isEmpty(loadConfig.getSortField())) { String sortField = loadConfig.getSortField(); diff --git a/service/datastore/api/src/main/java/org/eclipse/kapua/service/datastore/model/query/OrPredicate.java b/service/datastore/api/src/main/java/org/eclipse/kapua/service/datastore/model/query/OrPredicate.java new file mode 100644 index 00000000000..428094bc302 --- /dev/null +++ b/service/datastore/api/src/main/java/org/eclipse/kapua/service/datastore/model/query/OrPredicate.java @@ -0,0 +1,29 @@ +/******************************************************************************* + * Copyright (c) 2019 Eurotech and/or its affiliates and others + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Eurotech - initial API and implementation + *******************************************************************************/ +package org.eclipse.kapua.service.datastore.model.query; + +import java.util.List; + +/** + * Query "or" aggregation definition + * + * @since 1.0 + */ +public interface OrPredicate extends StorablePredicate { + + /** + * Get the {@link StorablePredicate} list + * + * @return + */ + List getPredicates(); +} diff --git a/service/datastore/api/src/main/java/org/eclipse/kapua/service/datastore/model/query/StorablePredicateFactory.java b/service/datastore/api/src/main/java/org/eclipse/kapua/service/datastore/model/query/StorablePredicateFactory.java index cc00c93251d..934acb932bf 100644 --- a/service/datastore/api/src/main/java/org/eclipse/kapua/service/datastore/model/query/StorablePredicateFactory.java +++ b/service/datastore/api/src/main/java/org/eclipse/kapua/service/datastore/model/query/StorablePredicateFactory.java @@ -77,4 +77,7 @@ public interface StorablePredicateFactory extends KapuaObjectFactory { * @return The newly instantiated {@link ExistsPredicate}. */ ExistsPredicate newExistsPredicate(String fieldName); + + OrPredicate newOrPredicate(); + } diff --git a/service/datastore/internal/src/main/java/org/eclipse/kapua/service/datastore/internal/model/query/OrPredicateImpl.java b/service/datastore/internal/src/main/java/org/eclipse/kapua/service/datastore/internal/model/query/OrPredicateImpl.java new file mode 100644 index 00000000000..8ffeed5b690 --- /dev/null +++ b/service/datastore/internal/src/main/java/org/eclipse/kapua/service/datastore/internal/model/query/OrPredicateImpl.java @@ -0,0 +1,90 @@ +/******************************************************************************* + * Copyright (c) 2019 Eurotech and/or its affiliates and others + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Eurotech - initial API and implementation + *******************************************************************************/ +package org.eclipse.kapua.service.datastore.internal.model.query; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import org.eclipse.kapua.service.datastore.client.DatamodelMappingException; +import org.eclipse.kapua.service.datastore.internal.schema.SchemaUtil; +import org.eclipse.kapua.service.datastore.model.query.OrPredicate; +import org.eclipse.kapua.service.datastore.model.query.StorablePredicate; + +import com.fasterxml.jackson.databind.node.ArrayNode; +import com.fasterxml.jackson.databind.node.ObjectNode; + +/** + * Implementation of query "or" aggregation + * + * @since 1.0 + */ +public class OrPredicateImpl implements OrPredicate { + + private List predicates = new ArrayList(); + + /** + * Default constructor + */ + public OrPredicateImpl() { + } + + /** + * Creates an "or" predicate for the given predicates collection + * + * @param predicates + */ + public OrPredicateImpl(Collection predicates) { + predicates.addAll(predicates); + } + + @Override + public List getPredicates() { + return this.predicates; + } + + /** + * Add the storable predicate to the predicates collection + * + * @param predicate + * @return + */ + public OrPredicate addPredicate(StorablePredicate predicate) { + this.predicates.add(predicate); + return this; + + } + + /** + * Clear the predicates collection + * + * @return + */ + public OrPredicate clearPredicates() { + this.predicates.clear(); + return this; + } + + @Override + public ObjectNode toSerializedMap() throws DatamodelMappingException { + ObjectNode rootNode = SchemaUtil.getObjectNode(); + ObjectNode termNode = SchemaUtil.getObjectNode(); + ArrayNode conditionsNode = SchemaUtil.getArrayNode(); + for (StorablePredicate predicate : predicates) { + conditionsNode.add(predicate.toSerializedMap()); + } + termNode.set(PredicateConstants.SHOULD_KEY, conditionsNode); + rootNode.set(PredicateConstants.BOOL_KEY, termNode); + return rootNode; + } + +} diff --git a/service/datastore/internal/src/main/java/org/eclipse/kapua/service/datastore/internal/model/query/PredicateConstants.java b/service/datastore/internal/src/main/java/org/eclipse/kapua/service/datastore/internal/model/query/PredicateConstants.java index 437c101ed94..1c4dec0b28a 100644 --- a/service/datastore/internal/src/main/java/org/eclipse/kapua/service/datastore/internal/model/query/PredicateConstants.java +++ b/service/datastore/internal/src/main/java/org/eclipse/kapua/service/datastore/internal/model/query/PredicateConstants.java @@ -43,6 +43,11 @@ public interface PredicateConstants { */ String MUST_KEY = "must"; + /** + * Must term + */ + String SHOULD_KEY = "should"; + /** * Prefix term */ diff --git a/service/datastore/internal/src/main/java/org/eclipse/kapua/service/datastore/internal/model/query/StorablePredicateFactoryImpl.java b/service/datastore/internal/src/main/java/org/eclipse/kapua/service/datastore/internal/model/query/StorablePredicateFactoryImpl.java index e86a6b94b6f..87d675508bd 100644 --- a/service/datastore/internal/src/main/java/org/eclipse/kapua/service/datastore/internal/model/query/StorablePredicateFactoryImpl.java +++ b/service/datastore/internal/src/main/java/org/eclipse/kapua/service/datastore/internal/model/query/StorablePredicateFactoryImpl.java @@ -16,6 +16,7 @@ import org.eclipse.kapua.service.datastore.model.query.ChannelMatchPredicate; import org.eclipse.kapua.service.datastore.model.query.ExistsPredicate; import org.eclipse.kapua.service.datastore.model.query.MetricPredicate; +import org.eclipse.kapua.service.datastore.model.query.OrPredicate; import org.eclipse.kapua.service.datastore.model.query.RangePredicate; import org.eclipse.kapua.service.datastore.model.query.StorableField; import org.eclipse.kapua.service.datastore.model.query.StorablePredicateFactory; @@ -54,4 +55,9 @@ public ExistsPredicate newExistsPredicate(String fieldName) { return new ExistsPredicateImpl(fieldName); } + @Override + public OrPredicate newOrPredicate() { + return new OrPredicateImpl(); + } + }