Commit 8634cc6b authored by Noel Alonso's avatar Noel Alonso
Browse files

Cambia base común y añade funcionalidades

parent b9ba0319
Loading
Loading
Loading
Loading
+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;
	}
}
+3 −3
Original line number Diff line number Diff line
package es.redmic.elasticsearchlib.timeseries.repository;
package es.redmic.elasticsearchlib.series.repository;

/*-
 * #%L
+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.
@@ -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);
}
+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;
	}
}
+9 −8
Original line number Diff line number Diff line
package es.redmic.elasticsearchlib.timeseries.repository;
package es.redmic.elasticsearchlib.series.repository;

/*-
 * #%L
@@ -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