package com.silverforge.elasticsearchrawclient.queryDSL.queries.innerQueries; import android.util.Log; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.base.Optional; import com.silverforge.elasticsearchrawclient.exceptions.MandatoryParametersAreMissingException; import com.silverforge.elasticsearchrawclient.model.LikeDoc; import com.silverforge.elasticsearchrawclient.model.QueryTypeItem; import com.silverforge.elasticsearchrawclient.queryDSL.Constants; import com.silverforge.elasticsearchrawclient.definition.Queryable; import com.silverforge.elasticsearchrawclient.queryDSL.generator.QueryFactory; import com.silverforge.elasticsearchrawclient.utils.QueryTypeArrayList; import com.silverforge.elasticsearchrawclient.utils.StringUtils; import java.util.List; import static br.com.zbra.androidlinq.Linq.*; public class MoreLikeThisQuery implements Queryable { private QueryTypeArrayList<QueryTypeItem> queryBag = new QueryTypeArrayList<>(); MoreLikeThisQuery(QueryTypeArrayList<QueryTypeItem> queryBag) { this.queryBag = queryBag; } @Override public String getQueryString() { return QueryFactory .moreLikeThisQueryGenerator() .generate(queryBag); } public static MoreLikeThisQueryBuilder builder() { return new MoreLikeThisQueryBuilder(); } public static class MoreLikeThisQueryBuilder extends Init<MoreLikeThisQueryBuilder> { @Override protected MoreLikeThisQueryBuilder self() { return this; } } public static abstract class Init<T extends Init<T>> { private static final String TAG = MoreLikeThisQuery.Init.class.getName(); private QueryTypeArrayList<QueryTypeItem> queryBag = new QueryTypeArrayList<>(); protected abstract T self(); public T fields(String... fieldNames) { queryBag.addItemsWithParenthesis(Constants.FIELDS, fieldNames); return self(); } public T like(String like) { queryBag.addItem(Constants.LIKE, like); return self(); } public T like(String[] likeTexts) { return like(null, likeTexts); } public T like(LikeDoc[] likeDocs) { return like(likeDocs, null); } public T like(LikeDoc[] likeDocs, String[] likeTexts) { Optional<LikeDoc[]> guardedLikeDocs = Optional.fromNullable(likeDocs); Optional<String[]> guardedLikeTexts = Optional.fromNullable(likeTexts); ObjectMapper mapper = new ObjectMapper(); List<String> docJsons = stream(guardedLikeDocs.or(new LikeDoc[]{})) .select(ld -> { String json = "{}"; try { json = mapper.writeValueAsString(ld); } catch (JsonProcessingException e) { e.printStackTrace(); Log.e(TAG, e.getMessage()); } return json; }) .toList(); String joinedLikeTexts = StringUtils .makeCommaSeparatedListWithQuotationMark(guardedLikeTexts.or(new String[]{})); docJsons.add(joinedLikeTexts); String value = "[" + StringUtils.makeCommaSeparatedList(docJsons) + "]"; queryBag.addItem(Constants.LIKE, value); return self(); } public T minTermFreq(int value) { queryBag.addItem(Constants.MIN_TERM_FREQ, value); return self(); } public T minTermFreq(float value) { queryBag.addItem(Constants.MIN_TERM_FREQ, value); return self(); } public T maxQueryTerms(int value) { queryBag.addItem(Constants.MAX_QUERY_TERMS, value); return self(); } public T maxQueryTerms(float value) { queryBag.addItem(Constants.MAX_QUERY_TERMS, value); return self(); } public MoreLikeThisQuery build() throws MandatoryParametersAreMissingException { if (!queryBag.containsKey(Constants.LIKE)) throw new MandatoryParametersAreMissingException("like"); return new MoreLikeThisQuery(queryBag); } } }