blob: 603efa9e2c5ff722b8ca266becb3779731082a36 [file] [log] [blame]
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!-- NewPage -->
<html lang="en">
<head>
<!-- Generated by javadoc -->
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>ArrayListener (Drill : 1.20.3 API)</title>
<link rel="stylesheet" type="text/css" href="../../../../../../../../stylesheet.css" title="Style">
<script type="text/javascript" src="../../../../../../../../script.js"></script>
</head>
<body>
<script type="text/javascript"><!--
try {
if (location.href.indexOf('is-external=true') == -1) {
parent.document.title="ArrayListener (Drill : 1.20.3 API)";
}
}
catch(err) {
}
//-->
var methods = {"i0":6,"i1":6,"i2":6,"i3":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";
</script>
<noscript>
<div>JavaScript is disabled on your browser.</div>
</noscript>
<!-- ========= START OF TOP NAVBAR ======= -->
<div class="topNav"><a name="navbar.top">
<!-- -->
</a>
<div class="skipNav"><a href="#skip.navbar.top" title="Skip navigation links">Skip navigation links</a></div>
<a name="navbar.top.firstrow">
<!-- -->
</a>
<ul class="navList" title="Navigation">
<li><a href="../../../../../../../../overview-summary.html">Overview</a></li>
<li><a href="package-summary.html">Package</a></li>
<li class="navBarCell1Rev">Class</li>
<li><a href="class-use/ArrayListener.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">
<li><a href="../../../../../../../../org/apache/drill/exec/store/easy/json/parser/AbstractElementParser.html" title="class in org.apache.drill.exec.store.easy.json.parser"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
<li><a href="../../../../../../../../org/apache/drill/exec/store/easy/json/parser/ArrayParser.html" title="class in org.apache.drill.exec.store.easy.json.parser"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
</ul>
<ul class="navList">
<li><a href="../../../../../../../../index.html?org/apache/drill/exec/store/easy/json/parser/ArrayListener.html" target="_top">Frames</a></li>
<li><a href="ArrayListener.html" target="_top">No&nbsp;Frames</a></li>
</ul>
<ul class="navList" id="allclasses_navbar_top">
<li><a href="../../../../../../../../allclasses-noframe.html">All&nbsp;Classes</a></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>
</div>
<div>
<ul class="subNavList">
<li>Summary:&nbsp;</li>
<li>Nested&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>
<a name="skip.navbar.top">
<!-- -->
</a></div>
<!-- ========= END OF TOP NAVBAR ========= -->
<!-- ======== START OF CLASS DATA ======== -->
<div class="header">
<div class="subTitle">org.apache.drill.exec.store.easy.json.parser</div>
<h2 title="Interface ArrayListener" class="title">Interface ArrayListener</h2>
</div>
<div class="contentContainer">
<div class="description">
<ul class="blockList">
<li class="blockList">
<dl>
<dt>All Known Implementing Classes:</dt>
<dd><a href="../../../../../../../../org/apache/drill/exec/store/easy/json/loader/SimpleArrayListener.html" title="class in org.apache.drill.exec.store.easy.json.loader">SimpleArrayListener</a>, <a href="../../../../../../../../org/apache/drill/exec/store/easy/json/loader/SimpleArrayListener.ListArrayListener.html" title="class in org.apache.drill.exec.store.easy.json.loader">SimpleArrayListener.ListArrayListener</a>, <a href="../../../../../../../../org/apache/drill/exec/store/easy/json/loader/SimpleArrayListener.StructureArrayListener.html" title="class in org.apache.drill.exec.store.easy.json.loader">SimpleArrayListener.StructureArrayListener</a></dd>
</dl>
<hr>
<br>
<pre>public interface <span class="typeNameLabel">ArrayListener</span></pre>
<div class="block">Represents one level within array. The first time the parser sees the array element,
it will call the <code>#element(ValueDef)</code> method with the
look-ahead values visible to the parser. Since JSON is flexible, later
data shapes may not necessarily follow the first shape. The implementation
must handle this or throw an error if not supported.
<p>
When creating a multi-dimensional array, each array level is built one
by one. each will receive the same type information (decreased by one
array level.)
<p>
Then, while parsing, the parser calls events on the start and end of the
array, as well as on each element.
<p>
The array listener is an attribute of a value listener, represent the
"arrayness" of that value, if the value allows an array.
<h4>Elements</h4>
The array listener has a child listener that represents each element
in the array. The structure parser asks this listener to create that
child on the first element seen for the array. The structure parser
provides "look-ahead" type information for that element, when available.
<p>
Three JSON-specific cases warrant attention:
<ol>
<li>The first occurrence of the array is empty: <code>[ ]</code>. In this case,
the structure parser will defer asking for an element parser (and listener)
until an actual value appears. The array listener is responsible for
implementing some kind of "deferred type" logic to wait and see what
kind of element appears later.</li>
<li>The first occurrence of the array has, as its first element, a
<code>null</code> value. The structure parser will ask this listener to create
an array child for the <code>null</code> value, but the listener has no type
information. Since null values must be recorded (so we know how many
appear in each array), the listener is forced to choose a type. Choose
wisely as there is no way to know what type will appear in the future.</li>
<li>A generalized form of the above is that the structure parser only
knows what it sees on the first element when it asks for an element
child. In a well-formed file, that first token will predict the type
of all future tokens. But, JSON allows anything. The first element
might be <code>null</code>, an empty array, or a String. The second element
could be anything else (a number or an object). The listener, as always
is responsible for deciding how to handle type changes.</li>
</ol>
<h4>Multi-Dimensional Arrays</h4>
A multi-dimensional array is one of the form <code>[ [ ... </code>, that is,
the parser returns multiple levels of array start tokens. In this case,
listeners are structured as:
<ul>
<li><code>ObjectListener</code> for the enclosing object which has a</li>
<li><code>FieldListener</code> for the array value which has a</li>
<li><code>ArrayListener</code> for the array, which has a</li>
<li><code>ValueListener</code> for the elements. If the array is 1D,
the nesting stops here. But if it is 2+D, then the value has a</li>
<li><code>ArrayListener</code> for the inner array, which has a</li>
<li><code>ValueListener</code> for the elements. And so on recursively
for as many levels as needed or the array.</li>
</ul></div>
</li>
</ul>
</div>
<div class="summary">
<ul class="blockList">
<li class="blockList">
<!-- ========== METHOD SUMMARY =========== -->
<ul class="blockList">
<li class="blockList"><a name="method.summary">
<!-- -->
</a>
<h3>Method Summary</h3>
<table class="memberSummary" border="0" cellpadding="3" cellspacing="0" summary="Method Summary table, listing methods, and an explanation">
<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="t3" class="tableTab"><span><a href="javascript:show(4);">Abstract Methods</a></span><span class="tabEnd">&nbsp;</span></span></caption>
<tr>
<th class="colFirst" scope="col">Modifier and Type</th>
<th class="colLast" scope="col">Method and Description</th>
</tr>
<tr id="i0" class="altColor">
<td class="colFirst"><code>void</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../../org/apache/drill/exec/store/easy/json/parser/ArrayListener.html#onElementEnd--">onElementEnd</a></span>()</code>
<div class="block">Called after each element of the array.</div>
</td>
</tr>
<tr id="i1" class="rowColor">
<td class="colFirst"><code>void</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../../org/apache/drill/exec/store/easy/json/parser/ArrayListener.html#onElementStart--">onElementStart</a></span>()</code>
<div class="block">Called for each element of the array.</div>
</td>
</tr>
<tr id="i2" class="altColor">
<td class="colFirst"><code>void</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../../org/apache/drill/exec/store/easy/json/parser/ArrayListener.html#onEnd--">onEnd</a></span>()</code>
<div class="block">Called at the end of a set of values for an array.</div>
</td>
</tr>
<tr id="i3" class="rowColor">
<td class="colFirst"><code>void</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../../org/apache/drill/exec/store/easy/json/parser/ArrayListener.html#onStart--">onStart</a></span>()</code>
<div class="block">Called at the entrance to each level (dimension) of an array.</div>
</td>
</tr>
</table>
</li>
</ul>
</li>
</ul>
</div>
<div class="details">
<ul class="blockList">
<li class="blockList">
<!-- ============ METHOD DETAIL ========== -->
<ul class="blockList">
<li class="blockList"><a name="method.detail">
<!-- -->
</a>
<h3>Method Detail</h3>
<a name="onStart--">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>onStart</h4>
<pre>void&nbsp;onStart()</pre>
<div class="block">Called at the entrance to each level (dimension) of an array.
That is, called when the structure parser accepts the <code>[</code>
token.</div>
</li>
</ul>
<a name="onElementStart--">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>onElementStart</h4>
<pre>void&nbsp;onElementStart()</pre>
<div class="block">Called for each element of the array. The array element is represented
by its own listener which receives the value of the element (if
scalar) or element events (if structured.)</div>
</li>
</ul>
<a name="onElementEnd--">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>onElementEnd</h4>
<pre>void&nbsp;onElementEnd()</pre>
<div class="block">Called after each element of the array.</div>
</li>
</ul>
<a name="onEnd--">
<!-- -->
</a>
<ul class="blockListLast">
<li class="blockList">
<h4>onEnd</h4>
<pre>void&nbsp;onEnd()</pre>
<div class="block">Called at the end of a set of values for an array. That is, called
when the structure parser accepts the <code>]</code> token.</div>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
</div>
<!-- ========= END OF CLASS DATA ========= -->
<!-- ======= START OF BOTTOM NAVBAR ====== -->
<div class="bottomNav"><a name="navbar.bottom">
<!-- -->
</a>
<div class="skipNav"><a href="#skip.navbar.bottom" title="Skip navigation links">Skip navigation links</a></div>
<a name="navbar.bottom.firstrow">
<!-- -->
</a>
<ul class="navList" title="Navigation">
<li><a href="../../../../../../../../overview-summary.html">Overview</a></li>
<li><a href="package-summary.html">Package</a></li>
<li class="navBarCell1Rev">Class</li>
<li><a href="class-use/ArrayListener.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">
<li><a href="../../../../../../../../org/apache/drill/exec/store/easy/json/parser/AbstractElementParser.html" title="class in org.apache.drill.exec.store.easy.json.parser"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
<li><a href="../../../../../../../../org/apache/drill/exec/store/easy/json/parser/ArrayParser.html" title="class in org.apache.drill.exec.store.easy.json.parser"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
</ul>
<ul class="navList">
<li><a href="../../../../../../../../index.html?org/apache/drill/exec/store/easy/json/parser/ArrayListener.html" target="_top">Frames</a></li>
<li><a href="ArrayListener.html" target="_top">No&nbsp;Frames</a></li>
</ul>
<ul class="navList" id="allclasses_navbar_bottom">
<li><a href="../../../../../../../../allclasses-noframe.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>
</div>
<div>
<ul class="subNavList">
<li>Summary:&nbsp;</li>
<li>Nested&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>
<a name="skip.navbar.bottom">
<!-- -->
</a></div>
<!-- ======== END OF BOTTOM NAVBAR ======= -->
<p class="legalCopy"><small>Copyright &#169; 1970 <a href="https://www.apache.org/">The Apache Software Foundation</a>. All rights reserved.</small></p>
</body>
</html>