Loading src/main/java/es/redmic/elasticsearchlib/common/query/SeriesQueryUtils.java 0 → 100644 +170 −0 Original line number Diff line number Diff line package es.redmic.elasticsearchlib.common.query; /*- * #%L * elasticsearch-lib * %% * Copyright (C) 2019 - 2021 REDMIC Project / Server * %% * 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. * #L% */ import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import org.elasticsearch.index.query.BoolQueryBuilder; import org.elasticsearch.index.query.QueryBuilder; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.search.aggregations.bucket.histogram.DateHistogramInterval; import es.redmic.exception.elasticsearch.ESHistogramIntervalQueryException; import es.redmic.models.es.common.query.dto.DataQueryDTO; public abstract class SeriesQueryUtils extends DataQueryUtils { // @FORMATTER:OFF public static final BoolQueryBuilder INTERNAL_QUERY = null; public static final String DEFAULT_FIELD = "value"; public static final String DATETIME_FIELD = "date"; //public static final String PARENT = "geodata"; //public static final String GRANDPARENT = "activity"; // @FORMATTER:ON public static BoolQueryBuilder getQuery(DataQueryDTO queryDTO) { return getSeriesQuery(queryDTO, null, null); } public static BoolQueryBuilder getQuery(DataQueryDTO queryDTO, QueryBuilder internalQuery, QueryBuilder partialQuery) { return getSeriesQuery(queryDTO, internalQuery, partialQuery); } protected static BoolQueryBuilder getSeriesQuery(DataQueryDTO queryDTO, QueryBuilder internalQuery, QueryBuilder partialQuery) { BoolQueryBuilder query = getOrInitializeBaseQuery(getBaseQuery(queryDTO, internalQuery, partialQuery)); addMustTermIfExist(query, getFlagQuery(queryDTO.getQFlags(), QFLAG_PROPERTY)); addMustTermIfExist(query, getFlagQuery(queryDTO.getVFlags(), VFLAG_PROPERTY)); addMustTermIfExist(query, getDateLimitsQuery(queryDTO.getDateLimits(), DATETIME_FIELD)); addMustTermIfExist(query, getValueQuery(queryDTO.getValue(), VALUE_PROPERTY)); addMustTermIfExist(query, getZQuery(Z_PROPERTY, SEARCH_BY_Z_RANGE_SCRIPT, queryDTO.getZ())); return getResultQuery(query); } public static BoolQueryBuilder getItemsQuery(String id) { List<String> ids = new ArrayList<>(); ids.add(id); BoolQueryBuilder query = QueryBuilders.boolQuery(); query.must(QueryBuilders.idsQuery().addIds(ids.toArray(new String[ids.size()]))); return query; } /*-@SuppressWarnings("serial") public static BoolQueryBuilder getItemsQuery(String id, String parentId, String grandparentId, List<Long> accessibilityIds) { List<String> ids = new ArrayList<>(); ids.add(id); return getItemsQuery(ids, parentId, grandparentId, accessibilityIds); }-*/ /*-public static BoolQueryBuilder getItemsQuery(List<String> ids, String parentId, String grandparentId, List<Long> accessibilityIds) { BoolQueryBuilder query = QueryBuilders.boolQuery(); if (accessibilityIds != null && accessibilityIds.size() > 0 && parentId != null && grandparentId != null) query.must(getQueryOnParentAndGrandparent(parentId, grandparentId, accessibilityIds)); else if (accessibilityIds != null && accessibilityIds.size() > 0 && parentId == null && grandparentId == null) query.must(getAccessibilityQueryOnGrandparent(accessibilityIds)); else if (accessibilityIds == null && parentId != null && grandparentId != null) query.must(getQueryByParentAndGrandparent(parentId, grandparentId)); query.must(QueryBuilders.idsQuery().addIds(ids.toArray(new String[ids.size()]))); return query; }-*/ public static DateHistogramInterval getInterval(String interval) { if (!interval.matches("^\\d+[smhdwMqy]$")) throw new ESHistogramIntervalQueryException(interval); return new DateHistogramInterval(interval); } /*-public static QueryBuilder getHierarchicalQuery(DataQueryDTO queryDTO, String parentId, String grandparentId) { List<Long> accessibilityIds = queryDTO.getAccessibilityIds(); if (parentId == null && grandparentId == null && (accessibilityIds == null || accessibilityIds.size() == 0)) return null; if (parentId != null && grandparentId != null && (accessibilityIds == null || accessibilityIds.size() == 0)) return getQueryByParentAndGrandparent(parentId, grandparentId); if (parentId == null || grandparentId == null && (accessibilityIds != null && accessibilityIds.size() > 0)) return getAccessibilityQueryOnGrandparent(accessibilityIds); return getQueryOnParentAndGrandparent(parentId, grandparentId, accessibilityIds); }-*/ /*-public static QueryBuilder getQueryByParentAndGrandparent(String parentId, String grandparentId) { return JoinQueryBuilders.hasParentQuery(PARENT, QueryBuilders.boolQuery() .must(JoinQueryBuilders.hasParentQuery(GRANDPARENT, QueryBuilders.boolQuery().must(QueryBuilders.termQuery("id", grandparentId)), true)) .must(QueryBuilders.termQuery("_id", parentId)), true); }-*/ /*-public static QueryBuilder getQueryOnParentAndGrandparent(String parentId, String grandparentId, List<Long> accessibilityIds) { return JoinQueryBuilders.hasParentQuery(PARENT, QueryBuilders.boolQuery() .must(JoinQueryBuilders.hasParentQuery(GRANDPARENT, QueryBuilders.boolQuery().must(QueryBuilders.termQuery("id", grandparentId)) .must(getAccessibilityQuery(accessibilityIds)), true)) .must(QueryBuilders.termQuery("_id", parentId)), true); }-*/ /*-public static QueryBuilder getAccessibilityQueryOnGrandparent(List<Long> accessibilityIds) { return JoinQueryBuilders.hasParentQuery(PARENT, JoinQueryBuilders.hasParentQuery(GRANDPARENT, getAccessibilityQuery(accessibilityIds), true), true); }-*/ public static Set<String> getFieldsExcludedOnQuery() { HashSet<String> fieldsExcludedOnQuery = new HashSet<>(); fieldsExcludedOnQuery.add(ZRANGE_QUERY_FIELD); return fieldsExcludedOnQuery; } } src/main/java/es/redmic/elasticsearchlib/timeseries/repository/IBaseTimeSeriesESRepository.java→src/main/java/es/redmic/elasticsearchlib/series/repository/IBaseTimeSeriesESRepository.java +3 −3 Original line number Diff line number Diff line package es.redmic.elasticsearchlib.timeseries.repository; package es.redmic.elasticsearchlib.series.repository; /*- * #%L Loading src/main/java/es/redmic/elasticsearchlib/timeseries/repository/RWTimeSeriesESRepository.java→src/main/java/es/redmic/elasticsearchlib/series/repository/IRSeriesESRepository.java +41 −0 Original line number Diff line number Diff line package es.redmic.elasticsearchlib.timeseries.repository; package es.redmic.elasticsearchlib.series.repository; /*- * #%L * elasticsearch-lib * %% * Copyright (C) 2019 REDMIC Project / Server * Copyright (C) 2019 - 2021 REDMIC Project / Server * %% * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. Loading @@ -20,25 +20,22 @@ package es.redmic.elasticsearchlib.timeseries.repository; * #L% */ import org.joda.time.format.DateTimeFormat; import org.springframework.beans.factory.annotation.Value; import java.util.List; import es.redmic.elasticsearchlib.data.repository.RWDataESRepository; import es.redmic.models.es.common.model.BaseTimeDataAbstractES; import es.redmic.models.es.common.query.dto.DataQueryDTO; import org.elasticsearch.search.builder.SearchSourceBuilder; public abstract class RWTimeSeriesESRepository<TModel extends BaseTimeDataAbstractES, TQueryDTO extends DataQueryDTO> extends RWDataESRepository<TModel, TQueryDTO> implements IBaseTimeSeriesESRepository { import es.redmic.models.es.common.model.BaseAbstractStringES; import es.redmic.models.es.common.query.dto.DataQueryDTO; import es.redmic.models.es.common.query.dto.MgetDTO; import es.redmic.models.es.series.common.model.SeriesHitWrapper; import es.redmic.models.es.series.common.model.SeriesHitsWrapper; import es.redmic.models.es.series.common.model.SeriesSearchWrapper; @Value("${timeseries.index.pattern}") String timeSeriesIndexPattern; public interface IRSeriesESRepository<TModel extends BaseAbstractStringES> extends IBaseTimeSeriesESRepository { public RWTimeSeriesESRepository() { super(IBaseTimeSeriesESRepository.INDEX, IBaseTimeSeriesESRepository.TYPE, true); } @Override protected String getIndex(final TModel modelToIndex) { return getIndex()[0] + "-" + modelToIndex.getDate().toString(DateTimeFormat.forPattern(timeSeriesIndexPattern)); } public SeriesHitWrapper<TModel> findById(String id); public SeriesSearchWrapper<TModel> searchByIds(String[] ids); public SeriesSearchWrapper<TModel> find(DataQueryDTO queryDTO); public List<SeriesSearchWrapper<TModel>> multiFind(List<SearchSourceBuilder> searchs); public SeriesHitsWrapper<TModel> mget(MgetDTO dto); } src/main/java/es/redmic/elasticsearchlib/series/repository/RSeriesESRepository.java 0 → 100644 +216 −0 Original line number Diff line number Diff line package es.redmic.elasticsearchlib.series.repository; import java.util.ArrayList; import java.util.List; import java.util.Map; import com.fasterxml.jackson.databind.JavaType; import org.elasticsearch.index.query.QueryBuilder; import org.elasticsearch.action.search.MultiSearchResponse; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.index.query.BoolQueryBuilder; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.search.builder.SearchSourceBuilder; import org.elasticsearch.search.sort.SortBuilder; import org.elasticsearch.search.sort.SortBuilders; import org.elasticsearch.search.sort.SortOrder; /*- * #%L * elasticsearch-lib * %% * Copyright (C) 2019 REDMIC Project / Server * %% * 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. * #L% */ import org.springframework.beans.factory.annotation.Value; import es.redmic.elasticsearchlib.common.query.SeriesQueryUtils; import es.redmic.elasticsearchlib.common.repository.RBaseESRepository; import es.redmic.exception.data.ItemNotFoundException; import es.redmic.models.es.common.model.BaseAbstractStringES; import es.redmic.models.es.common.query.dto.DataQueryDTO; import es.redmic.models.es.common.query.dto.MgetDTO; import es.redmic.models.es.series.common.model.SeriesHitWrapper; import es.redmic.models.es.series.common.model.SeriesHitsWrapper; import es.redmic.models.es.series.common.model.SeriesSearchWrapper; public abstract class RSeriesESRepository<TModel extends BaseAbstractStringES, TQueryDTO extends DataQueryDTO> extends RBaseESRepository<TModel, TQueryDTO> implements IRSeriesESRepository<TModel> { @Value("${timeseries.index.pattern}") protected String timeSeriesIndexPattern; private static final String DATADEFINITION_PROPERTY = "dataDefinition"; protected RSeriesESRepository() { super(IBaseTimeSeriesESRepository.INDEX, IBaseTimeSeriesESRepository.TYPE, true); } @Override public SeriesHitWrapper<TModel> findById(String id) { BoolQueryBuilder query = SeriesQueryUtils.getItemsQuery(id); SeriesSearchWrapper<TModel> result = findBy(query); if (result.getHits() == null || result.getHits().getHits() == null || result.getHits().getHits().size() != 1) throw new ItemNotFoundException("id", id); return result.getHits().getHits().get(0); } @Override public SeriesHitsWrapper<TModel> mget(MgetDTO dto) { List<String> ids = dto.getIds(); BoolQueryBuilder query = SeriesQueryUtils.getItemsQuery(ids); SeriesSearchWrapper<TModel> result = findBy(query, dto.getFields()); if (result.getHits() == null || result.getHits().getHits() == null) throw new ItemNotFoundException("ids", dto.getIds().toString()); if (result.getHits().getHits().size() != ids.size()) { for (SeriesHitWrapper<?> hit : result.getHits().getHits()) { ids.remove(hit.get_id()); } throw new ItemNotFoundException("ids", ids.toString()); } return result.getHits(); } @Override public SeriesSearchWrapper<TModel> searchByIds(String[] ids) { return findBy(QueryBuilders.idsQuery().addIds(ids)); } protected SeriesSearchWrapper<TModel> findBy(QueryBuilder queryBuilder) { return findBy(queryBuilder, null); } protected SeriesSearchWrapper<TModel> findBy(QueryBuilder queryBuilder, List<String> returnFields) { return searchResponseToWrapper(searchRequest(queryBuilder, returnFields), getSourceType(SeriesSearchWrapper.class)); } @Override public SeriesSearchWrapper<TModel> find(DataQueryDTO queryDTO) { QueryBuilder serviceQuery = SeriesQueryUtils.getQuery(queryDTO); SearchResponse result = searchRequest(serviceQuery); if (result.getFailedShards() > 0) return null; return searchResponseToWrapper(result, getSourceType(SeriesSearchWrapper.class)); } @Override public List<SeriesSearchWrapper<TModel>> multiFind(List<SearchSourceBuilder> searchs) { List<SeriesSearchWrapper<TModel>> results = new ArrayList<>(); MultiSearchResponse resultRequest = super.getMultiFindResponses(searchs); for (MultiSearchResponse.Item item : resultRequest.getResponses()) { SearchResponse response = item.getResponse(); results.add(searchResponseToWrapper(response, getSourceType(SeriesSearchWrapper.class))); } return results; } /** * Función que nos devuelve el size de la query El size del exterior tiene * preferencia, en caso de no exista, se devuelve todo lo almacenado. * * @param size. * Size enviado desde queryDto * @param queryDTO. * queryDto para obtener parámetros de query enviados por el cliente * * @return numero de elementos que devolverá la query */ @Override protected Integer getSize(TQueryDTO queryDTO, BoolQueryBuilder query) { if ((queryDTO.getAggs() != null && !queryDTO.getAggs().isEmpty()) || (queryDTO.getInterval() != null)) return 0; return super.getSize(queryDTO, query); } /** * Función que nos devuelve una lista de ordenaciones específica para * timeseries. Por defecto, ordena por id. * * @return lista de ordenaciones de elasticsearch */ @Override protected List<SortBuilder<?>> getSort() { List<SortBuilder<?>> sorts = new ArrayList<>(); sorts.add(SortBuilders.fieldSort(dateTimeField).order(SortOrder.ASC)); return sorts; } /** * Función que sobrescribe a getTermQuery de RElasticSearchRepository para * añadir implementación específica para crear una query a apartir de una serie * de términos obtenidos por el controlador. */ @SuppressWarnings("unchecked") @Override protected QueryBuilder getTermQuery(Map<String, Object> terms, BoolQueryBuilder query) { if (terms.containsKey(DATADEFINITION_PROPERTY)) { List<Integer> ids = (List<Integer>) (List<?>) terms.get(DATADEFINITION_PROPERTY); query.must(QueryBuilders.boolQuery().filter(QueryBuilders.termsQuery(DATADEFINITION_PROPERTY, ids))); } return super.getTermQuery(terms, query); } @Override protected List<?> scrollQueryReturnItems(QueryBuilder builder) { return scrollQueryReturnItems(builder, new SeriesItemsProcessingFunction<TModel>(typeOfTModel, objectMapper)); } @Override protected JavaType getSourceType(Class<?> wrapperClass) { return objectMapper.getTypeFactory().constructParametricType(wrapperClass, typeOfTModel); } public DataQueryDTO createSimpleQueryDTOFromQueryParams(Integer from, Integer size) { DataQueryDTO queryDTO = new DataQueryDTO(); if (from != null) queryDTO.setFrom(from); if (size != null) queryDTO.setSize(size); return queryDTO; } } src/main/java/es/redmic/elasticsearchlib/timeseries/repository/RTimeSeriesESRepository.java→src/main/java/es/redmic/elasticsearchlib/series/repository/RWSeriesESRepository.java +9 −8 Original line number Diff line number Diff line package es.redmic.elasticsearchlib.timeseries.repository; package es.redmic.elasticsearchlib.series.repository; /*- * #%L Loading @@ -20,25 +20,26 @@ package es.redmic.elasticsearchlib.timeseries.repository; * #L% */ import es.redmic.elasticsearchlib.common.repository.RBaseESRepository; import org.joda.time.format.DateTimeFormat; import org.springframework.beans.factory.annotation.Value; import es.redmic.elasticsearchlib.data.repository.RDataESRepository; import es.redmic.models.es.common.model.BaseTimeDataAbstractES; import es.redmic.models.es.common.query.dto.DataQueryDTO; public abstract class RTimeSeriesESRepository<TModel extends BaseTimeDataAbstractES, TQueryDTO extends DataQueryDTO> extends RDataESRepository<TModel, TQueryDTO> implements IBaseTimeSeriesESRepository { public abstract class RWSeriesESRepository<TModel extends BaseTimeDataAbstractES, TQueryDTO extends DataQueryDTO> extends RBaseESRepository<TModel, TQueryDTO> implements IBaseTimeSeriesESRepository { @Value("${timeseries.index.pattern}") String timeSeriesIndexPattern; public RTimeSeriesESRepository() { protected RWSeriesESRepository() { super(IBaseTimeSeriesESRepository.INDEX, IBaseTimeSeriesESRepository.TYPE, true); } @Override protected String getIndex(final TModel modelToIndex) { return getIndex()[0] + "-" + modelToIndex.getDate().toString(DateTimeFormat.forPattern(timeSeriesIndexPattern)); return super.getIndex()[0] + "-" + modelToIndex.getDate().toString(DateTimeFormat.forPattern(timeSeriesIndexPattern)); } } Loading
src/main/java/es/redmic/elasticsearchlib/common/query/SeriesQueryUtils.java 0 → 100644 +170 −0 Original line number Diff line number Diff line package es.redmic.elasticsearchlib.common.query; /*- * #%L * elasticsearch-lib * %% * Copyright (C) 2019 - 2021 REDMIC Project / Server * %% * 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. * #L% */ import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import org.elasticsearch.index.query.BoolQueryBuilder; import org.elasticsearch.index.query.QueryBuilder; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.search.aggregations.bucket.histogram.DateHistogramInterval; import es.redmic.exception.elasticsearch.ESHistogramIntervalQueryException; import es.redmic.models.es.common.query.dto.DataQueryDTO; public abstract class SeriesQueryUtils extends DataQueryUtils { // @FORMATTER:OFF public static final BoolQueryBuilder INTERNAL_QUERY = null; public static final String DEFAULT_FIELD = "value"; public static final String DATETIME_FIELD = "date"; //public static final String PARENT = "geodata"; //public static final String GRANDPARENT = "activity"; // @FORMATTER:ON public static BoolQueryBuilder getQuery(DataQueryDTO queryDTO) { return getSeriesQuery(queryDTO, null, null); } public static BoolQueryBuilder getQuery(DataQueryDTO queryDTO, QueryBuilder internalQuery, QueryBuilder partialQuery) { return getSeriesQuery(queryDTO, internalQuery, partialQuery); } protected static BoolQueryBuilder getSeriesQuery(DataQueryDTO queryDTO, QueryBuilder internalQuery, QueryBuilder partialQuery) { BoolQueryBuilder query = getOrInitializeBaseQuery(getBaseQuery(queryDTO, internalQuery, partialQuery)); addMustTermIfExist(query, getFlagQuery(queryDTO.getQFlags(), QFLAG_PROPERTY)); addMustTermIfExist(query, getFlagQuery(queryDTO.getVFlags(), VFLAG_PROPERTY)); addMustTermIfExist(query, getDateLimitsQuery(queryDTO.getDateLimits(), DATETIME_FIELD)); addMustTermIfExist(query, getValueQuery(queryDTO.getValue(), VALUE_PROPERTY)); addMustTermIfExist(query, getZQuery(Z_PROPERTY, SEARCH_BY_Z_RANGE_SCRIPT, queryDTO.getZ())); return getResultQuery(query); } public static BoolQueryBuilder getItemsQuery(String id) { List<String> ids = new ArrayList<>(); ids.add(id); BoolQueryBuilder query = QueryBuilders.boolQuery(); query.must(QueryBuilders.idsQuery().addIds(ids.toArray(new String[ids.size()]))); return query; } /*-@SuppressWarnings("serial") public static BoolQueryBuilder getItemsQuery(String id, String parentId, String grandparentId, List<Long> accessibilityIds) { List<String> ids = new ArrayList<>(); ids.add(id); return getItemsQuery(ids, parentId, grandparentId, accessibilityIds); }-*/ /*-public static BoolQueryBuilder getItemsQuery(List<String> ids, String parentId, String grandparentId, List<Long> accessibilityIds) { BoolQueryBuilder query = QueryBuilders.boolQuery(); if (accessibilityIds != null && accessibilityIds.size() > 0 && parentId != null && grandparentId != null) query.must(getQueryOnParentAndGrandparent(parentId, grandparentId, accessibilityIds)); else if (accessibilityIds != null && accessibilityIds.size() > 0 && parentId == null && grandparentId == null) query.must(getAccessibilityQueryOnGrandparent(accessibilityIds)); else if (accessibilityIds == null && parentId != null && grandparentId != null) query.must(getQueryByParentAndGrandparent(parentId, grandparentId)); query.must(QueryBuilders.idsQuery().addIds(ids.toArray(new String[ids.size()]))); return query; }-*/ public static DateHistogramInterval getInterval(String interval) { if (!interval.matches("^\\d+[smhdwMqy]$")) throw new ESHistogramIntervalQueryException(interval); return new DateHistogramInterval(interval); } /*-public static QueryBuilder getHierarchicalQuery(DataQueryDTO queryDTO, String parentId, String grandparentId) { List<Long> accessibilityIds = queryDTO.getAccessibilityIds(); if (parentId == null && grandparentId == null && (accessibilityIds == null || accessibilityIds.size() == 0)) return null; if (parentId != null && grandparentId != null && (accessibilityIds == null || accessibilityIds.size() == 0)) return getQueryByParentAndGrandparent(parentId, grandparentId); if (parentId == null || grandparentId == null && (accessibilityIds != null && accessibilityIds.size() > 0)) return getAccessibilityQueryOnGrandparent(accessibilityIds); return getQueryOnParentAndGrandparent(parentId, grandparentId, accessibilityIds); }-*/ /*-public static QueryBuilder getQueryByParentAndGrandparent(String parentId, String grandparentId) { return JoinQueryBuilders.hasParentQuery(PARENT, QueryBuilders.boolQuery() .must(JoinQueryBuilders.hasParentQuery(GRANDPARENT, QueryBuilders.boolQuery().must(QueryBuilders.termQuery("id", grandparentId)), true)) .must(QueryBuilders.termQuery("_id", parentId)), true); }-*/ /*-public static QueryBuilder getQueryOnParentAndGrandparent(String parentId, String grandparentId, List<Long> accessibilityIds) { return JoinQueryBuilders.hasParentQuery(PARENT, QueryBuilders.boolQuery() .must(JoinQueryBuilders.hasParentQuery(GRANDPARENT, QueryBuilders.boolQuery().must(QueryBuilders.termQuery("id", grandparentId)) .must(getAccessibilityQuery(accessibilityIds)), true)) .must(QueryBuilders.termQuery("_id", parentId)), true); }-*/ /*-public static QueryBuilder getAccessibilityQueryOnGrandparent(List<Long> accessibilityIds) { return JoinQueryBuilders.hasParentQuery(PARENT, JoinQueryBuilders.hasParentQuery(GRANDPARENT, getAccessibilityQuery(accessibilityIds), true), true); }-*/ public static Set<String> getFieldsExcludedOnQuery() { HashSet<String> fieldsExcludedOnQuery = new HashSet<>(); fieldsExcludedOnQuery.add(ZRANGE_QUERY_FIELD); return fieldsExcludedOnQuery; } }
src/main/java/es/redmic/elasticsearchlib/timeseries/repository/IBaseTimeSeriesESRepository.java→src/main/java/es/redmic/elasticsearchlib/series/repository/IBaseTimeSeriesESRepository.java +3 −3 Original line number Diff line number Diff line package es.redmic.elasticsearchlib.timeseries.repository; package es.redmic.elasticsearchlib.series.repository; /*- * #%L Loading
src/main/java/es/redmic/elasticsearchlib/timeseries/repository/RWTimeSeriesESRepository.java→src/main/java/es/redmic/elasticsearchlib/series/repository/IRSeriesESRepository.java +41 −0 Original line number Diff line number Diff line package es.redmic.elasticsearchlib.timeseries.repository; package es.redmic.elasticsearchlib.series.repository; /*- * #%L * elasticsearch-lib * %% * Copyright (C) 2019 REDMIC Project / Server * Copyright (C) 2019 - 2021 REDMIC Project / Server * %% * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. Loading @@ -20,25 +20,22 @@ package es.redmic.elasticsearchlib.timeseries.repository; * #L% */ import org.joda.time.format.DateTimeFormat; import org.springframework.beans.factory.annotation.Value; import java.util.List; import es.redmic.elasticsearchlib.data.repository.RWDataESRepository; import es.redmic.models.es.common.model.BaseTimeDataAbstractES; import es.redmic.models.es.common.query.dto.DataQueryDTO; import org.elasticsearch.search.builder.SearchSourceBuilder; public abstract class RWTimeSeriesESRepository<TModel extends BaseTimeDataAbstractES, TQueryDTO extends DataQueryDTO> extends RWDataESRepository<TModel, TQueryDTO> implements IBaseTimeSeriesESRepository { import es.redmic.models.es.common.model.BaseAbstractStringES; import es.redmic.models.es.common.query.dto.DataQueryDTO; import es.redmic.models.es.common.query.dto.MgetDTO; import es.redmic.models.es.series.common.model.SeriesHitWrapper; import es.redmic.models.es.series.common.model.SeriesHitsWrapper; import es.redmic.models.es.series.common.model.SeriesSearchWrapper; @Value("${timeseries.index.pattern}") String timeSeriesIndexPattern; public interface IRSeriesESRepository<TModel extends BaseAbstractStringES> extends IBaseTimeSeriesESRepository { public RWTimeSeriesESRepository() { super(IBaseTimeSeriesESRepository.INDEX, IBaseTimeSeriesESRepository.TYPE, true); } @Override protected String getIndex(final TModel modelToIndex) { return getIndex()[0] + "-" + modelToIndex.getDate().toString(DateTimeFormat.forPattern(timeSeriesIndexPattern)); } public SeriesHitWrapper<TModel> findById(String id); public SeriesSearchWrapper<TModel> searchByIds(String[] ids); public SeriesSearchWrapper<TModel> find(DataQueryDTO queryDTO); public List<SeriesSearchWrapper<TModel>> multiFind(List<SearchSourceBuilder> searchs); public SeriesHitsWrapper<TModel> mget(MgetDTO dto); }
src/main/java/es/redmic/elasticsearchlib/series/repository/RSeriesESRepository.java 0 → 100644 +216 −0 Original line number Diff line number Diff line package es.redmic.elasticsearchlib.series.repository; import java.util.ArrayList; import java.util.List; import java.util.Map; import com.fasterxml.jackson.databind.JavaType; import org.elasticsearch.index.query.QueryBuilder; import org.elasticsearch.action.search.MultiSearchResponse; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.index.query.BoolQueryBuilder; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.search.builder.SearchSourceBuilder; import org.elasticsearch.search.sort.SortBuilder; import org.elasticsearch.search.sort.SortBuilders; import org.elasticsearch.search.sort.SortOrder; /*- * #%L * elasticsearch-lib * %% * Copyright (C) 2019 REDMIC Project / Server * %% * 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. * #L% */ import org.springframework.beans.factory.annotation.Value; import es.redmic.elasticsearchlib.common.query.SeriesQueryUtils; import es.redmic.elasticsearchlib.common.repository.RBaseESRepository; import es.redmic.exception.data.ItemNotFoundException; import es.redmic.models.es.common.model.BaseAbstractStringES; import es.redmic.models.es.common.query.dto.DataQueryDTO; import es.redmic.models.es.common.query.dto.MgetDTO; import es.redmic.models.es.series.common.model.SeriesHitWrapper; import es.redmic.models.es.series.common.model.SeriesHitsWrapper; import es.redmic.models.es.series.common.model.SeriesSearchWrapper; public abstract class RSeriesESRepository<TModel extends BaseAbstractStringES, TQueryDTO extends DataQueryDTO> extends RBaseESRepository<TModel, TQueryDTO> implements IRSeriesESRepository<TModel> { @Value("${timeseries.index.pattern}") protected String timeSeriesIndexPattern; private static final String DATADEFINITION_PROPERTY = "dataDefinition"; protected RSeriesESRepository() { super(IBaseTimeSeriesESRepository.INDEX, IBaseTimeSeriesESRepository.TYPE, true); } @Override public SeriesHitWrapper<TModel> findById(String id) { BoolQueryBuilder query = SeriesQueryUtils.getItemsQuery(id); SeriesSearchWrapper<TModel> result = findBy(query); if (result.getHits() == null || result.getHits().getHits() == null || result.getHits().getHits().size() != 1) throw new ItemNotFoundException("id", id); return result.getHits().getHits().get(0); } @Override public SeriesHitsWrapper<TModel> mget(MgetDTO dto) { List<String> ids = dto.getIds(); BoolQueryBuilder query = SeriesQueryUtils.getItemsQuery(ids); SeriesSearchWrapper<TModel> result = findBy(query, dto.getFields()); if (result.getHits() == null || result.getHits().getHits() == null) throw new ItemNotFoundException("ids", dto.getIds().toString()); if (result.getHits().getHits().size() != ids.size()) { for (SeriesHitWrapper<?> hit : result.getHits().getHits()) { ids.remove(hit.get_id()); } throw new ItemNotFoundException("ids", ids.toString()); } return result.getHits(); } @Override public SeriesSearchWrapper<TModel> searchByIds(String[] ids) { return findBy(QueryBuilders.idsQuery().addIds(ids)); } protected SeriesSearchWrapper<TModel> findBy(QueryBuilder queryBuilder) { return findBy(queryBuilder, null); } protected SeriesSearchWrapper<TModel> findBy(QueryBuilder queryBuilder, List<String> returnFields) { return searchResponseToWrapper(searchRequest(queryBuilder, returnFields), getSourceType(SeriesSearchWrapper.class)); } @Override public SeriesSearchWrapper<TModel> find(DataQueryDTO queryDTO) { QueryBuilder serviceQuery = SeriesQueryUtils.getQuery(queryDTO); SearchResponse result = searchRequest(serviceQuery); if (result.getFailedShards() > 0) return null; return searchResponseToWrapper(result, getSourceType(SeriesSearchWrapper.class)); } @Override public List<SeriesSearchWrapper<TModel>> multiFind(List<SearchSourceBuilder> searchs) { List<SeriesSearchWrapper<TModel>> results = new ArrayList<>(); MultiSearchResponse resultRequest = super.getMultiFindResponses(searchs); for (MultiSearchResponse.Item item : resultRequest.getResponses()) { SearchResponse response = item.getResponse(); results.add(searchResponseToWrapper(response, getSourceType(SeriesSearchWrapper.class))); } return results; } /** * Función que nos devuelve el size de la query El size del exterior tiene * preferencia, en caso de no exista, se devuelve todo lo almacenado. * * @param size. * Size enviado desde queryDto * @param queryDTO. * queryDto para obtener parámetros de query enviados por el cliente * * @return numero de elementos que devolverá la query */ @Override protected Integer getSize(TQueryDTO queryDTO, BoolQueryBuilder query) { if ((queryDTO.getAggs() != null && !queryDTO.getAggs().isEmpty()) || (queryDTO.getInterval() != null)) return 0; return super.getSize(queryDTO, query); } /** * Función que nos devuelve una lista de ordenaciones específica para * timeseries. Por defecto, ordena por id. * * @return lista de ordenaciones de elasticsearch */ @Override protected List<SortBuilder<?>> getSort() { List<SortBuilder<?>> sorts = new ArrayList<>(); sorts.add(SortBuilders.fieldSort(dateTimeField).order(SortOrder.ASC)); return sorts; } /** * Función que sobrescribe a getTermQuery de RElasticSearchRepository para * añadir implementación específica para crear una query a apartir de una serie * de términos obtenidos por el controlador. */ @SuppressWarnings("unchecked") @Override protected QueryBuilder getTermQuery(Map<String, Object> terms, BoolQueryBuilder query) { if (terms.containsKey(DATADEFINITION_PROPERTY)) { List<Integer> ids = (List<Integer>) (List<?>) terms.get(DATADEFINITION_PROPERTY); query.must(QueryBuilders.boolQuery().filter(QueryBuilders.termsQuery(DATADEFINITION_PROPERTY, ids))); } return super.getTermQuery(terms, query); } @Override protected List<?> scrollQueryReturnItems(QueryBuilder builder) { return scrollQueryReturnItems(builder, new SeriesItemsProcessingFunction<TModel>(typeOfTModel, objectMapper)); } @Override protected JavaType getSourceType(Class<?> wrapperClass) { return objectMapper.getTypeFactory().constructParametricType(wrapperClass, typeOfTModel); } public DataQueryDTO createSimpleQueryDTOFromQueryParams(Integer from, Integer size) { DataQueryDTO queryDTO = new DataQueryDTO(); if (from != null) queryDTO.setFrom(from); if (size != null) queryDTO.setSize(size); return queryDTO; } }
src/main/java/es/redmic/elasticsearchlib/timeseries/repository/RTimeSeriesESRepository.java→src/main/java/es/redmic/elasticsearchlib/series/repository/RWSeriesESRepository.java +9 −8 Original line number Diff line number Diff line package es.redmic.elasticsearchlib.timeseries.repository; package es.redmic.elasticsearchlib.series.repository; /*- * #%L Loading @@ -20,25 +20,26 @@ package es.redmic.elasticsearchlib.timeseries.repository; * #L% */ import es.redmic.elasticsearchlib.common.repository.RBaseESRepository; import org.joda.time.format.DateTimeFormat; import org.springframework.beans.factory.annotation.Value; import es.redmic.elasticsearchlib.data.repository.RDataESRepository; import es.redmic.models.es.common.model.BaseTimeDataAbstractES; import es.redmic.models.es.common.query.dto.DataQueryDTO; public abstract class RTimeSeriesESRepository<TModel extends BaseTimeDataAbstractES, TQueryDTO extends DataQueryDTO> extends RDataESRepository<TModel, TQueryDTO> implements IBaseTimeSeriesESRepository { public abstract class RWSeriesESRepository<TModel extends BaseTimeDataAbstractES, TQueryDTO extends DataQueryDTO> extends RBaseESRepository<TModel, TQueryDTO> implements IBaseTimeSeriesESRepository { @Value("${timeseries.index.pattern}") String timeSeriesIndexPattern; public RTimeSeriesESRepository() { protected RWSeriesESRepository() { super(IBaseTimeSeriesESRepository.INDEX, IBaseTimeSeriesESRepository.TYPE, true); } @Override protected String getIndex(final TModel modelToIndex) { return getIndex()[0] + "-" + modelToIndex.getDate().toString(DateTimeFormat.forPattern(timeSeriesIndexPattern)); return super.getIndex()[0] + "-" + modelToIndex.getDate().toString(DateTimeFormat.forPattern(timeSeriesIndexPattern)); } }