blob: dedaf62cacae3a8ef484ad017581e656936c578c [file] [log] [blame]
<!DOCTYPE HTML>
<html lang="en-US">
<head>
<meta charset="UTF-8">
<title>JSON/YAML models</title>
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="generator" content="Jekyll v3.7.3">
<link rel="stylesheet" href="//fonts.googleapis.com/css?family=Lato:300,300italic,400,400italic,700,700italic,900">
<link rel="stylesheet" href="/css/screen.css">
<link rel="icon" type="image/x-icon" href="/favicon.ico">
<!--[if lt IE 9]>
<script src="/js/html5shiv.min.js"></script>
<script src="/js/respond.min.js"></script>
<![endif]-->
</head>
<body class="wrap">
<header role="banner">
<div class="grid">
<div class="unit center-on-mobiles">
<h1>
<a href="/">
<span class="sr-only">Apache Calcite</span>
<img src="/img/logo.svg" alt="Calcite Logo">
</a>
</h1>
</div>
<nav class="main-nav">
<ul>
<li class="">
<a href="/">Home</a>
</li>
<li class="">
<a href="/downloads/">Download</a>
</li>
<li class="">
<a href="/community/">Community</a>
</li>
<li class="">
<a href="/develop/">Develop</a>
</li>
<li class="">
<a href="/news/">News</a>
</li>
<li class="current">
<a href="/docs/">Docs</a>
</li>
</ul>
</nav>
</div>
</header>
<section class="docs">
<div class="grid">
<div class="docs-nav-mobile unit whole show-on-mobiles">
<select onchange="if (this.value) window.location.href=this.value">
<option value="">Navigate the docs…</option>
<optgroup label="Overview">
</optgroup>
<optgroup label="Advanced">
</optgroup>
<optgroup label="Avatica">
</optgroup>
<optgroup label="Reference">
</optgroup>
<optgroup label="Meta">
</optgroup>
</select>
</div>
<div class="unit four-fifths">
<article>
<h1>JSON/YAML models</h1>
<!--
-->
<p>Calcite models can be represented as JSON/YAML files.
This page describes the structure of those files.</p>
<p>Models can also be built programmatically using the <code class="highlighter-rouge">Schema</code> SPI.</p>
<h2 id="elements">Elements</h2>
<h3 id="root">Root</h3>
<h4 id="json">JSON</h4>
<figure class="highlight"><pre><code class="language-json" data-lang="json"><span class="p">{</span><span class="w">
</span><span class="err">version</span><span class="p">:</span><span class="w"> </span><span class="err">'</span><span class="mf">1.0</span><span class="err">'</span><span class="p">,</span><span class="w">
</span><span class="err">defaultSchema</span><span class="p">:</span><span class="w"> </span><span class="err">'mongo'</span><span class="p">,</span><span class="w">
</span><span class="err">schemas</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w"> </span><span class="err">Schema...</span><span class="w"> </span><span class="p">]</span><span class="w">
</span><span class="p">}</span></code></pre></figure>
<h4 id="yaml">YAML</h4>
<figure class="highlight"><pre><code class="language-yaml" data-lang="yaml"><span class="na">version</span><span class="pi">:</span> <span class="s">1.0</span>
<span class="na">defaultSchema</span><span class="pi">:</span> <span class="s">mongo</span>
<span class="na">schemas</span><span class="pi">:</span>
<span class="pi">-</span> <span class="pi">[</span><span class="nv">Schema...</span><span class="pi">]</span></code></pre></figure>
<p><code class="highlighter-rouge">version</code> (required string) must have value <code class="highlighter-rouge">1.0</code>.</p>
<p><code class="highlighter-rouge">defaultSchema</code> (optional string). If specified, it is
the name (case-sensitive) of a schema defined in this model, and will
become the default schema for connections to Calcite that use this model.</p>
<p><code class="highlighter-rouge">schemas</code> (optional list of <a href="#schema">Schema</a> elements).</p>
<h3 id="schema">Schema</h3>
<p>Occurs within <code class="highlighter-rouge">root.schemas</code>.</p>
<h4 id="json-1">JSON</h4>
<figure class="highlight"><pre><code class="language-json" data-lang="json"><span class="p">{</span><span class="w">
</span><span class="err">name</span><span class="p">:</span><span class="w"> </span><span class="err">'foodmart'</span><span class="p">,</span><span class="w">
</span><span class="err">path</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="err">'lib'</span><span class="p">],</span><span class="w">
</span><span class="err">cache</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span><span class="w">
</span><span class="err">materializations</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w"> </span><span class="err">Materialization...</span><span class="w"> </span><span class="p">]</span><span class="w">
</span><span class="p">}</span></code></pre></figure>
<h4 id="yaml-1">YAML</h4>
<figure class="highlight"><pre><code class="language-yaml" data-lang="yaml"><span class="na">name</span><span class="pi">:</span> <span class="s">foodmart</span>
<span class="na">path</span><span class="pi">:</span>
<span class="s">lib</span>
<span class="na">cache</span><span class="pi">:</span> <span class="no">true</span>
<span class="na">materializations</span><span class="pi">:</span>
<span class="pi">-</span> <span class="pi">[</span> <span class="nv">Materialization...</span> <span class="pi">]</span></code></pre></figure>
<p><code class="highlighter-rouge">name</code> (required string) is the name of the schema.</p>
<p><code class="highlighter-rouge">type</code> (optional string, default <code class="highlighter-rouge">map</code>) indicates sub-type. Values are:</p>
<ul>
<li><code class="highlighter-rouge">map</code> for <a href="#map-schema">Map Schema</a></li>
<li><code class="highlighter-rouge">custom</code> for <a href="#custom-schema">Custom Schema</a></li>
<li><code class="highlighter-rouge">jdbc</code> for <a href="#jdbc-schema">JDBC Schema</a></li>
</ul>
<p><code class="highlighter-rouge">path</code> (optional list) is the SQL path that is used to
resolve functions used in this schema. If specified it must be a list,
and each element of the list must be either a string or a list of
strings. For example,</p>
<h4 id="json-2">JSON</h4>
<figure class="highlight"><pre><code class="language-json" data-lang="json"><span class="w"> </span><span class="err">path</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w"> </span><span class="p">[</span><span class="err">'usr'</span><span class="p">,</span><span class="w"> </span><span class="err">'lib'</span><span class="p">],</span><span class="w"> </span><span class="err">'lib'</span><span class="w"> </span><span class="p">]</span></code></pre></figure>
<h4 id="yaml-2">YAML</h4>
<figure class="highlight"><pre><code class="language-yaml" data-lang="yaml"><span class="na">path</span><span class="pi">:</span>
<span class="pi">-</span> <span class="pi">[</span><span class="nv">usr</span><span class="pi">,</span> <span class="nv">lib</span><span class="pi">]</span>
<span class="pi">-</span> <span class="s">lib</span></code></pre></figure>
<p>declares a path with two elements: the schema ‘/usr/lib’ and the
schema ‘/lib’. Most schemas are at the top level, and for these you can use a
string.</p>
<p><code class="highlighter-rouge">materializations</code> (optional list of
<a href="#materialization">Materialization</a>) defines the tables
in this schema that are materializations of queries.</p>
<p><code class="highlighter-rouge">cache</code> (optional boolean, default true) tells Calcite whether to
cache metadata (tables, functions and sub-schemas) generated
by this schema.</p>
<ul>
<li>
<p>If <code class="highlighter-rouge">false</code>, Calcite will go back to the schema each time it needs
metadata, for example, each time it needs a list of tables in order to
validate a query against the schema.</p>
</li>
<li>
<p>If <code class="highlighter-rouge">true</code>, Calcite will cache the metadata the first time it reads
it. This can lead to better performance, especially if name-matching is
case-insensitive.</p>
</li>
</ul>
<p>However, it also leads to the problem of cache staleness.
A particular schema implementation can override the
<code class="highlighter-rouge">Schema.contentsHaveChangedSince</code> method to tell Calcite
when it should consider its cache to be out of date.</p>
<p>Tables, functions, types, and sub-schemas explicitly created in a schema are
not affected by this caching mechanism. They always appear in the schema
immediately, and are never flushed.</p>
<h3 id="map-schema">Map Schema</h3>
<p>Like base class <a href="#schema">Schema</a>, occurs within <code class="highlighter-rouge">root.schemas</code>.</p>
<h4 id="json-3">JSON</h4>
<figure class="highlight"><pre><code class="language-json" data-lang="json"><span class="p">{</span><span class="w">
</span><span class="err">name</span><span class="p">:</span><span class="w"> </span><span class="err">'foodmart'</span><span class="p">,</span><span class="w">
</span><span class="err">type</span><span class="p">:</span><span class="w"> </span><span class="err">'map'</span><span class="p">,</span><span class="w">
</span><span class="err">tables</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w"> </span><span class="err">Table...</span><span class="w"> </span><span class="p">],</span><span class="w">
</span><span class="err">functions</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w"> </span><span class="err">Function...</span><span class="w"> </span><span class="p">],</span><span class="w">
</span><span class="err">types</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w"> </span><span class="err">Type...</span><span class="w"> </span><span class="p">]</span><span class="w">
</span><span class="p">}</span></code></pre></figure>
<h4 id="yaml-3">YAML</h4>
<figure class="highlight"><pre><code class="language-yaml" data-lang="yaml"><span class="na">name</span><span class="pi">:</span> <span class="s">foodmart</span>
<span class="na">type</span><span class="pi">:</span> <span class="s">map</span>
<span class="na">tables</span><span class="pi">:</span>
<span class="pi">-</span> <span class="pi">[</span> <span class="nv">Table...</span> <span class="pi">]</span>
<span class="na">functions</span><span class="pi">:</span>
<span class="pi">-</span> <span class="pi">[</span> <span class="nv">Function...</span> <span class="pi">]</span>
<span class="na">types</span><span class="pi">:</span>
<span class="pi">-</span> <span class="pi">[</span> <span class="nv">Type...</span> <span class="pi">]</span></code></pre></figure>
<p><code class="highlighter-rouge">name</code>, <code class="highlighter-rouge">type</code>, <code class="highlighter-rouge">path</code>, <code class="highlighter-rouge">cache</code>, <code class="highlighter-rouge">materializations</code> inherited from
<a href="#schema">Schema</a>.</p>
<p><code class="highlighter-rouge">tables</code> (optional list of <a href="#table">Table</a> elements)
defines the tables in this schema.</p>
<p><code class="highlighter-rouge">functions</code> (optional list of <a href="#function">Function</a> elements)
defines the functions in this schema.</p>
<p><code class="highlighter-rouge">types</code> defines the types in this schema.</p>
<h3 id="custom-schema">Custom Schema</h3>
<p>Like base class <a href="#schema">Schema</a>, occurs within <code class="highlighter-rouge">root.schemas</code>.</p>
<h4 id="json-4">JSON</h4>
<figure class="highlight"><pre><code class="language-json" data-lang="json"><span class="p">{</span><span class="w">
</span><span class="err">name</span><span class="p">:</span><span class="w"> </span><span class="err">'mongo'</span><span class="p">,</span><span class="w">
</span><span class="err">type</span><span class="p">:</span><span class="w"> </span><span class="err">'custom'</span><span class="p">,</span><span class="w">
</span><span class="err">factory</span><span class="p">:</span><span class="w"> </span><span class="err">'org.apache.calcite.adapter.mongodb.MongoSchemaFactory'</span><span class="p">,</span><span class="w">
</span><span class="err">operand</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
</span><span class="err">host</span><span class="p">:</span><span class="w"> </span><span class="err">'localhost'</span><span class="p">,</span><span class="w">
</span><span class="err">database</span><span class="p">:</span><span class="w"> </span><span class="err">'test'</span><span class="w">
</span><span class="p">}</span><span class="w">
</span><span class="p">}</span></code></pre></figure>
<h4 id="yaml-4">YAML</h4>
<figure class="highlight"><pre><code class="language-yaml" data-lang="yaml"><span class="na">name</span><span class="pi">:</span> <span class="s">mongo</span>
<span class="na">type</span><span class="pi">:</span> <span class="s">custom</span>
<span class="na">factory</span><span class="pi">:</span> <span class="s">org.apache.calcite.adapter.mongodb.MongoSchemaFactory</span>
<span class="na">operand</span><span class="pi">:</span>
<span class="na">host</span><span class="pi">:</span> <span class="s">localhost</span>
<span class="na">database</span><span class="pi">:</span> <span class="s">test</span></code></pre></figure>
<p><code class="highlighter-rouge">name</code>, <code class="highlighter-rouge">type</code>, <code class="highlighter-rouge">path</code>, <code class="highlighter-rouge">cache</code>, <code class="highlighter-rouge">materializations</code> inherited from
<a href="#schema">Schema</a>.</p>
<p><code class="highlighter-rouge">factory</code> (required string) is the name of the factory class for this
schema. Must implement interface
<a href="/apidocs/org/apache/calcite/schema/SchemaFactory.html">org.apache.calcite.schema.SchemaFactory</a>
and have a public default constructor.</p>
<p><code class="highlighter-rouge">operand</code> (optional map) contains attributes to be passed to the
factory.</p>
<h3 id="jdbc-schema">JDBC Schema</h3>
<p>Like base class <a href="#schema">Schema</a>, occurs within <code class="highlighter-rouge">root.schemas</code>.</p>
<h4 id="json-5">JSON</h4>
<figure class="highlight"><pre><code class="language-json" data-lang="json"><span class="p">{</span><span class="w">
</span><span class="err">name</span><span class="p">:</span><span class="w"> </span><span class="err">'foodmart'</span><span class="p">,</span><span class="w">
</span><span class="err">type</span><span class="p">:</span><span class="w"> </span><span class="err">'jdbc'</span><span class="p">,</span><span class="w">
</span><span class="err">jdbcDriver</span><span class="p">:</span><span class="w"> </span><span class="err">TODO</span><span class="p">,</span><span class="w">
</span><span class="err">jdbcUrl</span><span class="p">:</span><span class="w"> </span><span class="err">TODO</span><span class="p">,</span><span class="w">
</span><span class="err">jdbcUser</span><span class="p">:</span><span class="w"> </span><span class="err">TODO</span><span class="p">,</span><span class="w">
</span><span class="err">jdbcPassword</span><span class="p">:</span><span class="w"> </span><span class="err">TODO</span><span class="p">,</span><span class="w">
</span><span class="err">jdbcCatalog</span><span class="p">:</span><span class="w"> </span><span class="err">TODO</span><span class="p">,</span><span class="w">
</span><span class="err">jdbcSchema</span><span class="p">:</span><span class="w"> </span><span class="err">TODO</span><span class="w">
</span><span class="p">}</span></code></pre></figure>
<h4 id="yaml-5">YAML</h4>
<figure class="highlight"><pre><code class="language-yaml" data-lang="yaml"><span class="na">name</span><span class="pi">:</span> <span class="s">foodmart</span>
<span class="na">type</span><span class="pi">:</span> <span class="s">jdbc</span>
<span class="na">jdbcDriver</span><span class="pi">:</span> <span class="s">TODO</span>
<span class="na">jdbcUrl</span><span class="pi">:</span> <span class="s">TODO</span>
<span class="na">jdbcUser</span><span class="pi">:</span> <span class="s">TODO</span>
<span class="na">jdbcPassword</span><span class="pi">:</span> <span class="s">TODO</span>
<span class="na">jdbcCatalog</span><span class="pi">:</span> <span class="s">TODO</span>
<span class="na">jdbcSchema</span><span class="pi">:</span> <span class="s">TODO</span></code></pre></figure>
<p><code class="highlighter-rouge">name</code>, <code class="highlighter-rouge">type</code>, <code class="highlighter-rouge">path</code>, <code class="highlighter-rouge">cache</code>, <code class="highlighter-rouge">materializations</code> inherited from
<a href="#schema">Schema</a>.</p>
<p><code class="highlighter-rouge">jdbcDriver</code> (optional string) is the name of the JDBC driver class. If not
specified, uses whichever class the JDBC DriverManager chooses.</p>
<p><code class="highlighter-rouge">jdbcUrl</code> (optional string) is the JDBC connect string, for example
“jdbc:mysql://localhost/foodmart”.</p>
<p><code class="highlighter-rouge">jdbcUser</code> (optional string) is the JDBC user name.</p>
<p><code class="highlighter-rouge">jdbcPassword</code> (optional string) is the JDBC password.</p>
<p><code class="highlighter-rouge">jdbcCatalog</code> (optional string) is the name of the initial catalog in the JDBC
data source.</p>
<p><code class="highlighter-rouge">jdbcSchema</code> (optional string) is the name of the initial schema in the JDBC
data source.</p>
<h3 id="materialization">Materialization</h3>
<p>Occurs within <code class="highlighter-rouge">root.schemas.materializations</code>.</p>
<h4 id="json-6">JSON</h4>
<figure class="highlight"><pre><code class="language-json" data-lang="json"><span class="p">{</span><span class="w">
</span><span class="err">view</span><span class="p">:</span><span class="w"> </span><span class="err">'V'</span><span class="p">,</span><span class="w">
</span><span class="err">table</span><span class="p">:</span><span class="w"> </span><span class="err">'T'</span><span class="p">,</span><span class="w">
</span><span class="err">sql</span><span class="p">:</span><span class="w"> </span><span class="err">'select</span><span class="w"> </span><span class="err">deptno</span><span class="p">,</span><span class="w"> </span><span class="err">count(*)</span><span class="w"> </span><span class="err">as</span><span class="w"> </span><span class="err">c</span><span class="p">,</span><span class="w"> </span><span class="err">sum(sal)</span><span class="w"> </span><span class="err">as</span><span class="w"> </span><span class="err">s</span><span class="w"> </span><span class="err">from</span><span class="w"> </span><span class="err">emp</span><span class="w"> </span><span class="err">group</span><span class="w"> </span><span class="err">by</span><span class="w"> </span><span class="err">deptno'</span><span class="w">
</span><span class="p">}</span></code></pre></figure>
<h4 id="yaml-6">YAML</h4>
<figure class="highlight"><pre><code class="language-yaml" data-lang="yaml"><span class="na">view</span><span class="pi">:</span> <span class="s">V</span>
<span class="na">table</span><span class="pi">:</span> <span class="s">T</span>
<span class="na">sql</span><span class="pi">:</span> <span class="s">select deptno, count(*) as c, sum(sal) as s from emp group by deptno</span></code></pre></figure>
<p><code class="highlighter-rouge">view</code> (optional string) is the name of the view; null means that the table
already exists and is populated with the correct data.</p>
<p><code class="highlighter-rouge">table</code> (required string) is the name of the table that materializes the data in
the query. If <code class="highlighter-rouge">view</code> is not null, the table might not exist, and if it does not,
Calcite will create and populate an in-memory table.</p>
<p><code class="highlighter-rouge">sql</code> (optional string, or list of strings that will be concatenated as a
multi-line string) is the SQL definition of the materialization.</p>
<h3 id="table">Table</h3>
<p>Occurs within <code class="highlighter-rouge">root.schemas.tables</code>.</p>
<h4 id="json-7">JSON</h4>
<figure class="highlight"><pre><code class="language-json" data-lang="json"><span class="p">{</span><span class="w">
</span><span class="err">name</span><span class="p">:</span><span class="w"> </span><span class="err">'sales_fact'</span><span class="p">,</span><span class="w">
</span><span class="err">columns</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w"> </span><span class="err">Column...</span><span class="w"> </span><span class="p">]</span><span class="w">
</span><span class="p">}</span></code></pre></figure>
<h4 id="yaml-7">YAML</h4>
<figure class="highlight"><pre><code class="language-yaml" data-lang="yaml"><span class="na">name</span><span class="pi">:</span> <span class="s">sales_fact</span>
<span class="na">columns</span><span class="pi">:</span>
<span class="pi">[</span> <span class="nv">Column...</span> <span class="pi">]</span></code></pre></figure>
<p><code class="highlighter-rouge">name</code> (required string) is the name of this table. Must be unique within the schema.</p>
<p><code class="highlighter-rouge">type</code> (optional string, default <code class="highlighter-rouge">custom</code>) indicates sub-type. Values are:</p>
<ul>
<li><code class="highlighter-rouge">custom</code> for <a href="#custom-table">Custom Table</a></li>
<li><code class="highlighter-rouge">view</code> for <a href="#view">View</a></li>
</ul>
<p><code class="highlighter-rouge">columns</code> (list of <a href="#column">Column</a> elements, required for
some kinds of table, optional for others such as View)</p>
<h3 id="view">View</h3>
<p>Like base class <a href="#table">Table</a>, occurs within <code class="highlighter-rouge">root.schemas.tables</code>.</p>
<h4 id="json-8">JSON</h4>
<figure class="highlight"><pre><code class="language-json" data-lang="json"><span class="p">{</span><span class="w">
</span><span class="err">name</span><span class="p">:</span><span class="w"> </span><span class="err">'female_emps'</span><span class="p">,</span><span class="w">
</span><span class="err">type</span><span class="p">:</span><span class="w"> </span><span class="err">'view'</span><span class="p">,</span><span class="w">
</span><span class="err">sql</span><span class="p">:</span><span class="w"> </span><span class="s2">"select * from emps where gender = 'F'"</span><span class="p">,</span><span class="w">
</span><span class="err">modifiable</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span><span class="p">}</span></code></pre></figure>
<h4 id="yaml-8">YAML</h4>
<figure class="highlight"><pre><code class="language-yaml" data-lang="yaml"><span class="na">name</span><span class="pi">:</span> <span class="s">female_emps</span>
<span class="na">type</span><span class="pi">:</span> <span class="s">view</span>
<span class="na">sql</span><span class="pi">:</span> <span class="s">select * from emps where gender = 'F'</span>
<span class="na">modifiable</span><span class="pi">:</span> <span class="no">true</span></code></pre></figure>
<p><code class="highlighter-rouge">name</code>, <code class="highlighter-rouge">type</code>, <code class="highlighter-rouge">columns</code> inherited from <a href="#table">Table</a>.</p>
<p><code class="highlighter-rouge">sql</code> (required string, or list of strings that will be concatenated as a
multi-line string) is the SQL definition of the view.</p>
<p><code class="highlighter-rouge">path</code> (optional list) is the SQL path to resolve the query. If not
specified, defaults to the current schema.</p>
<p><code class="highlighter-rouge">modifiable</code> (optional boolean) is whether the view is modifiable.
If null or not specified, Calcite deduces whether the view is modifiable.</p>
<p>A view is modifiable if contains only SELECT, FROM, WHERE (no JOIN, aggregation
or sub-queries) and every column:</p>
<ul>
<li>is specified once in the SELECT clause; or</li>
<li>occurs in the WHERE clause with a <code class="highlighter-rouge">column = literal</code> predicate; or</li>
<li>is nullable.</li>
</ul>
<p>The second clause allows Calcite to automatically provide the correct value for
hidden columns. It is useful in multi-tenant environments, where the <code class="highlighter-rouge">tenantId</code>
column is hidden, mandatory (NOT NULL), and has a constant value for a
particular view.</p>
<p>Errors regarding modifiable views:</p>
<ul>
<li>If a view is marked <code class="highlighter-rouge">modifiable: true</code> and is not modifiable, Calcite throws
an error while reading the schema.</li>
<li>If you submit an INSERT, UPDATE or UPSERT command to a non-modifiable view,
Calcite throws an error when validating the statement.</li>
<li>If a DML statement creates a row that would not appear in the view
(for example, a row in <code class="highlighter-rouge">female_emps</code>, above, with <code class="highlighter-rouge">gender = 'M'</code>),
Calcite throws an error when executing the statement.</li>
</ul>
<h3 id="custom-table">Custom Table</h3>
<p>Like base class <a href="#table">Table</a>, occurs within <code class="highlighter-rouge">root.schemas.tables</code>.</p>
<h4 id="json-9">JSON</h4>
<figure class="highlight"><pre><code class="language-json" data-lang="json"><span class="p">{</span><span class="w">
</span><span class="err">name</span><span class="p">:</span><span class="w"> </span><span class="err">'female_emps'</span><span class="p">,</span><span class="w">
</span><span class="err">type</span><span class="p">:</span><span class="w"> </span><span class="err">'custom'</span><span class="p">,</span><span class="w">
</span><span class="err">factory</span><span class="p">:</span><span class="w"> </span><span class="err">'TODO'</span><span class="p">,</span><span class="w">
</span><span class="err">operand</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
</span><span class="err">todo</span><span class="p">:</span><span class="w"> </span><span class="err">'TODO'</span><span class="w">
</span><span class="p">}</span><span class="w">
</span><span class="p">}</span></code></pre></figure>
<h4 id="yaml-9">YAML</h4>
<figure class="highlight"><pre><code class="language-yaml" data-lang="yaml"><span class="na">name</span><span class="pi">:</span> <span class="s">female_emps</span>
<span class="na">type</span><span class="pi">:</span> <span class="s">custom</span>
<span class="na">factory</span><span class="pi">:</span> <span class="s">TODO</span>
<span class="na">operand</span><span class="pi">:</span>
<span class="na">todo</span><span class="pi">:</span> <span class="s">TODO</span></code></pre></figure>
<p><code class="highlighter-rouge">name</code>, <code class="highlighter-rouge">type</code>, <code class="highlighter-rouge">columns</code> inherited from <a href="#table">Table</a>.</p>
<p><code class="highlighter-rouge">factory</code> (required string) is the name of the factory class for this
table. Must implement interface
<a href="/apidocs/org/apache/calcite/schema/TableFactory.html">org.apache.calcite.schema.TableFactory</a>
and have a public default constructor.</p>
<p><code class="highlighter-rouge">operand</code> (optional map) contains attributes to be passed to the
factory.</p>
<h3 id="stream">Stream</h3>
<p>Information about whether a table allows streaming.</p>
<p>Occurs within <code class="highlighter-rouge">root.schemas.tables.stream</code>.</p>
<h4 id="json-10">JSON</h4>
<figure class="highlight"><pre><code class="language-json" data-lang="json"><span class="p">{</span><span class="w">
</span><span class="err">stream</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span><span class="w">
</span><span class="err">history</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w">
</span><span class="p">}</span></code></pre></figure>
<h4 id="yaml-10">YAML</h4>
<figure class="highlight"><pre><code class="language-yaml" data-lang="yaml"><span class="na">stream</span><span class="pi">:</span> <span class="no">true</span>
<span class="na">history</span><span class="pi">:</span> <span class="no">false</span></code></pre></figure>
<p><code class="highlighter-rouge">stream</code> (optional; default true) is whether the table allows streaming.</p>
<p><code class="highlighter-rouge">history</code> (optional; default false) is whether the history of the stream is
available.</p>
<h3 id="column">Column</h3>
<p>Occurs within <code class="highlighter-rouge">root.schemas.tables.columns</code>.</p>
<h4 id="json-11">JSON</h4>
<figure class="highlight"><pre><code class="language-json" data-lang="json"><span class="p">{</span><span class="w">
</span><span class="err">name</span><span class="p">:</span><span class="w"> </span><span class="err">'empno'</span><span class="w">
</span><span class="p">}</span></code></pre></figure>
<h4 id="yaml-11">YAML</h4>
<figure class="highlight"><pre><code class="language-yaml" data-lang="yaml"><span class="na">name</span><span class="pi">:</span> <span class="s">empno</span></code></pre></figure>
<p><code class="highlighter-rouge">name</code> (required string) is the name of this column.</p>
<h3 id="function">Function</h3>
<p>Occurs within <code class="highlighter-rouge">root.schemas.functions</code>.</p>
<h4 id="json-12">JSON</h4>
<figure class="highlight"><pre><code class="language-json" data-lang="json"><span class="p">{</span><span class="w">
</span><span class="err">name</span><span class="p">:</span><span class="w"> </span><span class="err">'MY_PLUS'</span><span class="p">,</span><span class="w">
</span><span class="err">className</span><span class="p">:</span><span class="w"> </span><span class="err">'com.example.functions.MyPlusFunction'</span><span class="p">,</span><span class="w">
</span><span class="err">methodName</span><span class="p">:</span><span class="w"> </span><span class="err">'apply'</span><span class="p">,</span><span class="w">
</span><span class="err">path</span><span class="p">:</span><span class="w"> </span><span class="p">[]</span><span class="w">
</span><span class="p">}</span></code></pre></figure>
<h4 id="yaml-12">YAML</h4>
<figure class="highlight"><pre><code class="language-yaml" data-lang="yaml"><span class="na">name</span><span class="pi">:</span> <span class="s">MY_PLUS</span>
<span class="na">className</span><span class="pi">:</span> <span class="s">com.example.functions.MyPlusFunction</span>
<span class="na">methodName</span><span class="pi">:</span> <span class="s">apply</span>
<span class="na">path</span><span class="pi">:</span> <span class="pi">{}</span></code></pre></figure>
<p><code class="highlighter-rouge">name</code> (required string) is the name of this function.</p>
<p><code class="highlighter-rouge">className</code> (required string) is the name of the class that implements this
function.</p>
<p><code class="highlighter-rouge">methodName</code> (optional string) is the name of the method that implements this
function.</p>
<p>If <code class="highlighter-rouge">methodName</code> is specified, the method must exist (case-sensitive) and Calcite
will create a scalar function. The method may be static or non-static, but
if non-static, the class must have a public constructor with no parameters.</p>
<p>If <code class="highlighter-rouge">methodName</code> is “*”, Calcite creates a function for every method
in the class.</p>
<p>If <code class="highlighter-rouge">methodName</code> is not specified, Calcite looks for a method called “eval”, and
if found, creates a a table macro or scalar function.
It also looks for methods “init”, “add”, “merge”, “result”, and
if found, creates an aggregate function.</p>
<p><code class="highlighter-rouge">path</code> (optional list of string) is the path for resolving this function.</p>
<h3 id="type">Type</h3>
<p>Occurs within <code class="highlighter-rouge">root.schemas.types</code>.</p>
<h4 id="json-13">JSON</h4>
<figure class="highlight"><pre><code class="language-json" data-lang="json"><span class="p">{</span><span class="w">
</span><span class="err">name</span><span class="p">:</span><span class="w"> </span><span class="err">'mytype</span><span class="mi">1</span><span class="err">'</span><span class="p">,</span><span class="w">
</span><span class="err">type</span><span class="p">:</span><span class="w"> </span><span class="err">'BIGINT'</span><span class="p">,</span><span class="w">
</span><span class="err">attributes</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
</span><span class="p">{</span><span class="w">
</span><span class="err">name</span><span class="p">:</span><span class="w"> </span><span class="err">'f</span><span class="mi">1</span><span class="err">'</span><span class="p">,</span><span class="w">
</span><span class="err">type</span><span class="p">:</span><span class="w"> </span><span class="err">'BIGINT'</span><span class="w">
</span><span class="p">}</span><span class="w">
</span><span class="p">]</span><span class="w">
</span><span class="p">}</span></code></pre></figure>
<h4 id="yaml-13">YAML</h4>
<figure class="highlight"><pre><code class="language-yaml" data-lang="yaml"><span class="na">name</span><span class="pi">:</span> <span class="s">mytype1</span>
<span class="na">type</span><span class="pi">:</span> <span class="s">BIGINT</span>
<span class="na">attributes</span><span class="pi">:</span>
<span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">f1</span>
<span class="na">type</span><span class="pi">:</span> <span class="s">BIGINT</span></code></pre></figure>
<p><code class="highlighter-rouge">name</code> (required string) is the name of this type.</p>
<p><code class="highlighter-rouge">type</code> (optional) is the SQL type.</p>
<p><code class="highlighter-rouge">attributes</code> (optional) is the attribute list of this type.
If <code class="highlighter-rouge">attributes</code> and <code class="highlighter-rouge">type</code> both exist at the same level,
<code class="highlighter-rouge">type</code> takes precedence.</p>
<h3 id="lattice">Lattice</h3>
<p>Occurs within <code class="highlighter-rouge">root.schemas.lattices</code>.</p>
<h4 id="json-14">JSON</h4>
<figure class="highlight"><pre><code class="language-json" data-lang="json"><span class="p">{</span><span class="w">
</span><span class="err">name</span><span class="p">:</span><span class="w"> </span><span class="err">'star'</span><span class="p">,</span><span class="w">
</span><span class="err">sql</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
</span><span class="err">'select</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="err">from</span><span class="w"> </span><span class="s2">"foodmart"</span><span class="err">.</span><span class="s2">"sales_fact_1997"</span><span class="w"> </span><span class="err">as</span><span class="w"> </span><span class="s2">"s"</span><span class="err">'</span><span class="p">,</span><span class="w">
</span><span class="err">'join</span><span class="w"> </span><span class="s2">"foodmart"</span><span class="err">.</span><span class="s2">"product"</span><span class="w"> </span><span class="err">as</span><span class="w"> </span><span class="s2">"p"</span><span class="w"> </span><span class="err">using</span><span class="w"> </span><span class="err">(</span><span class="s2">"product_id"</span><span class="err">)'</span><span class="p">,</span><span class="w">
</span><span class="err">'join</span><span class="w"> </span><span class="s2">"foodmart"</span><span class="err">.</span><span class="s2">"time_by_day"</span><span class="w"> </span><span class="err">as</span><span class="w"> </span><span class="s2">"t"</span><span class="w"> </span><span class="err">using</span><span class="w"> </span><span class="err">(</span><span class="s2">"time_id"</span><span class="err">)'</span><span class="p">,</span><span class="w">
</span><span class="err">'join</span><span class="w"> </span><span class="s2">"foodmart"</span><span class="err">.</span><span class="s2">"product_class"</span><span class="w"> </span><span class="err">as</span><span class="w"> </span><span class="s2">"pc"</span><span class="w"> </span><span class="err">on</span><span class="w"> </span><span class="s2">"p"</span><span class="err">.</span><span class="s2">"product_class_id"</span><span class="w"> </span><span class="err">=</span><span class="w"> </span><span class="s2">"pc"</span><span class="err">.</span><span class="s2">"product_class_id"</span><span class="err">'</span><span class="w">
</span><span class="p">],</span><span class="w">
</span><span class="err">auto</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span><span class="w">
</span><span class="err">algorithm</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span><span class="w">
</span><span class="err">algorithmMaxMillis</span><span class="p">:</span><span class="w"> </span><span class="mi">10000</span><span class="p">,</span><span class="w">
</span><span class="err">rowCountEstimate</span><span class="p">:</span><span class="w"> </span><span class="mi">86837</span><span class="p">,</span><span class="w">
</span><span class="err">defaultMeasures</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w"> </span><span class="p">{</span><span class="w">
</span><span class="err">agg</span><span class="p">:</span><span class="w"> </span><span class="err">'count'</span><span class="w">
</span><span class="p">}</span><span class="w"> </span><span class="p">],</span><span class="w">
</span><span class="err">tiles</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w"> </span><span class="p">{</span><span class="w">
</span><span class="err">dimensions</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w"> </span><span class="err">'the_year'</span><span class="p">,</span><span class="w"> </span><span class="p">[</span><span class="err">'t'</span><span class="p">,</span><span class="w"> </span><span class="err">'quarter'</span><span class="p">]</span><span class="w"> </span><span class="p">],</span><span class="w">
</span><span class="err">measures</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w"> </span><span class="p">{</span><span class="w">
</span><span class="err">agg</span><span class="p">:</span><span class="w"> </span><span class="err">'sum'</span><span class="p">,</span><span class="w">
</span><span class="err">args</span><span class="p">:</span><span class="w"> </span><span class="err">'unit_sales'</span><span class="w">
</span><span class="p">},</span><span class="w"> </span><span class="p">{</span><span class="w">
</span><span class="err">agg</span><span class="p">:</span><span class="w"> </span><span class="err">'sum'</span><span class="p">,</span><span class="w">
</span><span class="err">args</span><span class="p">:</span><span class="w"> </span><span class="err">'store_sales'</span><span class="w">
</span><span class="p">},</span><span class="w"> </span><span class="p">{</span><span class="w">
</span><span class="err">agg</span><span class="p">:</span><span class="w"> </span><span class="err">'count'</span><span class="w">
</span><span class="p">}</span><span class="w"> </span><span class="p">]</span><span class="w">
</span><span class="p">}</span><span class="w"> </span><span class="p">]</span><span class="w">
</span><span class="p">}</span></code></pre></figure>
<h4 id="yaml-14">YAML</h4>
<figure class="highlight"><pre><code class="language-yaml" data-lang="yaml"><span class="na">name</span><span class="pi">:</span> <span class="s">star</span>
<span class="na">sql</span><span class="pi">:</span> <span class="pi">&gt;</span>
<span class="no">select 1 from "foodmart"."sales_fact_1997" as "s"',</span>
<span class="no">join "foodmart"."product" as "p" using ("product_id")',</span>
<span class="no">join "foodmart"."time_by_day" as "t" using ("time_id")',</span>
<span class="no">join "foodmart"."product_class" as "pc" on "p"."product_class_id" = "pc"."product_class_id"</span>
<span class="na">auto</span><span class="pi">:</span> <span class="no">false</span>
<span class="na">algorithm</span><span class="pi">:</span> <span class="no">true</span>
<span class="na">algorithmMaxMillis</span><span class="pi">:</span> <span class="s">10000</span>
<span class="na">rowCountEstimate</span><span class="pi">:</span> <span class="s">86837</span>
<span class="na">defaultMeasures</span><span class="pi">:</span>
<span class="pi">-</span> <span class="na">agg</span><span class="pi">:</span> <span class="s">count</span>
<span class="na">tiles</span><span class="pi">:</span>
<span class="pi">-</span> <span class="na">dimensions</span><span class="pi">:</span> <span class="pi">[</span> <span class="s1">'</span><span class="s">the_year'</span><span class="pi">,</span> <span class="pi">[</span><span class="s1">'</span><span class="s">t'</span><span class="pi">,</span> <span class="s1">'</span><span class="s">quarter'</span><span class="pi">]</span> <span class="pi">]</span>
<span class="na">measures</span><span class="pi">:</span>
<span class="pi">-</span> <span class="na">agg</span><span class="pi">:</span> <span class="s">sum</span>
<span class="na">args</span><span class="pi">:</span> <span class="s">unit_sales</span>
<span class="pi">-</span> <span class="na">agg</span><span class="pi">:</span> <span class="s">sum</span>
<span class="na">args</span><span class="pi">:</span> <span class="s">store_sales</span>
<span class="pi">-</span> <span class="na">agg</span><span class="pi">:</span> <span class="s1">'</span><span class="s">count'</span></code></pre></figure>
<p><code class="highlighter-rouge">name</code> (required string) is the name of this lattice.</p>
<p><code class="highlighter-rouge">sql</code> (required string, or list of strings that will be concatenated as a
multi-line string) is the SQL statement that defines the fact table, dimension
tables, and join paths for this lattice.</p>
<p><code class="highlighter-rouge">auto</code> (optional boolean, default true) is whether to materialize tiles on need
as queries are executed.</p>
<p><code class="highlighter-rouge">algorithm</code> (optional boolean, default false) is whether to use an optimization
algorithm to suggest and populate an initial set of tiles.</p>
<p><code class="highlighter-rouge">algorithmMaxMillis</code> (optional long, default -1, meaning no limit) is the
maximum number of milliseconds for which to run the algorithm. After this point,
takes the best result the algorithm has come up with so far.</p>
<p><code class="highlighter-rouge">rowCountEstimate</code> (optional double, default 1000.0) estimated number of rows in
the lattice</p>
<p><code class="highlighter-rouge">tiles</code> (optional list of <a href="#tile">Tile</a> elements) is a list of
materialized aggregates to create up front.</p>
<p><code class="highlighter-rouge">defaultMeasures</code> (optional list of <a href="#measure">Measure</a> elements)
is a list of measures that a tile should have by default.
Any tile defined in <code class="highlighter-rouge">tiles</code> can still define its own measures, including
measures not on this list. If not specified, the default list of measures is
just ‘count(*)’:</p>
<h4 id="json-15">JSON</h4>
<figure class="highlight"><pre><code class="language-json" data-lang="json"><span class="p">[</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="err">name</span><span class="p">:</span><span class="w"> </span><span class="err">'count'</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="p">]</span></code></pre></figure>
<h4 id="yaml-15">YAML</h4>
<figure class="highlight"><pre><code class="language-yaml" data-lang="yaml"><span class="na">name</span><span class="pi">:</span> <span class="s">count</span></code></pre></figure>
<p><code class="highlighter-rouge">statisticProvider</code> (optional name of a class that implements
<a href="/apidocs/org/apache/calcite/materialize/LatticeStatisticProvider.html">org.apache.calcite.materialize.LatticeStatisticProvider</a>)
provides estimates of the number of distinct values in each column.</p>
<p>You can use a class name, or a class plus a static field. Example:</p>
<figure class="highlight"><pre><code class="language-json" data-lang="json"><span class="w"> </span><span class="s2">"statisticProvider"</span><span class="p">:</span><span class="w"> </span><span class="s2">"org.apache.calcite.materialize.Lattices#CACHING_SQL_STATISTIC_PROVIDER"</span></code></pre></figure>
<p>If not set, Calcite will generate and execute a SQL query to find the real
value, and cache the results.</p>
<p>See also: <a href="/docs/lattice.html">Lattices</a>.</p>
<h3 id="tile">Tile</h3>
<p>Occurs within <code class="highlighter-rouge">root.schemas.lattices.tiles</code>.</p>
<figure class="highlight"><pre><code class="language-json" data-lang="json"><span class="p">{</span><span class="w">
</span><span class="err">dimensions</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w"> </span><span class="err">'the_year'</span><span class="p">,</span><span class="w"> </span><span class="p">[</span><span class="err">'t'</span><span class="p">,</span><span class="w"> </span><span class="err">'quarter'</span><span class="p">]</span><span class="w"> </span><span class="p">],</span><span class="w">
</span><span class="err">measures</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w"> </span><span class="p">{</span><span class="w">
</span><span class="err">agg</span><span class="p">:</span><span class="w"> </span><span class="err">'sum'</span><span class="p">,</span><span class="w">
</span><span class="err">args</span><span class="p">:</span><span class="w"> </span><span class="err">'unit_sales'</span><span class="w">
</span><span class="p">},</span><span class="w"> </span><span class="p">{</span><span class="w">
</span><span class="err">agg</span><span class="p">:</span><span class="w"> </span><span class="err">'sum'</span><span class="p">,</span><span class="w">
</span><span class="err">args</span><span class="p">:</span><span class="w"> </span><span class="err">'store_sales'</span><span class="w">
</span><span class="p">},</span><span class="w"> </span><span class="p">{</span><span class="w">
</span><span class="err">agg</span><span class="p">:</span><span class="w"> </span><span class="err">'count'</span><span class="w">
</span><span class="p">}</span><span class="w"> </span><span class="p">]</span><span class="w">
</span><span class="p">}</span></code></pre></figure>
<h4 id="yaml-16">YAML</h4>
<figure class="highlight"><pre><code class="language-yaml" data-lang="yaml"><span class="na">dimensions</span><span class="pi">:</span> <span class="pi">[</span> <span class="s1">'</span><span class="s">the_year'</span><span class="pi">,</span> <span class="pi">[</span><span class="s1">'</span><span class="s">t'</span><span class="pi">,</span> <span class="s1">'</span><span class="s">quarter'</span><span class="pi">]</span> <span class="pi">]</span>
<span class="na">measures</span><span class="pi">:</span>
<span class="pi">-</span> <span class="na">agg</span><span class="pi">:</span> <span class="s">sum</span>
<span class="na">args</span><span class="pi">:</span> <span class="s">unit_sales</span>
<span class="pi">-</span> <span class="na">agg</span><span class="pi">:</span> <span class="s">sum</span>
<span class="na">args</span><span class="pi">:</span> <span class="s">store_sales</span>
<span class="pi">-</span> <span class="na">agg</span><span class="pi">:</span> <span class="s">count</span></code></pre></figure>
<p><code class="highlighter-rouge">dimensions</code> (list of strings or string lists, required, but may be empty)
defines the dimensionality of this tile.
Each dimension is a column from the lattice, like a <code class="highlighter-rouge">GROUP BY</code> clause.
Each element can be either a string
(the unique label of the column within the lattice)
or a string list (a pair consisting of a table alias and a column name).</p>
<p><code class="highlighter-rouge">measures</code> (optional list of <a href="#measure">Measure</a> elements) is a list
of aggregate functions applied to arguments. If not specified, uses the
lattice’s default measure list.</p>
<h3 id="measure">Measure</h3>
<p>Occurs within <code class="highlighter-rouge">root.schemas.lattices.defaultMeasures</code>
and <code class="highlighter-rouge">root.schemas.lattices.tiles.measures</code>.</p>
<h4 id="json-16">JSON</h4>
<figure class="highlight"><pre><code class="language-json" data-lang="json"><span class="p">{</span><span class="w">
</span><span class="err">agg</span><span class="p">:</span><span class="w"> </span><span class="err">'sum'</span><span class="p">,</span><span class="w">
</span><span class="err">args</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w"> </span><span class="err">'unit_sales'</span><span class="w"> </span><span class="p">]</span><span class="w">
</span><span class="p">}</span></code></pre></figure>
<h4 id="yaml-17">YAML</h4>
<figure class="highlight"><pre><code class="language-yaml" data-lang="yaml"><span class="na">agg</span><span class="pi">:</span> <span class="s">sum</span>
<span class="na">args</span><span class="pi">:</span> <span class="s">unit_sales</span></code></pre></figure>
<p><code class="highlighter-rouge">agg</code> is the name of an aggregate function (usually ‘count’, ‘sum’, ‘min’,
‘max’).</p>
<p><code class="highlighter-rouge">args</code> (optional) is a column label (string), or list of zero or more column
labels</p>
<p>Valid values are:</p>
<ul>
<li>Not specified: no arguments</li>
<li>null: no arguments</li>
<li>Empty list: no arguments</li>
<li>String: single argument, the name of a lattice column</li>
<li>List: multiple arguments, each a column label</li>
</ul>
<p>Unlike lattice dimensions, measures can not be specified in qualified
format, {@code [“table”, “column”]}. When you define a lattice, make sure
that each column you intend to use as a measure has a unique label within
the lattice (using “{@code AS label}” if necessary), and use that label
when you want to pass the column as a measure argument.</p>
<!-- End model.md -->
<div class="section-nav">
<div class="left align-right">
<a href="/docs/reference.html" class="prev">Previous</a>
</div>
<div class="right align-left">
<a href="/docs/howto.html" class="next">Next</a>
</div>
</div>
<div class="clear"></div>
</article>
</div>
<div class="unit one-fifth hide-on-mobiles">
<aside>
<h4>Overview</h4>
<ul>
<li class=""><a href="/docs/index.html">Background</a></li>
<li class=""><a href="/docs/tutorial.html">Tutorial</a></li>
<li class=""><a href="/docs/algebra.html">Algebra</a></li>
</ul>
<h4>Advanced</h4>
<ul>
<li class=""><a href="/docs/adapter.html">Adapters</a></li>
<li class=""><a href="/docs/spatial.html">Spatial</a></li>
<li class=""><a href="/docs/stream.html">Streaming</a></li>
<li class=""><a href="/docs/materialized_views.html">Materialized Views</a></li>
<li class=""><a href="/docs/lattice.html">Lattices</a></li>
</ul>
<h4>Avatica</h4>
<ul>
<li class=""><a href="/docs/avatica_overview.html">Overview</a></li>
<li class=""><a href="/docs/avatica_roadmap.html">Roadmap</a></li>
<li class=""><a href="/docs/avatica_json_reference.html">JSON Reference</a></li>
<li class=""><a href="/docs/avatica_protobuf_reference.html">Protobuf Reference</a></li>
</ul>
<h4>Reference</h4>
<ul>
<li class=""><a href="/docs/reference.html">SQL language</a></li>
<li class="current"><a href="/docs/model.html">JSON/YAML models</a></li>
<li class=""><a href="/docs/howto.html">HOWTO</a></li>
</ul>
<h4>Meta</h4>
<ul>
<li class=""><a href="/docs/history.html">History</a></li>
<li class=""><a href="/docs/powered_by.html">Powered by Calcite</a></li>
<li class=""><a href="/apidocs">API</a></li>
<li class=""><a href="/testapidocs">Test API</a></li>
</ul>
</aside>
</div>
<div class="clear"></div>
</div>
</section>
<footer role="contentinfo">
<div id="poweredby">
<a href="http://www.apache.org/">
<span class="sr-only">Apache</span>
<img src="/img/feather.png" width="190" height="77" alt="Apache Logo"></a>
</div>
<div id="copyright">
<p>The contents of this website are Copyright &copy;&nbsp;2019
<a href="https://www.apache.org/">Apache Software Foundation</a>
under the terms of
the <a href="https://www.apache.org/licenses/">
Apache&nbsp;License&nbsp;v2</a>. Apache Calcite and its logo are
trademarks of the Apache Software Foundation.</p>
</div>
</footer>
<script>
var anchorForId = function (id) {
var anchor = document.createElement("a");
anchor.className = "header-link";
anchor.href = "#" + id;
anchor.innerHTML = "<span class=\"sr-only\">Permalink</span><i class=\"fa fa-link\"></i>";
anchor.title = "Permalink";
return anchor;
};
var linkifyAnchors = function (level, containingElement) {
var headers = containingElement.getElementsByTagName("h" + level);
for (var h = 0; h < headers.length; h++) {
var header = headers[h];
if (typeof header.id !== "undefined" && header.id !== "") {
header.appendChild(anchorForId(header.id));
}
}
};
document.onreadystatechange = function () {
if (this.readyState === "complete") {
var contentBlock = document.getElementsByClassName("docs")[0] || document.getElementsByClassName("news")[0];
if (!contentBlock) {
return;
}
for (var level = 1; level <= 6; level++) {
linkifyAnchors(level, contentBlock);
}
}
};
</script>
</body>
</html>