com.arakelian.elastic.search.WriteQueryVisitor Maven / Gradle / Ivy
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.
*/
package com.arakelian.elastic.search;
import java.io.IOException;
import java.io.UncheckedIOException;
import java.util.List;
import java.util.Set;
import com.arakelian.elastic.model.VersionComponents;
import com.arakelian.elastic.model.enums.RegexpFlag;
import com.arakelian.elastic.model.search.BoolQuery;
import com.arakelian.elastic.model.search.ExistsQuery;
import com.arakelian.elastic.model.search.FuzzyQuery;
import com.arakelian.elastic.model.search.GeoBoundingBoxQuery;
import com.arakelian.elastic.model.search.GeoDistanceQuery;
import com.arakelian.elastic.model.search.GeoPolygonQuery;
import com.arakelian.elastic.model.search.GeoShapeQuery;
import com.arakelian.elastic.model.search.IdsQuery;
import com.arakelian.elastic.model.search.IndexedShape;
import com.arakelian.elastic.model.search.MatchQuery;
import com.arakelian.elastic.model.search.MoreLikeThisQuery;
import com.arakelian.elastic.model.search.PrefixQuery;
import com.arakelian.elastic.model.search.Query;
import com.arakelian.elastic.model.search.QueryStringQuery;
import com.arakelian.elastic.model.search.RangeQuery;
import com.arakelian.elastic.model.search.RegexpQuery;
import com.arakelian.elastic.model.search.Shape;
import com.arakelian.elastic.model.search.StandardQuery;
import com.arakelian.elastic.model.search.TermsQuery;
import com.arakelian.elastic.model.search.WildcardQuery;
import com.fasterxml.jackson.core.JsonGenerator;
import com.google.common.base.Joiner;
public class WriteQueryVisitor extends AbstractVisitor implements QueryVisitor {
public WriteQueryVisitor(final JsonGenerator writer, final VersionComponents version) {
super(writer, version);
}
@Override
public boolean enterBoolQuery(final BoolQuery bool) {
try {
writer.writeFieldName("bool");
writer.writeStartObject();
writeStandardFields(bool);
writeClauses("must", bool.getMustClauses());
writeClauses("filter", bool.getFilterClauses());
writeClauses("must_not", bool.getMustNotClauses());
writeClauses("should", bool.getShouldClauses());
writeFieldValue("minimum_should_match", bool.getMinimumShouldMatch());
writer.writeEndObject(); // bool
} catch (final IOException e) {
throw new UncheckedIOException(e);
}
return false;
}
@Override
public boolean enterExistsQuery(final ExistsQuery exists) {
try {
writer.writeFieldName("exists");
writer.writeStartObject();
writeStandardFields(exists);
writer.writeFieldName("field");
writer.writeString(exists.getFieldName());
writer.writeEndObject(); // exists
} catch (final IOException e) {
throw new UncheckedIOException(e);
}
return false;
}
@Override
public boolean enterFuzzyQuery(final FuzzyQuery fuzzy) {
try {
writer.writeFieldName("fuzzy");
writer.writeStartObject();
writer.writeFieldName(fuzzy.getFieldName());
final Object value = fuzzy.getValue();
if (value instanceof CharSequence && fuzzy.hasFuzzyDefaults()) {
writer.writeObject(value);
} else {
writer.writeStartObject();
writeStandardFields(fuzzy);
writeFieldValue("value", value);
writeFieldValue("fuzziness", fuzzy.getFuzziness());
writeFieldValue("prefix_length", fuzzy.getPrefixLength());
writeFieldValue("max_expansions", fuzzy.getMaxExpansions());
writeFieldValue("transpositions", fuzzy.getTranspositions());
writeFieldValue("rewrite", fuzzy.getRewrite());
writer.writeEndObject();
}
writer.writeEndObject(); // fuzzy
} catch (final IOException e) {
throw new UncheckedIOException(e);
}
return false;
}
@Override
public boolean enterGeoBoundingBoxQuery(final GeoBoundingBoxQuery geoBoundingBox) {
try {
writer.writeFieldName("geo_bounding_box");
writer.writeStartObject();
writeStandardFields(geoBoundingBox);
writer.writeFieldName(geoBoundingBox.getFieldName());
writer.writeStartObject();
writeFieldValue("top_left", geoBoundingBox.getTopLeft());
writeFieldValue("top_right", geoBoundingBox.getTopRight());
writeFieldValue("bottom_right", geoBoundingBox.getBottomRight());
writeFieldValue("bottom_left", geoBoundingBox.getBottomLeft());
writer.writeEndObject(); // field
writeFieldValue("validation_method", geoBoundingBox.getValidationMethod());
writeFieldValue("type", geoBoundingBox.getType());
writer.writeEndObject(); // geo_bounding_box
} catch (final IOException e) {
throw new UncheckedIOException(e);
}
return false;
}
@Override
public boolean enterGeoDistanceQuery(final GeoDistanceQuery geoDistance) {
try {
writer.writeFieldName("geo_distance");
writer.writeStartObject();
writeStandardFields(geoDistance);
writeFieldValue("distance", geoDistance.getDistance());
writeFieldValue("distance_type", geoDistance.getDistanceType());
writeFieldValue(geoDistance.getFieldName(), geoDistance.getPoint());
writeFieldValue("validation_method", geoDistance.getValidationMethod());
writer.writeEndObject(); // geo_distance
} catch (final IOException e) {
throw new UncheckedIOException(e);
}
return false;
}
@Override
public boolean enterGeoPolygonQuery(final GeoPolygonQuery geoPolygon) {
try {
writer.writeFieldName("geo_polygon");
writer.writeStartObject();
writeStandardFields(geoPolygon);
writer.writeFieldName(geoPolygon.getFieldName());
writer.writeStartObject();
writeFieldValue("points", geoPolygon.getPoints());
writer.writeEndObject(); // field
writeFieldValue("validation_method", geoPolygon.getValidationMethod());
writer.writeEndObject(); // geo_polygon
} catch (final IOException e) {
throw new UncheckedIOException(e);
}
return false;
}
@Override
public boolean enterGeoShapeQuery(final GeoShapeQuery geoshape) {
try {
writer.writeFieldName("geo_shape");
writer.writeStartObject();
writeStandardFields(geoshape);
writer.writeFieldName(geoshape.getFieldName());
writer.writeStartObject();
final Shape shape = geoshape.getShape();
if (shape != null) {
writer.writeFieldName("shape");
writer.writeStartObject();
writeFieldValue("type", shape.getType());
writeFieldValue("coordinates", shape.getCoordinates());
writer.writeEndObject();
}
final IndexedShape is = geoshape.getIndexedShape();
if (is != null) {
writer.writeFieldName("indexed_shape");
writer.writeStartObject();
writeFieldValue("index", is.getIndex());
writeFieldValue("type", is.getType());
writeFieldValue("id", is.getId());
writeFieldValue("path", is.getPath());
writer.writeEndObject();
}
writeFieldValue("relation", geoshape.getRelation());
writeFieldValue("strategy", geoshape.getStrategy());
writer.writeEndObject(); // field
writer.writeEndObject(); // geo_shape
} catch (final IOException e) {
throw new UncheckedIOException(e);
}
return false;
}
@Override
public boolean enterIdsQuery(final IdsQuery ids) {
try {
writer.writeFieldName("ids");
writer.writeStartObject();
writeStandardFields(ids);
writeFieldWithValues("types", ids.getTypes());
writeFieldWithValues("values", ids.getValues());
writer.writeEndObject(); // ids
} catch (final IOException e) {
throw new UncheckedIOException(e);
}
return false;
}
@Override
public boolean enterMatchQuery(final MatchQuery match) {
try {
writer.writeFieldName("match");
writer.writeStartObject();
writer.writeFieldName(match.getFieldName());
final Object value = match.getValue();
if (value instanceof CharSequence && match.hasMatchDefaults()) {
writer.writeObject(value);
} else {
writer.writeStartObject();
writeStandardFields(match);
writeFieldValue("query", value);
writeFieldValue("operator", match.getOperator());
writeFieldValue("fuzziness", match.getFuzziness());
writeFieldValue("fuzzy_rewrite", match.getFuzzyRewrite());
writeFieldValue("prefix_length", match.getPrefixLength());
writeFieldValue("max_expansions", match.getMaxExpansions());
writeFieldValue("cutoff_frequency", match.getCutoffFrequency());
writeFieldValue("zero_terms_query", match.getZeroTermsQuery());
writeFieldValue(
"auto_generate_synonyms_phrase_query",
match.isAutoGenerateSynonymsPhraseQuery());
writer.writeEndObject(); // field
}
writer.writeEndObject(); // prefix
} catch (final IOException e) {
throw new UncheckedIOException(e);
}
return false;
}
@Override
public boolean enterMoreLikeThisQuery(final MoreLikeThisQuery moreLikeThis) {
try {
writer.writeFieldName("more_like_this");
writer.writeStartObject();
writeStandardFields(moreLikeThis);
writeFieldValue("like", moreLikeThis.getLike());
writeFieldValue("unlike", moreLikeThis.getUnlike());
writeFieldValue("fields", moreLikeThis.getFields());
writeFieldValue("max_query_terms", moreLikeThis.getMaxQueryTerms());
writeFieldValue("min_term_freq", moreLikeThis.getMinTermFrequency());
writeFieldValue("min_doc_freq", moreLikeThis.getMinDocFrequency());
writeFieldValue("max_doc_freq", moreLikeThis.getMaxDocFrequency());
writeFieldValue("min_word_length", moreLikeThis.getMinWordLength());
writeFieldValue("max_word_length", moreLikeThis.getMaxWordLength());
writeFieldValue("stop_words", moreLikeThis.getStopWords());
writeFieldValue("analyzer", moreLikeThis.getAnalyzer());
writeFieldValue("minimum_should_match", moreLikeThis.getMinimumShouldMatch());
writeFieldValue("fail_on_unsupported_field", moreLikeThis.isFailOnUnsupportedField());
writeFieldValue("boost_terms", moreLikeThis.getBoostTerms());
writeFieldValue("include", moreLikeThis.isInclude());
writer.writeEndObject(); // more_like_this
} catch (final IOException e) {
throw new UncheckedIOException(e);
}
return false;
}
@Override
public boolean enterPrefixQuery(final PrefixQuery prefix) {
try {
writer.writeFieldName("prefix");
writer.writeStartObject();
writer.writeFieldName(prefix.getFieldName());
final String value = prefix.getValue();
if (prefix.hasStandardDefaults()) {
writer.writeString(value);
} else {
writer.writeStartObject();
writeStandardFields(prefix);
writeFieldValue("value", value);
writer.writeEndObject();
}
writer.writeEndObject(); // prefix
} catch (final IOException e) {
throw new UncheckedIOException(e);
}
return false;
}
@Override
public boolean enterQueryStringQuery(final QueryStringQuery qs) {
try {
writer.writeFieldName("query_string");
writer.writeStartObject();
writeStandardFields(qs);
writeFieldValue("fields", qs.getFields());
writeFieldValue("default_field", qs.getDefaultField());
writeFieldValue("query", qs.getQueryString());
writeFieldValue("default_operator", qs.getDefaultOperator());
writeFieldValue("allow_leading_wildcard", qs.isAllowLeadingWildcard());
writeFieldValue("analyze_wildcard", qs.isAnalyzeWildcard());
writeFieldValue("analyzer", qs.getAnalyzer());
writeFieldValue("auto_generate_synonyms_phrase_query", qs.isAutoGenerateSynonymsPhraseQuery());
writeFieldValue("enable_position_increments", qs.isEnablePositionIncrements());
writeFieldValue("fuzziness", qs.getFuzziness());
writeFieldValue("fuzzy_max_expansions", qs.getFuzzyMaxExpansions());
writeFieldValue("fuzzy_prefix_length", qs.getFuzzyPrefixLength());
writeFieldValue("fuzzy_transpositions", qs.isFuzzyTranspositions());
writeFieldValue("lenient", qs.isLenient());
writeFieldValue("max_determinized_states", qs.getMaxDeterminizedStates());
writeFieldValue("minimum_should_match", qs.getMinimumShouldMatch());
writeFieldValue("phrase_slop", qs.getPhraseSlop());
writeFieldValue("quote_analyzer", qs.getQuoteAnalyzer());
writeFieldValue("quote_field_suffix", qs.getQuoteFieldSuffix());
writeFieldValue("time_zone", qs.getTimeZone());
writer.writeEndObject(); // query_string
} catch (final IOException e) {
throw new UncheckedIOException(e);
}
return false;
}
@Override
public boolean enterRangeQuery(final RangeQuery range) {
try {
writer.writeFieldName("range");
writer.writeStartObject();
writer.writeFieldName(range.getFieldName());
writer.writeStartObject(); // field
writeStandardFields(range);
final Object lower = range.getLower();
if (lower != null) {
writer.writeFieldName(range.isIncludeLower() ? "gte" : "gt");
writer.writeObject(lower);
}
final Object upper = range.getUpper();
if (upper != null) {
writer.writeFieldName(range.isIncludeUpper() ? "lte" : "lt");
writer.writeObject(upper);
}
writer.writeEndObject(); // field
writer.writeEndObject(); // range
} catch (final IOException e) {
throw new UncheckedIOException(e);
}
return false;
}
@Override
public boolean enterRegexpQuery(final RegexpQuery regexp) {
try {
writer.writeFieldName("regexp");
writer.writeStartObject();
writer.writeFieldName(regexp.getFieldName());
writer.writeStartObject(); // field
writeStandardFields(regexp);
writeFieldValue("value", regexp.getValue());
writeFieldValue("max_determinized_states", regexp.getMaxDeterminizedStates());
writeFieldValue("rewrite", regexp.getRewrite());
final Set flags = regexp.getFlags();
if (flags.size() != 0) {
writeFieldValue("flags", Joiner.on('|').join(flags));
}
writer.writeEndObject(); // field
writer.writeEndObject(); // regexp
} catch (final IOException e) {
throw new UncheckedIOException(e);
}
return false;
}
@Override
public boolean enterTermsQuery(final TermsQuery terms) {
try {
writer.writeFieldName("terms");
writer.writeStartObject();
writeStandardFields(terms);
writeFieldWithValues(terms.getFieldName(), terms.getValues());
writer.writeEndObject(); // terms
} catch (final IOException e) {
throw new UncheckedIOException(e);
}
return false;
}
@Override
public boolean enterWildcardQuery(final WildcardQuery wildcard) {
try {
writer.writeFieldName("wildcard");
writer.writeStartObject();
writeStandardFields(wildcard);
writer.writeFieldName(wildcard.getFieldName());
writer.writeString(wildcard.getValue());
writer.writeEndObject(); // wildcard
} catch (final IOException e) {
throw new UncheckedIOException(e);
}
return false;
}
private void writeClause(final Query clause) throws IOException {
writer.writeStartObject();
clause.accept(this);
writer.writeEndObject();
}
private void writeClauses(final String name, final List clauses) throws IOException {
final int size = Query.countNotEmpty(clauses);
if (size == 0) {
return;
}
writer.writeFieldName(name);
final boolean multiple = size != 1;
if (multiple) {
writer.writeStartArray();
}
for (final Query clause : clauses) {
if (!clause.isEmpty()) {
writeClause(clause);
}
}
if (multiple) {
writer.writeEndArray();
}
}
private void writeStandardFields(final StandardQuery standardQuery) throws IOException {
writeFieldValue("_name", standardQuery.getName());
writeFieldValue("boost", standardQuery.getBoost());
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy