You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-issues@jackrabbit.apache.org by "Thomas Mueller (JIRA)" <ji...@apache.org> on 2015/09/16 15:17:45 UTC
[jira] [Updated] (OAK-2733) Option to convert "like" queries to
range queries
[ https://issues.apache.org/jira/browse/OAK-2733?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Thomas Mueller updated OAK-2733:
--------------------------------
Fix Version/s: (was: 1.3.7)
1.3.8
> Option to convert "like" queries to range queries
> -------------------------------------------------
>
> Key: OAK-2733
> URL: https://issues.apache.org/jira/browse/OAK-2733
> Project: Jackrabbit Oak
> Issue Type: Improvement
> Components: query
> Reporter: Thomas Mueller
> Assignee: Thomas Mueller
> Labels: performance
> Fix For: 1.3.8
>
>
> Queries with "like" conditions of the form "x like 'abc%'" are currently always converted to range queries. With Apache Lucene, using "like" in some cases is a bit faster (but not much, according to our tests).
> Converting "like" to range queries should be disabled by default.
> Potential patch:
> {noformat}
> --- src/main/java/org/apache/jackrabbit/oak/query/ast/ComparisonImpl.java (revision 1672070)
> +++ src/main/java/org/apache/jackrabbit/oak/query/ast/ComparisonImpl.java (working copy)
> @@ -31,11 +31,21 @@
> import org.apache.jackrabbit.oak.query.fulltext.LikePattern;
> import org.apache.jackrabbit.oak.query.index.FilterImpl;
> import org.apache.jackrabbit.oak.spi.query.PropertyValues;
> +import org.slf4j.Logger;
> +import org.slf4j.LoggerFactory;
>
> /**
> * A comparison operation (including "like").
> */
> public class ComparisonImpl extends ConstraintImpl {
> +
> + static final Logger LOG = LoggerFactory.getLogger(ComparisonImpl.class);
> +
> + private final static boolean CONVERT_LIKE_TO_RANGE = Boolean.getBoolean("oak.convertLikeToRange");
> +
> + static {
> + LOG.info("Converting like to range queries is " + (CONVERT_LIKE_TO_RANGE ? "enabled" : "disabled"));
> + }
>
> private final DynamicOperandImpl operand1;
> private final Operator operator;
> @@ -193,7 +203,7 @@
> if (lowerBound.equals(upperBound)) {
> // no wildcards
> operand1.restrict(f, Operator.EQUAL, v);
> - } else if (operand1.supportsRangeConditions()) {
> + } else if (operand1.supportsRangeConditions() && CONVERT_LIKE_TO_RANGE) {
> if (lowerBound != null) {
> PropertyValue pv = PropertyValues.newString(lowerBound);
> operand1.restrict(f, Operator.GREATER_OR_EQUAL, pv);
> @@ -203,7 +213,7 @@
> operand1.restrict(f, Operator.LESS_OR_EQUAL, pv);
> }
> } else {
> - // path conditions
> + // path conditions, or conversion is disabled
> operand1.restrict(f, operator, v);
> }
> } else {
> {noformat}
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)