blob: 41780b74b2d453934455580d451b0befbad7470d [file] [log] [blame]
/*
* 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 org.apache.jackrabbit.oak.query;
import java.util.Iterator;
import java.util.List;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.osgi.annotation.versioning.ProviderType;
import org.apache.jackrabbit.oak.api.PropertyValue;
import org.apache.jackrabbit.oak.api.Result;
import org.apache.jackrabbit.oak.api.Tree;
import org.apache.jackrabbit.oak.query.ast.ColumnImpl;
import org.apache.jackrabbit.oak.query.ast.OrderingImpl;
import org.apache.jackrabbit.oak.query.stats.QueryStatsData.QueryExecutionStats;
/**
* A "select" or "union" query.
* <p>
* Lifecycle: use the constructor to create a new object. Call init() to
* initialize the bind variable map. If the query is re-executed, a new instance
* is created.
*/
@ProviderType
public interface Query {
void setExecutionContext(ExecutionContext context);
void setLimit(long limit);
void setOffset(long offset);
void bindValue(String key, PropertyValue value);
void setTraversalEnabled(boolean traversalEnabled);
Result executeQuery();
List<String> getBindVariableNames();
ColumnImpl[] getColumns();
int getColumnIndex(String columnName);
String[] getSelectorNames();
int getSelectorIndex(String selectorName);
Iterator<ResultRowImpl> getRows();
/**
* Get the size if known.
*
* @return the size, or -1 if unknown
*/
long getSize();
/**
* Get the size if known.
*
* @param precision the required precision
* @param max the maximum nodes read (for an exact size)
* @return the size, or -1 if unknown
*/
long getSize(Result.SizePrecision precision, long max);
void setExplain(boolean explain);
void setMeasure(boolean measure);
void setOrderings(OrderingImpl[] orderings);
/**
* Initialize the query. This will 'wire' selectors into constraints, and
* collect bind variable names. It will also simplify expressions if
* possible, but will not prepare the query.
*/
void init();
/**
* Prepare the query. The cost is estimated and the execution plan is
* decided here.
*/
void prepare();
/**
* Get the query plan. The query must already be prepared.
*
* @return the query plan
*/
String getPlan();
/**
* Get the index cost as a JSON string. The query must already be prepared.
*
* @return the index cost
*/
String getIndexCostInfo();
/**
* Get the estimated cost.
*
* @return the estimated cost
*/
double getEstimatedCost();
Tree getTree(String path);
boolean isMeasureOrExplainEnabled();
void setInternal(boolean internal);
/**
* Returns whether the results will be sorted by index. The query must already be prepared.
*
* @return if sorted by index
*/
boolean isSortedByIndex();
/**
* Try to convert the query to an alternative form, specially a "union". To
* avoid any potential error due to state variables perform the conversion
* before the {@link #init()}.
*
* @return {@code this} if no conversions are possible or a new instance of
* a {@link Query}. Cannot return null.
*/
@NotNull
Query buildAlternativeQuery();
/**
* <p>
* returns a clone of the current object. Will throw an exception in case it's invoked in a non
* appropriate moment. For example the default {@link QueryImpl} cannot be cloned once the
* {@link #init()} has been executed.
* </p>
*
* <p>
* <strong>May return null if not implemented.</strong>
* </p>
* @return a clone of self
* @throws IllegalStateException
*/
@Nullable
Query copyOf() throws IllegalStateException;
/**
* @return {@code true} if the query has been already initialised. {@code false} otherwise.
*/
boolean isInit();
/**
* @return the original statement as it was used to construct the object. If not provided the
* toString() will be used instead.
*/
String getStatement();
/**
*
* @return {@code true} if the current query is internal. {@code false} otherwise.
*/
boolean isInternal();
/**
* Whether the condition contains a fulltext condition that can not be
* applied to the filter, for example because it is part of an "or" condition
* of the form "where a=1 or contains(., 'x')".
*
* @return true if yes
*/
boolean containsUnfilteredFullTextCondition();
/**
* Set the query option to be used for this query.
*
* @param options the options
*/
void setQueryOptions(QueryOptions options);
/**
* Whether the query is potentially slow.
* Only supported for prepared queries.
*
* @return true if traversal is the only option
*/
boolean isPotentiallySlow();
/**
* Verify the query is not potentially slow. Only supported for prepared
* queries.
*
* @throws IllegalArgumentException if potentially slow, and configured to
* fail in this case
*/
void verifyNotPotentiallySlow();
QueryExecutionStats getQueryExecutionStats();
}