blob: 67550990a2260f121746b39b1c0e53be3280af2c [file] [log] [blame]
<!DOCTYPE HTML>
<!-- NewPage -->
<html lang="en">
<head>
<!-- Generated by javadoc -->
<title>PredicateAnalyzer (Apache Calcite API)</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" href="../../../../../stylesheet.css" title="Style">
<link rel="stylesheet" type="text/css" href="../../../../../jquery/jquery-ui.css" title="Style">
<script type="text/javascript" src="../../../../../script.js"></script>
<script type="text/javascript" src="../../../../../jquery/jszip/dist/jszip.min.js"></script>
<script type="text/javascript" src="../../../../../jquery/jszip-utils/dist/jszip-utils.min.js"></script>
<!--[if IE]>
<script type="text/javascript" src="../../../../../jquery/jszip-utils/dist/jszip-utils-ie.min.js"></script>
<![endif]-->
<script type="text/javascript" src="../../../../../jquery/jquery-3.3.1.js"></script>
<script type="text/javascript" src="../../../../../jquery/jquery-migrate-3.0.1.js"></script>
<script type="text/javascript" src="../../../../../jquery/jquery-ui.js"></script>
</head>
<body>
<script type="text/javascript"><!--
try {
if (location.href.indexOf('is-external=true') == -1) {
parent.document.title="PredicateAnalyzer (Apache Calcite API)";
}
}
catch(err) {
}
//-->
var data = {"i0":9,"i1":9,"i2":9};
var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],8:["t4","Concrete Methods"]};
var altColor = "altColor";
var rowColor = "rowColor";
var tableTab = "tableTab";
var activeTableTab = "activeTableTab";
var pathtoroot = "../../../../../";
var useModuleDirectories = true;
loadScripts(document, 'script');</script>
<noscript>
<div>JavaScript is disabled on your browser.</div>
</noscript>
<header role="banner">
<nav role="navigation">
<div class="fixedNav">
<!-- ========= START OF TOP NAVBAR ======= -->
<div class="topNav"><a id="navbar.top">
<!-- -->
</a>
<div class="skipNav"><a href="#skip.navbar.top" title="Skip navigation links">Skip navigation links</a></div>
<a id="navbar.top.firstrow">
<!-- -->
</a>
<ul class="navList" title="Navigation">
<li><a href="../../../../../index.html">Overview</a></li>
<li><a href="package-summary.html">Package</a></li>
<li class="navBarCell1Rev">Class</li>
<li><a href="class-use/PredicateAnalyzer.html">Use</a></li>
<li><a href="package-tree.html">Tree</a></li>
<li><a href="../../../../../deprecated-list.html">Deprecated</a></li>
<li><a href="../../../../../index-all.html">Index</a></li>
<li><a href="../../../../../help-doc.html">Help</a></li>
</ul>
</div>
<div class="subNav">
<ul class="navList" id="allclasses_navbar_top">
<li><a href="../../../../../allclasses.html">All&nbsp;Classes</a></li>
</ul>
<ul class="navListSearch">
<li><label for="search">SEARCH:</label>
<input type="text" id="search" value="search" disabled="disabled">
<input type="reset" id="reset" value="reset" disabled="disabled">
</li>
</ul>
<div>
<script type="text/javascript"><!--
allClassesLink = document.getElementById("allclasses_navbar_top");
if(window==top) {
allClassesLink.style.display = "block";
}
else {
allClassesLink.style.display = "none";
}
//-->
</script>
<noscript>
<div>JavaScript is disabled on your browser.</div>
</noscript>
</div>
<div>
<ul class="subNavList">
<li>Summary:&nbsp;</li>
<li><a href="#nested.class.summary">Nested</a>&nbsp;|&nbsp;</li>
<li>Field&nbsp;|&nbsp;</li>
<li><a href="#constructor.summary">Constr</a>&nbsp;|&nbsp;</li>
<li><a href="#method.summary">Method</a></li>
</ul>
<ul class="subNavList">
<li>Detail:&nbsp;</li>
<li>Field&nbsp;|&nbsp;</li>
<li><a href="#constructor.detail">Constr</a>&nbsp;|&nbsp;</li>
<li><a href="#method.detail">Method</a></li>
</ul>
</div>
<a id="skip.navbar.top">
<!-- -->
</a></div>
<!-- ========= END OF TOP NAVBAR ========= -->
</div>
<div class="navPadding">&nbsp;</div>
<script type="text/javascript"><!--
$('.navPadding').css('padding-top', $('.fixedNav').css("height"));
//-->
</script>
</nav>
</header>
<!-- ======== START OF CLASS DATA ======== -->
<main role="main">
<div class="header">
<div class="subTitle"><span class="packageLabelInType">Package</span>&nbsp;<a href="package-summary.html">org.apache.calcite.adapter.elasticsearch</a></div>
<h2 title="Class PredicateAnalyzer" class="title">Class PredicateAnalyzer</h2>
</div>
<div class="contentContainer">
<ul class="inheritance">
<li>java.lang.Object</li>
<li>
<ul class="inheritance">
<li>org.apache.calcite.adapter.elasticsearch.PredicateAnalyzer</li>
</ul>
</li>
</ul>
<div class="description">
<ul class="blockList">
<li class="blockList">
<hr>
<pre>class <span class="typeNameLabel">PredicateAnalyzer</span>
extends java.lang.Object</pre>
<div class="block">Query predicate analyzer. Uses visitor pattern to traverse existing expression
and convert it to <a href="QueryBuilders.QueryBuilder.html" title="class in org.apache.calcite.adapter.elasticsearch"><code>QueryBuilders.QueryBuilder</code></a>.
<p>Major part of this class have been copied from
<a href="https://www.dremio.com/">dremio</a> ES adapter
(thanks to their team for improving calcite-ES integration).</div>
</li>
</ul>
</div>
<div class="summary">
<ul class="blockList">
<li class="blockList">
<!-- ======== NESTED CLASS SUMMARY ======== -->
<section role="region">
<ul class="blockList">
<li class="blockList"><a id="nested.class.summary">
<!-- -->
</a>
<h3>Nested Class Summary</h3>
<table class="memberSummary">
<caption><span>Nested Classes</span><span class="tabEnd">&nbsp;</span></caption>
<tr>
<th class="colFirst" scope="col">Modifier and Type</th>
<th class="colSecond" scope="col">Class</th>
<th class="colLast" scope="col">Description</th>
</tr>
<tr class="altColor">
<td class="colFirst"><code>(package private) static class&nbsp;</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="PredicateAnalyzer.CastExpression.html" title="class in org.apache.calcite.adapter.elasticsearch">PredicateAnalyzer.CastExpression</a></span></code></th>
<td class="colLast">
<div class="block">SQL cast: <code>cast(col as INTEGER)</code></div>
</td>
</tr>
<tr class="rowColor">
<td class="colFirst"><code>(package private) static class&nbsp;</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="PredicateAnalyzer.CompoundQueryExpression.html" title="class in org.apache.calcite.adapter.elasticsearch">PredicateAnalyzer.CompoundQueryExpression</a></span></code></th>
<td class="colLast">
<div class="block">Builds conjunctions / disjunctions based on existing expressions</div>
</td>
</tr>
<tr class="altColor">
<td class="colFirst"><code>(package private) static interface&nbsp;</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="PredicateAnalyzer.Expression.html" title="interface in org.apache.calcite.adapter.elasticsearch">PredicateAnalyzer.Expression</a></span></code></th>
<td class="colLast">
<div class="block">Empty interface; exists only to define type hierarchy</div>
</td>
</tr>
<tr class="rowColor">
<td class="colFirst"><code>(package private) static class&nbsp;</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="PredicateAnalyzer.ExpressionNotAnalyzableException.html" title="class in org.apache.calcite.adapter.elasticsearch">PredicateAnalyzer.ExpressionNotAnalyzableException</a></span></code></th>
<td class="colLast">
<div class="block">Thrown when <a href="../../rel/RelNode.html" title="interface in org.apache.calcite.rel"><code>RelNode</code></a> expression can't be processed
(or converted into ES query)</div>
</td>
</tr>
<tr class="altColor">
<td class="colFirst"><code>(package private) static class&nbsp;</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="PredicateAnalyzer.LiteralExpression.html" title="class in org.apache.calcite.adapter.elasticsearch">PredicateAnalyzer.LiteralExpression</a></span></code></th>
<td class="colLast">
<div class="block">Literal like <code>'foo' or 42 or true</code> etc.</div>
</td>
</tr>
<tr class="rowColor">
<td class="colFirst"><code>(package private) static class&nbsp;</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="PredicateAnalyzer.NamedFieldExpression.html" title="class in org.apache.calcite.adapter.elasticsearch">PredicateAnalyzer.NamedFieldExpression</a></span></code></th>
<td class="colLast">
<div class="block">Used for bind variables</div>
</td>
</tr>
<tr class="altColor">
<td class="colFirst"><code>private static class&nbsp;</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="PredicateAnalyzer.NotLikeConverter.html" title="class in org.apache.calcite.adapter.elasticsearch">PredicateAnalyzer.NotLikeConverter</a></span></code></th>
<td class="colLast">
<div class="block">Converts expressions of the form NOT(LIKE(...)) into NOT_LIKE(...)</div>
</td>
</tr>
<tr class="rowColor">
<td class="colFirst"><code>private static class&nbsp;</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="PredicateAnalyzer.PredicateAnalyzerException.html" title="class in org.apache.calcite.adapter.elasticsearch">PredicateAnalyzer.PredicateAnalyzerException</a></span></code></th>
<td class="colLast">
<div class="block">Internal exception</div>
</td>
</tr>
<tr class="altColor">
<td class="colFirst"><code>(package private) static class&nbsp;</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="PredicateAnalyzer.QueryExpression.html" title="class in org.apache.calcite.adapter.elasticsearch">PredicateAnalyzer.QueryExpression</a></span></code></th>
<td class="colLast">
<div class="block">Main expression operators (like <code>equals</code>, <code>gt</code>, <code>exists</code> etc.)</div>
</td>
</tr>
<tr class="rowColor">
<td class="colFirst"><code>(package private) static class&nbsp;</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="PredicateAnalyzer.SimpleQueryExpression.html" title="class in org.apache.calcite.adapter.elasticsearch">PredicateAnalyzer.SimpleQueryExpression</a></span></code></th>
<td class="colLast">
<div class="block">Usually basic expression of type <code>a = 'val'</code> or <code>b &gt; 42</code>.</div>
</td>
</tr>
<tr class="altColor">
<td class="colFirst"><code>(package private) static interface&nbsp;</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="PredicateAnalyzer.TerminalExpression.html" title="interface in org.apache.calcite.adapter.elasticsearch">PredicateAnalyzer.TerminalExpression</a></span></code></th>
<td class="colLast">
<div class="block">Empty interface; exists only to define type hierarchy</div>
</td>
</tr>
<tr class="rowColor">
<td class="colFirst"><code>private static class&nbsp;</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="PredicateAnalyzer.Visitor.html" title="class in org.apache.calcite.adapter.elasticsearch">PredicateAnalyzer.Visitor</a></span></code></th>
<td class="colLast">
<div class="block">Traverses <a href="../../rex/RexNode.html" title="class in org.apache.calcite.rex"><code>RexNode</code></a> tree and builds ES query.</div>
</td>
</tr>
</table>
</li>
</ul>
</section>
<!-- ======== CONSTRUCTOR SUMMARY ======== -->
<section role="region">
<ul class="blockList">
<li class="blockList"><a id="constructor.summary">
<!-- -->
</a>
<h3>Constructor Summary</h3>
<table class="memberSummary">
<caption><span>Constructors</span><span class="tabEnd">&nbsp;</span></caption>
<tr>
<th class="colFirst" scope="col">Modifier</th>
<th class="colSecond" scope="col">Constructor</th>
<th class="colLast" scope="col">Description</th>
</tr>
<tr class="altColor">
<td class="colFirst"><code>private </code></td>
<th class="colConstructorName" scope="row"><code><span class="memberNameLink"><a href="#%3Cinit%3E()">PredicateAnalyzer</a></span>()</code></th>
<td class="colLast">&nbsp;</td>
</tr>
</table>
</li>
</ul>
</section>
<!-- ========== METHOD SUMMARY =========== -->
<section role="region">
<ul class="blockList">
<li class="blockList"><a id="method.summary">
<!-- -->
</a>
<h3>Method Summary</h3>
<table class="memberSummary">
<caption><span id="t0" class="activeTableTab"><span>All Methods</span><span class="tabEnd">&nbsp;</span></span><span id="t1" class="tableTab"><span><a href="javascript:show(1);">Static Methods</a></span><span class="tabEnd">&nbsp;</span></span><span id="t4" class="tableTab"><span><a href="javascript:show(8);">Concrete Methods</a></span><span class="tabEnd">&nbsp;</span></span></caption>
<tr>
<th class="colFirst" scope="col">Modifier and Type</th>
<th class="colSecond" scope="col">Method</th>
<th class="colLast" scope="col">Description</th>
</tr>
<tr id="i0" class="altColor">
<td class="colFirst"><code>private static <a href="QueryBuilders.RangeQueryBuilder.html" title="class in org.apache.calcite.adapter.elasticsearch">QueryBuilders.RangeQueryBuilder</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#addFormatIfNecessary(org.apache.calcite.adapter.elasticsearch.PredicateAnalyzer.LiteralExpression,org.apache.calcite.adapter.elasticsearch.QueryBuilders.RangeQueryBuilder)">addFormatIfNecessary</a></span>&#8203;(<a href="PredicateAnalyzer.LiteralExpression.html" title="class in org.apache.calcite.adapter.elasticsearch">PredicateAnalyzer.LiteralExpression</a>&nbsp;literal,
<a href="QueryBuilders.RangeQueryBuilder.html" title="class in org.apache.calcite.adapter.elasticsearch">QueryBuilders.RangeQueryBuilder</a>&nbsp;rangeQueryBuilder)</code></th>
<td class="colLast">
<div class="block">By default, range queries on date/time need use the format of the source to parse the literal.</div>
</td>
</tr>
<tr id="i1" class="rowColor">
<td class="colFirst"><code>(package private) static <a href="QueryBuilders.QueryBuilder.html" title="class in org.apache.calcite.adapter.elasticsearch">QueryBuilders.QueryBuilder</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#analyze(org.apache.calcite.rex.RexNode)">analyze</a></span>&#8203;(<a href="../../rex/RexNode.html" title="class in org.apache.calcite.rex">RexNode</a>&nbsp;expression)</code></th>
<td class="colLast">
<div class="block">Walks the expression tree, attempting to convert the entire tree into
an equivalent Elasticsearch query filter.</div>
</td>
</tr>
<tr id="i2" class="altColor">
<td class="colFirst"><code>private static void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#checkForIncompatibleDateTimeOperands(org.apache.calcite.rex.RexCall)">checkForIncompatibleDateTimeOperands</a></span>&#8203;(<a href="../../rex/RexCall.html" title="class in org.apache.calcite.rex">RexCall</a>&nbsp;call)</code></th>
<td class="colLast">
<div class="block">If one operand in a binary operator is a DateTime type, but the other isn't,
we should not push down the predicate</div>
</td>
</tr>
</table>
<ul class="blockList">
<li class="blockList"><a id="methods.inherited.from.class.java.lang.Object">
<!-- -->
</a>
<h3>Methods inherited from class&nbsp;java.lang.Object</h3>
<code>clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait</code></li>
</ul>
</li>
</ul>
</section>
</li>
</ul>
</div>
<div class="details">
<ul class="blockList">
<li class="blockList">
<!-- ========= CONSTRUCTOR DETAIL ======== -->
<section role="region">
<ul class="blockList">
<li class="blockList"><a id="constructor.detail">
<!-- -->
</a>
<h3>Constructor Detail</h3>
<a id="&lt;init&gt;()">
<!-- -->
</a>
<ul class="blockListLast">
<li class="blockList">
<h4>PredicateAnalyzer</h4>
<pre>private&nbsp;PredicateAnalyzer()</pre>
</li>
</ul>
</li>
</ul>
</section>
<!-- ============ METHOD DETAIL ========== -->
<section role="region">
<ul class="blockList">
<li class="blockList"><a id="method.detail">
<!-- -->
</a>
<h3>Method Detail</h3>
<a id="analyze(org.apache.calcite.rex.RexNode)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>analyze</h4>
<pre class="methodSignature">static&nbsp;<a href="QueryBuilders.QueryBuilder.html" title="class in org.apache.calcite.adapter.elasticsearch">QueryBuilders.QueryBuilder</a>&nbsp;analyze&#8203;(<a href="../../rex/RexNode.html" title="class in org.apache.calcite.rex">RexNode</a>&nbsp;expression)
throws <a href="PredicateAnalyzer.ExpressionNotAnalyzableException.html" title="class in org.apache.calcite.adapter.elasticsearch">PredicateAnalyzer.ExpressionNotAnalyzableException</a></pre>
<div class="block">Walks the expression tree, attempting to convert the entire tree into
an equivalent Elasticsearch query filter. If an error occurs, or if it
is determined that the expression cannot be converted, an exception is
thrown and an error message logged.
<p>Callers should catch ExpressionNotAnalyzableException
and fall back to not using push-down filters.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>expression</code> - expression to analyze</dd>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>search query which can be used to query ES cluster</dd>
<dt><span class="throwsLabel">Throws:</span></dt>
<dd><code><a href="PredicateAnalyzer.ExpressionNotAnalyzableException.html" title="class in org.apache.calcite.adapter.elasticsearch">PredicateAnalyzer.ExpressionNotAnalyzableException</a></code> - when expression can't processed by this analyzer</dd>
</dl>
</li>
</ul>
<a id="addFormatIfNecessary(org.apache.calcite.adapter.elasticsearch.PredicateAnalyzer.LiteralExpression,org.apache.calcite.adapter.elasticsearch.QueryBuilders.RangeQueryBuilder)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>addFormatIfNecessary</h4>
<pre class="methodSignature">private static&nbsp;<a href="QueryBuilders.RangeQueryBuilder.html" title="class in org.apache.calcite.adapter.elasticsearch">QueryBuilders.RangeQueryBuilder</a>&nbsp;addFormatIfNecessary&#8203;(<a href="PredicateAnalyzer.LiteralExpression.html" title="class in org.apache.calcite.adapter.elasticsearch">PredicateAnalyzer.LiteralExpression</a>&nbsp;literal,
<a href="QueryBuilders.RangeQueryBuilder.html" title="class in org.apache.calcite.adapter.elasticsearch">QueryBuilders.RangeQueryBuilder</a>&nbsp;rangeQueryBuilder)</pre>
<div class="block">By default, range queries on date/time need use the format of the source to parse the literal.
So we need to specify that the literal has "date_time" format</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>literal</code> - literal value</dd>
<dd><code>rangeQueryBuilder</code> - query builder to optionally add <code>format</code> expression</dd>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>existing builder with possible <code>format</code> attribute</dd>
</dl>
</li>
</ul>
<a id="checkForIncompatibleDateTimeOperands(org.apache.calcite.rex.RexCall)">
<!-- -->
</a>
<ul class="blockListLast">
<li class="blockList">
<h4>checkForIncompatibleDateTimeOperands</h4>
<pre class="methodSignature">private static&nbsp;void&nbsp;checkForIncompatibleDateTimeOperands&#8203;(<a href="../../rex/RexCall.html" title="class in org.apache.calcite.rex">RexCall</a>&nbsp;call)</pre>
<div class="block">If one operand in a binary operator is a DateTime type, but the other isn't,
we should not push down the predicate</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>call</code> - current node being evaluated</dd>
</dl>
</li>
</ul>
</li>
</ul>
</section>
</li>
</ul>
</div>
</div>
</main>
<!-- ========= END OF CLASS DATA ========= -->
<footer role="contentinfo">
<nav role="navigation">
<!-- ======= START OF BOTTOM NAVBAR ====== -->
<div class="bottomNav"><a id="navbar.bottom">
<!-- -->
</a>
<div class="skipNav"><a href="#skip.navbar.bottom" title="Skip navigation links">Skip navigation links</a></div>
<a id="navbar.bottom.firstrow">
<!-- -->
</a>
<ul class="navList" title="Navigation">
<li><a href="../../../../../index.html">Overview</a></li>
<li><a href="package-summary.html">Package</a></li>
<li class="navBarCell1Rev">Class</li>
<li><a href="class-use/PredicateAnalyzer.html">Use</a></li>
<li><a href="package-tree.html">Tree</a></li>
<li><a href="../../../../../deprecated-list.html">Deprecated</a></li>
<li><a href="../../../../../index-all.html">Index</a></li>
<li><a href="../../../../../help-doc.html">Help</a></li>
</ul>
</div>
<div class="subNav">
<ul class="navList" id="allclasses_navbar_bottom">
<li><a href="../../../../../allclasses.html">All&nbsp;Classes</a></li>
</ul>
<div>
<script type="text/javascript"><!--
allClassesLink = document.getElementById("allclasses_navbar_bottom");
if(window==top) {
allClassesLink.style.display = "block";
}
else {
allClassesLink.style.display = "none";
}
//-->
</script>
<noscript>
<div>JavaScript is disabled on your browser.</div>
</noscript>
</div>
<div>
<ul class="subNavList">
<li>Summary:&nbsp;</li>
<li><a href="#nested.class.summary">Nested</a>&nbsp;|&nbsp;</li>
<li>Field&nbsp;|&nbsp;</li>
<li><a href="#constructor.summary">Constr</a>&nbsp;|&nbsp;</li>
<li><a href="#method.summary">Method</a></li>
</ul>
<ul class="subNavList">
<li>Detail:&nbsp;</li>
<li>Field&nbsp;|&nbsp;</li>
<li><a href="#constructor.detail">Constr</a>&nbsp;|&nbsp;</li>
<li><a href="#method.detail">Method</a></li>
</ul>
</div>
<a id="skip.navbar.bottom">
<!-- -->
</a></div>
<!-- ======== END OF BOTTOM NAVBAR ======= -->
</nav>
<p class="legalCopy"><small>Copyright &#169; 2012&#x2013;2019 <a href="https://www.apache.org/">The Apache Software Foundation</a>. All rights reserved.</small></p>
</footer>
</body>
</html>