blob: 78b798493375e5214417cada7d9e82b3f3ff9769 [file] [log] [blame]
<!DOCTYPE HTML>
<!-- NewPage -->
<html lang="en">
<head>
<!-- Generated by javadoc -->
<title>SqlValidatorWithHints (Apache Calcite calcite API)</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="description" content="declaration: package: org.apache.calcite.sql.validate, interface: SqlValidatorWithHints">
<meta name="generator" content="javadoc/ClassWriterImpl">
<link rel="stylesheet" type="text/css" href="../../../../../stylesheet.css" title="Style">
<link rel="stylesheet" type="text/css" href="../../../../../script-dir/jquery-ui.css" title="Style">
<script type="text/javascript" src="../../../../../script.js"></script>
<script type="text/javascript" src="../../../../../script-dir/jszip/dist/jszip.min.js"></script>
<script type="text/javascript" src="../../../../../script-dir/jszip-utils/dist/jszip-utils.min.js"></script>
<!--[if IE]>
<script type="text/javascript" src="../../../../../script-dir/jszip-utils/dist/jszip-utils-ie.min.js"></script>
<![endif]-->
<script type="text/javascript" src="../../../../../script-dir/jquery-3.4.1.js"></script>
<script type="text/javascript" src="../../../../../script-dir/jquery-ui.js"></script>
</head>
<body class="class-declaration">
<script type="text/javascript">var data = {"i0":6,"i1":6};
var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],4:["t3","Abstract Methods"]};
var altColor = "altColor";
var rowColor = "rowColor";
var tableTab = "tableTab";
var activeTableTab = "activeTableTab";
var pathtoroot = "../../../../../";
loadScripts(document, 'script');</script>
<noscript>
<div>JavaScript is disabled on your browser.</div>
</noscript>
<div class="flexBox">
<header role="banner" class="flexHeader">
<nav role="navigation">
<!-- ========= 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="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 class="aboutLanguage"><b>Apache Calcite</b></div>
</div>
<div class="subNav">
<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>Constr&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>Constr&nbsp;|&nbsp;</li>
<li><a href="#method.detail">Method</a></li>
</ul>
</div>
<div class="navListSearch"><label for="search">SEARCH:</label>
<input type="text" id="search" value="search" disabled="disabled">
<input type="reset" id="reset" value="reset" disabled="disabled">
</div>
</div>
<!-- ========= END OF TOP NAVBAR ========= -->
<div class="skipNav"><a id="skip.navbar.top">
<!-- -->
</a></div>
</nav>
</header>
<div class="flexContent">
<main role="main">
<!-- ======== START OF CLASS DATA ======== -->
<div class="header">
<div class="subTitle"><span class="packageLabelInType">Package</span>&nbsp;<a href="package-summary.html">org.apache.calcite.sql.validate</a></div>
<h1 title="Interface SqlValidatorWithHints" class="title">Interface SqlValidatorWithHints</h1>
</div>
<div class="contentContainer">
<section class="description">
<dl>
<dt>All Superinterfaces:</dt>
<dd><code><a href="SqlValidator.html" title="interface in org.apache.calcite.sql.validate">SqlValidator</a></code></dd>
</dl>
<dl>
<dt>All Known Implementing Classes:</dt>
<dd><code><a href="../../jdbc/ContextSqlValidator.html" title="class in org.apache.calcite.jdbc">ContextSqlValidator</a></code>, <code><a href="../advise/SqlAdvisorValidator.html" title="class in org.apache.calcite.sql.advise">SqlAdvisorValidator</a></code>, <code><a href="SqlValidatorImpl.html" title="class in org.apache.calcite.sql.validate">SqlValidatorImpl</a></code></dd>
</dl>
<hr>
<pre>public interface <span class="typeNameLabel">SqlValidatorWithHints</span>
extends <a href="SqlValidator.html" title="interface in org.apache.calcite.sql.validate">SqlValidator</a></pre>
<div class="block">Extends <a href="SqlValidator.html" title="interface in org.apache.calcite.sql.validate"><code>SqlValidator</code></a> to allow discovery of useful data such as fully
qualified names of SQL objects, alternative valid SQL objects that can be
used in the SQL statement (dubbed as hints).</div>
</section>
<section class="summary">
<ul class="blockList">
<!-- ======== NESTED CLASS SUMMARY ======== -->
<li class="blockList">
<section class="nestedClassSummary"><a id="nested.class.summary">
<!-- -->
</a>
<h2>Nested Class Summary</h2>
<div class="inheritedList">
<h2>Nested classes/interfaces inherited from interface&nbsp;org.apache.calcite.sql.validate.<a href="SqlValidator.html" title="interface in org.apache.calcite.sql.validate">SqlValidator</a></h2>
<a id="nested.classes.inherited.from.class.org.apache.calcite.sql.validate.SqlValidator">
<!-- -->
</a><code><a href="SqlValidator.Config.html" title="interface in org.apache.calcite.sql.validate">SqlValidator.Config</a></code></div>
</section>
</li>
<!-- ========== METHOD SUMMARY =========== -->
<li class="blockList">
<section class="methodSummary"><a id="method.summary">
<!-- -->
</a>
<h2>Method Summary</h2>
<div class="memberSummary">
<div role="tablist" aria-orientation="horizontal"><button role="tab" aria-selected="true" aria-controls="memberSummary_tabpanel" tabindex="0" onkeydown="switchTab(event)" id="t0" class="activeTableTab">All Methods</button><button role="tab" aria-selected="false" aria-controls="memberSummary_tabpanel" tabindex="-1" onkeydown="switchTab(event)" id="t2" class="tableTab" onclick="show(2);">Instance Methods</button><button role="tab" aria-selected="false" aria-controls="memberSummary_tabpanel" tabindex="-1" onkeydown="switchTab(event)" id="t3" class="tableTab" onclick="show(4);">Abstract Methods</button></div>
<div id="memberSummary_tabpanel" role="tabpanel">
<table aria-labelledby="t0">
<thead>
<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>
</thead>
<tbody>
<tr class="altColor" id="i0">
<td class="colFirst"><code><a href="https://docs.oracle.com/javase/9/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util" class="externalLink">List</a>&lt;<a href="SqlMoniker.html" title="interface in org.apache.calcite.sql.validate">SqlMoniker</a>&gt;</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#lookupHints(org.apache.calcite.sql.SqlNode,org.apache.calcite.sql.parser.SqlParserPos)">lookupHints</a></span>&#8203;(<a href="../SqlNode.html" title="class in org.apache.calcite.sql">SqlNode</a>&nbsp;topNode,
<a href="../parser/SqlParserPos.html" title="class in org.apache.calcite.sql.parser">SqlParserPos</a>&nbsp;pos)</code></th>
<td class="colLast">
<div class="block">Looks up completion hints for a syntactically correct SQL statement that
has been parsed into an expression tree.</div>
</td>
</tr>
<tr class="rowColor" id="i1">
<td class="colFirst"><code><a href="SqlMoniker.html" title="interface in org.apache.calcite.sql.validate">SqlMoniker</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#lookupQualifiedName(org.apache.calcite.sql.SqlNode,org.apache.calcite.sql.parser.SqlParserPos)">lookupQualifiedName</a></span>&#8203;(<a href="../SqlNode.html" title="class in org.apache.calcite.sql">SqlNode</a>&nbsp;topNode,
<a href="../parser/SqlParserPos.html" title="class in org.apache.calcite.sql.parser">SqlParserPos</a>&nbsp;pos)</code></th>
<td class="colLast">
<div class="block">Looks up the fully qualified name for a <a href="../SqlIdentifier.html" title="class in org.apache.calcite.sql"><code>SqlIdentifier</code></a> at a given
Parser Position in a parsed expression tree Note: call this only after
<a href="SqlValidator.html#validate(org.apache.calcite.sql.SqlNode)"><code>SqlValidator.validate(org.apache.calcite.sql.SqlNode)</code></a> has been called.</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="inheritedList">
<h3>Methods inherited from interface&nbsp;org.apache.calcite.sql.validate.<a href="SqlValidator.html" title="interface in org.apache.calcite.sql.validate">SqlValidator</a></h3>
<a id="methods.inherited.from.class.org.apache.calcite.sql.validate.SqlValidator">
<!-- -->
</a><code><a href="SqlValidator.html#config()">config</a>, <a href="SqlValidator.html#declareCursor(org.apache.calcite.sql.SqlSelect,org.apache.calcite.sql.validate.SqlValidatorScope)">declareCursor</a>, <a href="SqlValidator.html#deriveAlias(org.apache.calcite.sql.SqlNode,int)">deriveAlias</a>, <a href="SqlValidator.html#deriveConstructorType(org.apache.calcite.sql.validate.SqlValidatorScope,org.apache.calcite.sql.SqlCall,org.apache.calcite.sql.SqlFunction,org.apache.calcite.sql.SqlFunction,java.util.List)">deriveConstructorType</a>, <a href="SqlValidator.html#deriveType(org.apache.calcite.sql.validate.SqlValidatorScope,org.apache.calcite.sql.SqlNode)">deriveType</a>, <a href="SqlValidator.html#expand(org.apache.calcite.sql.SqlNode,org.apache.calcite.sql.validate.SqlValidatorScope)">expand</a>, <a href="SqlValidator.html#expandOrderExpr(org.apache.calcite.sql.SqlSelect,org.apache.calcite.sql.SqlNode)">expandOrderExpr</a>, <a href="SqlValidator.html#expandStar(org.apache.calcite.sql.SqlNodeList,org.apache.calcite.sql.SqlSelect,boolean)">expandStar</a>, <a href="SqlValidator.html#getCatalogReader()">getCatalogReader</a>, <a href="SqlValidator.html#getFieldOrigins(org.apache.calcite.sql.SqlNode)">getFieldOrigins</a>, <a href="SqlValidator.html#getFromScope(org.apache.calcite.sql.SqlSelect)">getFromScope</a>, <a href="SqlValidator.html#getGroupScope(org.apache.calcite.sql.SqlSelect)">getGroupScope</a>, <a href="SqlValidator.html#getHavingScope(org.apache.calcite.sql.SqlSelect)">getHavingScope</a>, <a href="SqlValidator.html#getJoinScope(org.apache.calcite.sql.SqlNode)">getJoinScope</a>, <a href="SqlValidator.html#getMatchRecognizeScope(org.apache.calcite.sql.SqlMatchRecognize)">getMatchRecognizeScope</a>, <a href="SqlValidator.html#getNamespace(org.apache.calcite.sql.SqlNode)">getNamespace</a>, <a href="SqlValidator.html#getOperatorTable()">getOperatorTable</a>, <a href="SqlValidator.html#getOrderScope(org.apache.calcite.sql.SqlSelect)">getOrderScope</a>, <a href="SqlValidator.html#getOverScope(org.apache.calcite.sql.SqlNode)">getOverScope</a>, <a href="SqlValidator.html#getParameterRowType(org.apache.calcite.sql.SqlNode)">getParameterRowType</a>, <a href="SqlValidator.html#getParentCursor(java.lang.String)">getParentCursor</a>, <a href="SqlValidator.html#getRawSelectScope(org.apache.calcite.sql.SqlSelect)">getRawSelectScope</a>, <a href="SqlValidator.html#getSelectScope(org.apache.calcite.sql.SqlSelect)">getSelectScope</a>, <a href="SqlValidator.html#getTypeCoercion()">getTypeCoercion</a>, <a href="SqlValidator.html#getTypeFactory()">getTypeFactory</a>, <a href="SqlValidator.html#getUnknownType()">getUnknownType</a>, <a href="SqlValidator.html#getValidatedNodeType(org.apache.calcite.sql.SqlNode)">getValidatedNodeType</a>, <a href="SqlValidator.html#getValidatedNodeTypeIfKnown(org.apache.calcite.sql.SqlNode)">getValidatedNodeTypeIfKnown</a>, <a href="SqlValidator.html#getWhereScope(org.apache.calcite.sql.SqlSelect)">getWhereScope</a>, <a href="SqlValidator.html#getWithScope(org.apache.calcite.sql.SqlNode)">getWithScope</a>, <a href="SqlValidator.html#handleUnresolvedFunction(org.apache.calcite.sql.SqlCall,org.apache.calcite.sql.SqlFunction,java.util.List,java.util.List)">handleUnresolvedFunction</a>, <a href="SqlValidator.html#isAggregate(org.apache.calcite.sql.SqlNode)">isAggregate</a>, <a href="SqlValidator.html#isAggregate(org.apache.calcite.sql.SqlSelect)">isAggregate</a>, <a href="SqlValidator.html#isSystemField(org.apache.calcite.rel.type.RelDataTypeField)">isSystemField</a>, <a href="SqlValidator.html#makeNullaryCall(org.apache.calcite.sql.SqlIdentifier)">makeNullaryCall</a>, <a href="SqlValidator.html#newValidationError(org.apache.calcite.sql.SqlNode,org.apache.calcite.runtime.Resources.ExInst)">newValidationError</a>, <a href="SqlValidator.html#popFunctionCall()">popFunctionCall</a>, <a href="SqlValidator.html#pushFunctionCall()">pushFunctionCall</a>, <a href="SqlValidator.html#removeValidatedNodeType(org.apache.calcite.sql.SqlNode)">removeValidatedNodeType</a>, <a href="SqlValidator.html#resolveWindow(org.apache.calcite.sql.SqlNode,org.apache.calcite.sql.validate.SqlValidatorScope)">resolveWindow</a>, <a href="SqlValidator.html#resolveWindow(org.apache.calcite.sql.SqlNode,org.apache.calcite.sql.validate.SqlValidatorScope,boolean)">resolveWindow</a>, <a href="SqlValidator.html#setValidatedNodeType(org.apache.calcite.sql.SqlNode,org.apache.calcite.rel.type.RelDataType)">setValidatedNodeType</a>, <a href="SqlValidator.html#transform(java.util.function.UnaryOperator)">transform</a>, <a href="SqlValidator.html#validate(org.apache.calcite.sql.SqlNode)">validate</a>, <a href="SqlValidator.html#validateAggregateParams(org.apache.calcite.sql.SqlCall,org.apache.calcite.sql.SqlNode,org.apache.calcite.sql.SqlNodeList,org.apache.calcite.sql.validate.SqlValidatorScope)">validateAggregateParams</a>, <a href="SqlValidator.html#validateCall(org.apache.calcite.sql.SqlCall,org.apache.calcite.sql.validate.SqlValidatorScope)">validateCall</a>, <a href="SqlValidator.html#validateColumnListParams(org.apache.calcite.sql.SqlFunction,java.util.List,java.util.List)">validateColumnListParams</a>, <a href="SqlValidator.html#validateDataType(org.apache.calcite.sql.SqlDataTypeSpec)">validateDataType</a>, <a href="SqlValidator.html#validateDelete(org.apache.calcite.sql.SqlDelete)">validateDelete</a>, <a href="SqlValidator.html#validateDynamicParam(org.apache.calcite.sql.SqlDynamicParam)">validateDynamicParam</a>, <a href="SqlValidator.html#validateIdentifier(org.apache.calcite.sql.SqlIdentifier,org.apache.calcite.sql.validate.SqlValidatorScope)">validateIdentifier</a>, <a href="SqlValidator.html#validateInsert(org.apache.calcite.sql.SqlInsert)">validateInsert</a>, <a href="SqlValidator.html#validateIntervalQualifier(org.apache.calcite.sql.SqlIntervalQualifier)">validateIntervalQualifier</a>, <a href="SqlValidator.html#validateLiteral(org.apache.calcite.sql.SqlLiteral)">validateLiteral</a>, <a href="SqlValidator.html#validateMatchRecognize(org.apache.calcite.sql.SqlCall)">validateMatchRecognize</a>, <a href="SqlValidator.html#validateMerge(org.apache.calcite.sql.SqlMerge)">validateMerge</a>, <a href="SqlValidator.html#validateModality(org.apache.calcite.sql.SqlSelect,org.apache.calcite.sql.validate.SqlModality,boolean)">validateModality</a>, <a href="SqlValidator.html#validateParameterizedExpression(org.apache.calcite.sql.SqlNode,java.util.Map)">validateParameterizedExpression</a>, <a href="SqlValidator.html#validateQuery(org.apache.calcite.sql.SqlNode,org.apache.calcite.sql.validate.SqlValidatorScope,org.apache.calcite.rel.type.RelDataType)">validateQuery</a>, <a href="SqlValidator.html#validateSequenceValue(org.apache.calcite.sql.validate.SqlValidatorScope,org.apache.calcite.sql.SqlIdentifier)">validateSequenceValue</a>, <a href="SqlValidator.html#validateUpdate(org.apache.calcite.sql.SqlUpdate)">validateUpdate</a>, <a href="SqlValidator.html#validateWindow(org.apache.calcite.sql.SqlNode,org.apache.calcite.sql.validate.SqlValidatorScope,org.apache.calcite.sql.SqlCall)">validateWindow</a>, <a href="SqlValidator.html#validateWith(org.apache.calcite.sql.SqlWith,org.apache.calcite.sql.validate.SqlValidatorScope)">validateWith</a>, <a href="SqlValidator.html#validateWithItem(org.apache.calcite.sql.SqlWithItem)">validateWithItem</a></code></div>
</section>
</li>
</ul>
</section>
<section class="details">
<ul class="blockList">
<!-- ============ METHOD DETAIL ========== -->
<li class="blockList">
<section class="methodDetails"><a id="method.detail">
<!-- -->
</a>
<h2>Method Details</h2>
<ul class="blockList">
<li class="blockList">
<section class="detail">
<h3><a id="lookupHints(org.apache.calcite.sql.SqlNode,org.apache.calcite.sql.parser.SqlParserPos)">lookupHints</a></h3>
<div class="memberSignature"><span class="returnType"><a href="https://docs.oracle.com/javase/9/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util" class="externalLink">List</a>&lt;<a href="SqlMoniker.html" title="interface in org.apache.calcite.sql.validate">SqlMoniker</a>&gt;</span>&nbsp;<span class="memberName">lookupHints</span>&#8203;(<span class="arguments"><a href="../SqlNode.html" title="class in org.apache.calcite.sql">SqlNode</a>&nbsp;topNode,
<a href="../parser/SqlParserPos.html" title="class in org.apache.calcite.sql.parser">SqlParserPos</a>&nbsp;pos)</span></div>
<div class="block">Looks up completion hints for a syntactically correct SQL statement that
has been parsed into an expression tree. (Note this should be called
after <a href="SqlValidator.html#validate(org.apache.calcite.sql.SqlNode)"><code>SqlValidator.validate(org.apache.calcite.sql.SqlNode)</code></a>.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>topNode</code> - top of expression tree in which to lookup completion hints</dd>
<dd><code>pos</code> - indicates the position in the sql statement we want to get
completion hints for. For example, "select a.ename, b.deptno
from sales.emp a join sales.dept b "on a.deptno=b.deptno
where empno=1"; setting pos to 'Line 1, Column 17' returns
all the possible column names that can be selected from
sales.dept table setting pos to 'Line 1, Column 31' returns
all the possible table names in 'sales' schema</dd>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>an array of <a href="SqlMoniker.html" title="interface in org.apache.calcite.sql.validate"><code>SqlMoniker</code></a> (sql identifiers) that can fill in
at the indicated position</dd>
</dl>
</section>
</li>
<li class="blockList">
<section class="detail">
<h3><a id="lookupQualifiedName(org.apache.calcite.sql.SqlNode,org.apache.calcite.sql.parser.SqlParserPos)">lookupQualifiedName</a></h3>
<div class="memberSignature"><span class="returnType"><a href="SqlMoniker.html" title="interface in org.apache.calcite.sql.validate">SqlMoniker</a></span>&nbsp;<span class="memberName">lookupQualifiedName</span>&#8203;(<span class="arguments"><a href="../SqlNode.html" title="class in org.apache.calcite.sql">SqlNode</a>&nbsp;topNode,
<a href="../parser/SqlParserPos.html" title="class in org.apache.calcite.sql.parser">SqlParserPos</a>&nbsp;pos)</span></div>
<div class="block">Looks up the fully qualified name for a <a href="../SqlIdentifier.html" title="class in org.apache.calcite.sql"><code>SqlIdentifier</code></a> at a given
Parser Position in a parsed expression tree Note: call this only after
<a href="SqlValidator.html#validate(org.apache.calcite.sql.SqlNode)"><code>SqlValidator.validate(org.apache.calcite.sql.SqlNode)</code></a> has been called.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>topNode</code> - top of expression tree in which to lookup the qualified
name for the SqlIdentifier</dd>
<dd><code>pos</code> - indicates the position of the <a href="../SqlIdentifier.html" title="class in org.apache.calcite.sql"><code>SqlIdentifier</code></a> in
the SQL statement we want to get the qualified
name for</dd>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>a string of the fully qualified name of the <a href="../SqlIdentifier.html" title="class in org.apache.calcite.sql"><code>SqlIdentifier</code></a>
if the Parser position represents a valid <a href="../SqlIdentifier.html" title="class in org.apache.calcite.sql"><code>SqlIdentifier</code></a>. Else
return an empty string</dd>
</dl>
</section>
</li>
</ul>
</section>
</li>
</ul>
</section>
</div>
<!-- ========= END OF CLASS DATA ========= -->
</main>
<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="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 class="aboutLanguage"><b>Apache Calcite</b></div>
</div>
<div class="subNav">
<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>Constr&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>Constr&nbsp;|&nbsp;</li>
<li><a href="#method.detail">Method</a></li>
</ul>
</div>
</div>
<a id="skip.navbar.bottom">
<!-- -->
</a>
<!-- ======== END OF BOTTOM NAVBAR ======= -->
</nav>
<p class="legalCopy"><small>Copyright &copy; 2012-2020 Apache Software Foundation. All Rights Reserved.</small></p>
</footer>
</div>
</div>
</body>
</html>