blob: 61538a651b26e87003362fe1909d4079d5348c29 [file] [log] [blame]
<!DOCTYPE HTML>
<!-- NewPage -->
<html lang="en">
<head>
<!-- Generated by javadoc -->
<title>RexImplicationChecker (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="RexImplicationChecker (Apache Calcite API)";
}
}
catch(err) {
}
//-->
var data = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10};
var tabs = {65535:["t0","All Methods"],2:["t2","Instance 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/RexImplicationChecker.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><a href="#field.summary">Field</a>&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><a href="#field.detail">Field</a>&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.plan</a></div>
<h2 title="Class RexImplicationChecker" class="title">Class RexImplicationChecker</h2>
</div>
<div class="contentContainer">
<ul class="inheritance">
<li>java.lang.Object</li>
<li>
<ul class="inheritance">
<li>org.apache.calcite.plan.RexImplicationChecker</li>
</ul>
</li>
</ul>
<div class="description">
<ul class="blockList">
<li class="blockList">
<hr>
<pre>public class <span class="typeNameLabel">RexImplicationChecker</span>
extends java.lang.Object</pre>
<div class="block">Checks whether one condition logically implies another.
<p>If A &rArr; B, whenever A is true, B will be true also.
<p>For example:
<ul>
<li>(x &gt; 10) &rArr; (x &gt; 5)
<li>(x = 10) &rArr; (x &lt; 30 OR y &gt; 30)
<li>(x = 10) &rArr; (x IS NOT NULL)
<li>(x &gt; 10 AND y = 20) &rArr; (x &gt; 5)
</ul></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>private static class&nbsp;</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="RexImplicationChecker.InputRefUsage.html" title="class in org.apache.calcite.plan">RexImplicationChecker.InputRefUsage</a>&lt;<a href="RexImplicationChecker.InputRefUsage.html" title="type parameter in RexImplicationChecker.InputRefUsage">T1</a>,&#8203;<a href="RexImplicationChecker.InputRefUsage.html" title="type parameter in RexImplicationChecker.InputRefUsage">T2</a>&gt;</span></code></th>
<td class="colLast">
<div class="block">Usage of a <a href="../rex/RexInputRef.html" title="class in org.apache.calcite.rex"><code>RexInputRef</code></a> in an expression.</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="RexImplicationChecker.InputUsageFinder.html" title="class in org.apache.calcite.plan">RexImplicationChecker.InputUsageFinder</a></span></code></th>
<td class="colLast">
<div class="block">Visitor that builds a usage map of inputs used by an expression.</div>
</td>
</tr>
</table>
</li>
</ul>
</section>
<!-- =========== FIELD SUMMARY =========== -->
<section role="region">
<ul class="blockList">
<li class="blockList"><a id="field.summary">
<!-- -->
</a>
<h3>Field Summary</h3>
<table class="memberSummary">
<caption><span>Fields</span><span class="tabEnd">&nbsp;</span></caption>
<tr>
<th class="colFirst" scope="col">Modifier and Type</th>
<th class="colSecond" scope="col">Field</th>
<th class="colLast" scope="col">Description</th>
</tr>
<tr class="altColor">
<td class="colFirst"><code>(package private) <a href="../rex/RexBuilder.html" title="class in org.apache.calcite.rex">RexBuilder</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#builder">builder</a></span></code></th>
<td class="colLast">&nbsp;</td>
</tr>
<tr class="rowColor">
<td class="colFirst"><code>(package private) <a href="../rex/RexExecutorImpl.html" title="class in org.apache.calcite.rex">RexExecutorImpl</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#executor">executor</a></span></code></th>
<td class="colLast">&nbsp;</td>
</tr>
<tr class="altColor">
<td class="colFirst"><code>private static <a href="../util/trace/CalciteLogger.html" title="class in org.apache.calcite.util.trace">CalciteLogger</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#LOGGER">LOGGER</a></span></code></th>
<td class="colLast">&nbsp;</td>
</tr>
<tr class="rowColor">
<td class="colFirst"><code>(package private) <a href="../rel/type/RelDataType.html" title="interface in org.apache.calcite.rel.type">RelDataType</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#rowType">rowType</a></span></code></th>
<td class="colLast">&nbsp;</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">Constructor</th>
<th class="colLast" scope="col">Description</th>
</tr>
<tr class="altColor">
<th class="colConstructorName" scope="row"><code><span class="memberNameLink"><a href="#%3Cinit%3E(org.apache.calcite.rex.RexBuilder,org.apache.calcite.rex.RexExecutorImpl,org.apache.calcite.rel.type.RelDataType)">RexImplicationChecker</a></span>&#8203;(<a href="../rex/RexBuilder.html" title="class in org.apache.calcite.rex">RexBuilder</a>&nbsp;builder,
<a href="../rex/RexExecutorImpl.html" title="class in org.apache.calcite.rex">RexExecutorImpl</a>&nbsp;executor,
<a href="../rel/type/RelDataType.html" title="interface in org.apache.calcite.rel.type">RelDataType</a>&nbsp;rowType)</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="t2" class="tableTab"><span><a href="javascript:show(2);">Instance 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 boolean</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#checkSupport(org.apache.calcite.plan.RexImplicationChecker.InputUsageFinder,org.apache.calcite.plan.RexImplicationChecker.InputUsageFinder)">checkSupport</a></span>&#8203;(<a href="RexImplicationChecker.InputUsageFinder.html" title="class in org.apache.calcite.plan">RexImplicationChecker.InputUsageFinder</a>&nbsp;firstUsageFinder,
<a href="RexImplicationChecker.InputUsageFinder.html" title="class in org.apache.calcite.plan">RexImplicationChecker.InputUsageFinder</a>&nbsp;secondUsageFinder)</code></th>
<td class="colLast">
<div class="block">Looks at the usage of variables in first and second conjunction to decide
whether this kind of expression is currently supported for proving first
implies second.</div>
</td>
</tr>
<tr id="i1" class="rowColor">
<td class="colFirst"><code>boolean</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#implies(org.apache.calcite.rex.RexNode,org.apache.calcite.rex.RexNode)">implies</a></span>&#8203;(<a href="../rex/RexNode.html" title="class in org.apache.calcite.rex">RexNode</a>&nbsp;first,
<a href="../rex/RexNode.html" title="class in org.apache.calcite.rex">RexNode</a>&nbsp;second)</code></th>
<td class="colLast">
<div class="block">Checks if condition first implies (&rArr;) condition second.</div>
</td>
</tr>
<tr id="i2" class="altColor">
<td class="colFirst"><code>private boolean</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#implies2(org.apache.calcite.rex.RexNode,org.apache.calcite.rex.RexNode)">implies2</a></span>&#8203;(<a href="../rex/RexNode.html" title="class in org.apache.calcite.rex">RexNode</a>&nbsp;first,
<a href="../rex/RexNode.html" title="class in org.apache.calcite.rex">RexNode</a>&nbsp;second)</code></th>
<td class="colLast">
<div class="block">Returns whether the predicate <code>first</code> (not a conjunction)
implies <code>second</code>.</div>
</td>
</tr>
<tr id="i3" class="rowColor">
<td class="colFirst"><code>private boolean</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#impliesAny(org.apache.calcite.rex.RexNode,java.util.List)">impliesAny</a></span>&#8203;(<a href="../rex/RexNode.html" title="class in org.apache.calcite.rex">RexNode</a>&nbsp;first,
java.util.List&lt;<a href="../rex/RexNode.html" title="class in org.apache.calcite.rex">RexNode</a>&gt;&nbsp;seconds)</code></th>
<td class="colLast">
<div class="block">Returns whether the predicate <code>first</code> implies (&rArr;)
at least one predicate in <code>seconds</code>.</div>
</td>
</tr>
<tr id="i4" class="altColor">
<td class="colFirst"><code>private boolean</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#impliesConjunction(org.apache.calcite.rex.RexNode,org.apache.calcite.rex.RexNode)">impliesConjunction</a></span>&#8203;(<a href="../rex/RexNode.html" title="class in org.apache.calcite.rex">RexNode</a>&nbsp;first,
<a href="../rex/RexNode.html" title="class in org.apache.calcite.rex">RexNode</a>&nbsp;second)</code></th>
<td class="colLast">
<div class="block">Returns whether the predicate <code>first</code> implies <code>second</code> (both
may be conjunctions).</div>
</td>
</tr>
<tr id="i5" class="rowColor">
<td class="colFirst"><code>private boolean</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#isEquivalentOp(org.apache.calcite.sql.SqlKind,org.apache.calcite.sql.SqlKind)">isEquivalentOp</a></span>&#8203;(<a href="../sql/SqlKind.html" title="enum in org.apache.calcite.sql">SqlKind</a>&nbsp;fKind,
<a href="../sql/SqlKind.html" title="enum in org.apache.calcite.sql">SqlKind</a>&nbsp;sKind)</code></th>
<td class="colLast">&nbsp;</td>
</tr>
<tr id="i6" class="altColor">
<td class="colFirst"><code>private boolean</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#isOppositeOp(org.apache.calcite.sql.SqlKind,org.apache.calcite.sql.SqlKind)">isOppositeOp</a></span>&#8203;(<a href="../sql/SqlKind.html" title="enum in org.apache.calcite.sql">SqlKind</a>&nbsp;fKind,
<a href="../sql/SqlKind.html" title="enum in org.apache.calcite.sql">SqlKind</a>&nbsp;sKind)</code></th>
<td class="colLast">&nbsp;</td>
</tr>
<tr id="i7" class="rowColor">
<td class="colFirst"><code>private boolean</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#isSatisfiable(org.apache.calcite.rex.RexNode,org.apache.calcite.DataContext)">isSatisfiable</a></span>&#8203;(<a href="../rex/RexNode.html" title="class in org.apache.calcite.rex">RexNode</a>&nbsp;second,
<a href="../DataContext.html" title="interface in org.apache.calcite">DataContext</a>&nbsp;dataValues)</code></th>
<td class="colLast">&nbsp;</td>
</tr>
<tr id="i8" class="altColor">
<td class="colFirst"><code>private boolean</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#isSupportedUnaryOperators(org.apache.calcite.sql.SqlKind)">isSupportedUnaryOperators</a></span>&#8203;(<a href="../sql/SqlKind.html" title="enum in org.apache.calcite.sql">SqlKind</a>&nbsp;kind)</code></th>
<td class="colLast">&nbsp;</td>
</tr>
<tr id="i9" class="rowColor">
<td class="colFirst"><code>private boolean</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#validate(org.apache.calcite.rex.RexNode,org.apache.calcite.rex.RexNode)">validate</a></span>&#8203;(<a href="../rex/RexNode.html" title="class in org.apache.calcite.rex">RexNode</a>&nbsp;first,
<a href="../rex/RexNode.html" title="class in org.apache.calcite.rex">RexNode</a>&nbsp;second)</code></th>
<td class="colLast">&nbsp;</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">
<!-- ============ FIELD DETAIL =========== -->
<section role="region">
<ul class="blockList">
<li class="blockList"><a id="field.detail">
<!-- -->
</a>
<h3>Field Detail</h3>
<a id="LOGGER">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>LOGGER</h4>
<pre>private static final&nbsp;<a href="../util/trace/CalciteLogger.html" title="class in org.apache.calcite.util.trace">CalciteLogger</a> LOGGER</pre>
</li>
</ul>
<a id="builder">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>builder</h4>
<pre>final&nbsp;<a href="../rex/RexBuilder.html" title="class in org.apache.calcite.rex">RexBuilder</a> builder</pre>
</li>
</ul>
<a id="executor">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>executor</h4>
<pre>final&nbsp;<a href="../rex/RexExecutorImpl.html" title="class in org.apache.calcite.rex">RexExecutorImpl</a> executor</pre>
</li>
</ul>
<a id="rowType">
<!-- -->
</a>
<ul class="blockListLast">
<li class="blockList">
<h4>rowType</h4>
<pre>final&nbsp;<a href="../rel/type/RelDataType.html" title="interface in org.apache.calcite.rel.type">RelDataType</a> rowType</pre>
</li>
</ul>
</li>
</ul>
</section>
<!-- ========= 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;(org.apache.calcite.rex.RexBuilder,org.apache.calcite.rex.RexExecutorImpl,org.apache.calcite.rel.type.RelDataType)">
<!-- -->
</a>
<ul class="blockListLast">
<li class="blockList">
<h4>RexImplicationChecker</h4>
<pre>public&nbsp;RexImplicationChecker&#8203;(<a href="../rex/RexBuilder.html" title="class in org.apache.calcite.rex">RexBuilder</a>&nbsp;builder,
<a href="../rex/RexExecutorImpl.html" title="class in org.apache.calcite.rex">RexExecutorImpl</a>&nbsp;executor,
<a href="../rel/type/RelDataType.html" title="interface in org.apache.calcite.rel.type">RelDataType</a>&nbsp;rowType)</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="implies(org.apache.calcite.rex.RexNode,org.apache.calcite.rex.RexNode)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>implies</h4>
<pre class="methodSignature">public&nbsp;boolean&nbsp;implies&#8203;(<a href="../rex/RexNode.html" title="class in org.apache.calcite.rex">RexNode</a>&nbsp;first,
<a href="../rex/RexNode.html" title="class in org.apache.calcite.rex">RexNode</a>&nbsp;second)</pre>
<div class="block">Checks if condition first implies (&rArr;) condition second.
<p>This reduces to SAT problem which is NP-Complete.
When this method says first implies second then it is definitely true.
But it cannot prove that first does not imply second.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>first</code> - first condition</dd>
<dd><code>second</code> - second condition</dd>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>true if it can prove first &rArr; second; otherwise false i.e.,
it doesn't know if implication holds</dd>
</dl>
</li>
</ul>
<a id="impliesAny(org.apache.calcite.rex.RexNode,java.util.List)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>impliesAny</h4>
<pre class="methodSignature">private&nbsp;boolean&nbsp;impliesAny&#8203;(<a href="../rex/RexNode.html" title="class in org.apache.calcite.rex">RexNode</a>&nbsp;first,
java.util.List&lt;<a href="../rex/RexNode.html" title="class in org.apache.calcite.rex">RexNode</a>&gt;&nbsp;seconds)</pre>
<div class="block">Returns whether the predicate <code>first</code> implies (&rArr;)
at least one predicate in <code>seconds</code>.</div>
</li>
</ul>
<a id="impliesConjunction(org.apache.calcite.rex.RexNode,org.apache.calcite.rex.RexNode)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>impliesConjunction</h4>
<pre class="methodSignature">private&nbsp;boolean&nbsp;impliesConjunction&#8203;(<a href="../rex/RexNode.html" title="class in org.apache.calcite.rex">RexNode</a>&nbsp;first,
<a href="../rex/RexNode.html" title="class in org.apache.calcite.rex">RexNode</a>&nbsp;second)</pre>
<div class="block">Returns whether the predicate <code>first</code> implies <code>second</code> (both
may be conjunctions).</div>
</li>
</ul>
<a id="implies2(org.apache.calcite.rex.RexNode,org.apache.calcite.rex.RexNode)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>implies2</h4>
<pre class="methodSignature">private&nbsp;boolean&nbsp;implies2&#8203;(<a href="../rex/RexNode.html" title="class in org.apache.calcite.rex">RexNode</a>&nbsp;first,
<a href="../rex/RexNode.html" title="class in org.apache.calcite.rex">RexNode</a>&nbsp;second)</pre>
<div class="block">Returns whether the predicate <code>first</code> (not a conjunction)
implies <code>second</code>.</div>
</li>
</ul>
<a id="isSatisfiable(org.apache.calcite.rex.RexNode,org.apache.calcite.DataContext)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>isSatisfiable</h4>
<pre class="methodSignature">private&nbsp;boolean&nbsp;isSatisfiable&#8203;(<a href="../rex/RexNode.html" title="class in org.apache.calcite.rex">RexNode</a>&nbsp;second,
<a href="../DataContext.html" title="interface in org.apache.calcite">DataContext</a>&nbsp;dataValues)</pre>
</li>
</ul>
<a id="checkSupport(org.apache.calcite.plan.RexImplicationChecker.InputUsageFinder,org.apache.calcite.plan.RexImplicationChecker.InputUsageFinder)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>checkSupport</h4>
<pre class="methodSignature">private&nbsp;boolean&nbsp;checkSupport&#8203;(<a href="RexImplicationChecker.InputUsageFinder.html" title="class in org.apache.calcite.plan">RexImplicationChecker.InputUsageFinder</a>&nbsp;firstUsageFinder,
<a href="RexImplicationChecker.InputUsageFinder.html" title="class in org.apache.calcite.plan">RexImplicationChecker.InputUsageFinder</a>&nbsp;secondUsageFinder)</pre>
<div class="block">Looks at the usage of variables in first and second conjunction to decide
whether this kind of expression is currently supported for proving first
implies second.
<ol>
<li>Variables should be used only once in both the conjunction against
given set of operations only: &gt;, &lt;, &le;, &ge;, =; &ne;.
<li>All the variables used in second condition should be used even in the
first.
<li>If operator used for variable in first is op1 and op2 for second, then
we support these combination for conjunction (op1, op2) then op1, op2
belongs to one of the following sets:
<ul>
<li>(&lt;, &le;) X (&lt;, &le;) <i>note: X represents cartesian product</i>
<li>(&gt; / &ge;) X (&gt;, &ge;)
<li>(=) X (&gt;, &ge;, &lt;, &le;, =, &ne;)
<li>(&ne;, =)
</ul>
<li>We support at most 2 operators to be be used for a variable in first
and second usages.
</ol></div>
<dl>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>whether input usage pattern is supported</dd>
</dl>
</li>
</ul>
<a id="isSupportedUnaryOperators(org.apache.calcite.sql.SqlKind)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>isSupportedUnaryOperators</h4>
<pre class="methodSignature">private&nbsp;boolean&nbsp;isSupportedUnaryOperators&#8203;(<a href="../sql/SqlKind.html" title="enum in org.apache.calcite.sql">SqlKind</a>&nbsp;kind)</pre>
</li>
</ul>
<a id="isEquivalentOp(org.apache.calcite.sql.SqlKind,org.apache.calcite.sql.SqlKind)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>isEquivalentOp</h4>
<pre class="methodSignature">private&nbsp;boolean&nbsp;isEquivalentOp&#8203;(<a href="../sql/SqlKind.html" title="enum in org.apache.calcite.sql">SqlKind</a>&nbsp;fKind,
<a href="../sql/SqlKind.html" title="enum in org.apache.calcite.sql">SqlKind</a>&nbsp;sKind)</pre>
</li>
</ul>
<a id="isOppositeOp(org.apache.calcite.sql.SqlKind,org.apache.calcite.sql.SqlKind)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>isOppositeOp</h4>
<pre class="methodSignature">private&nbsp;boolean&nbsp;isOppositeOp&#8203;(<a href="../sql/SqlKind.html" title="enum in org.apache.calcite.sql">SqlKind</a>&nbsp;fKind,
<a href="../sql/SqlKind.html" title="enum in org.apache.calcite.sql">SqlKind</a>&nbsp;sKind)</pre>
</li>
</ul>
<a id="validate(org.apache.calcite.rex.RexNode,org.apache.calcite.rex.RexNode)">
<!-- -->
</a>
<ul class="blockListLast">
<li class="blockList">
<h4>validate</h4>
<pre class="methodSignature">private&nbsp;boolean&nbsp;validate&#8203;(<a href="../rex/RexNode.html" title="class in org.apache.calcite.rex">RexNode</a>&nbsp;first,
<a href="../rex/RexNode.html" title="class in org.apache.calcite.rex">RexNode</a>&nbsp;second)</pre>
</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/RexImplicationChecker.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><a href="#field.summary">Field</a>&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><a href="#field.detail">Field</a>&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>