| <!DOCTYPE HTML> |
| <html lang="en-US"> |
| <head> |
| <meta charset="UTF-8"> |
| <title>Druid adapter</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>Druid adapter</h1> |
| <!-- |
| |
| --> |
| |
| <p><a href="https://druid.io/">Druid</a> is a fast column-oriented distributed data |
| store. It allows you to execute queries via a |
| <a href="https://druid.io/docs/0.9.2/querying/querying.html">JSON-based query language</a>, |
| in particular OLAP-style queries. |
| Druid can be loaded in batch mode or continuously; one of Druid’s key |
| differentiators is its ability to |
| <a href="https://druid.io/docs/0.9.2/ingestion/stream-ingestion.html">load from a streaming source such as Kafka</a> |
| and have the data available for query within milliseconds.</p> |
| |
| <p>Calcite’s Druid adapter allows you to query the data using SQL, |
| combining it with data in other Calcite schemas.</p> |
| |
| <p>First, we need a |
| <a href="/docs/model.html">model definition</a>. |
| The model gives Calcite the necessary parameters to create an instance |
| of the Druid adapter.</p> |
| |
| <p>A basic example of a model file is given below:</p> |
| |
| <figure class="highlight"><pre><code class="language-json" data-lang="json"><span class="p">{</span><span class="w"> |
| </span><span class="s2">"version"</span><span class="p">:</span><span class="w"> </span><span class="s2">"1.0"</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"defaultSchema"</span><span class="p">:</span><span class="w"> </span><span class="s2">"wiki"</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"schemas"</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="s2">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"custom"</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"wiki"</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"factory"</span><span class="p">:</span><span class="w"> </span><span class="s2">"org.apache.calcite.adapter.druid.DruidSchemaFactory"</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"operand"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"http://localhost:8082"</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"coordinatorUrl"</span><span class="p">:</span><span class="w"> </span><span class="s2">"http://localhost:8081"</span><span class="w"> |
| </span><span class="p">},</span><span class="w"> |
| </span><span class="s2">"tables"</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="s2">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"wiki"</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"factory"</span><span class="p">:</span><span class="w"> </span><span class="s2">"org.apache.calcite.adapter.druid.DruidTableFactory"</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"operand"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"dataSource"</span><span class="p">:</span><span class="w"> </span><span class="s2">"wikiticker"</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"interval"</span><span class="p">:</span><span class="w"> </span><span class="s2">"1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z"</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"timestampColumn"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"time"</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"timestamp"</span><span class="w"> |
| </span><span class="p">},</span><span class="w"> |
| </span><span class="s2">"dimensions"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w"> |
| </span><span class="s2">"channel"</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"cityName"</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"comment"</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"countryIsoCode"</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"countryName"</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"isAnonymous"</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"isMinor"</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"isNew"</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"isRobot"</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"isUnpatrolled"</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"metroCode"</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"namespace"</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"page"</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"regionIsoCode"</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"regionName"</span><span class="p">,</span><span class="w"> |
| </span><span class="p">],</span><span class="w"> |
| </span><span class="s2">"metrics"</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="s2">"name"</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="s2">"count"</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"type"</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="s2">"count"</span><span class="w"> |
| </span><span class="p">},</span><span class="w"> |
| </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"name"</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="s2">"added"</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"type"</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="s2">"longSum"</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"fieldName"</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="s2">"added"</span><span class="w"> |
| </span><span class="p">},</span><span class="w"> |
| </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"name"</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="s2">"deleted"</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"type"</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="s2">"longSum"</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"fieldName"</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="s2">"deleted"</span><span class="w"> |
| </span><span class="p">},</span><span class="w"> |
| </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"name"</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="s2">"delta"</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"type"</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="s2">"longSum"</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"fieldName"</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="s2">"delta"</span><span class="w"> |
| </span><span class="p">},</span><span class="w"> |
| </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"name"</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="s2">"user_unique"</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"type"</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="s2">"hyperUnique"</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"fieldName"</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="s2">"user_id"</span><span class="w"> |
| </span><span class="p">}</span><span class="w"> |
| </span><span class="p">],</span><span class="w"> |
| </span><span class="s2">"complexMetrics"</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w"> |
| </span><span class="s2">"user_id"</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><span class="w"> |
| </span><span class="p">]</span><span class="w"> |
| </span><span class="p">}</span></code></pre></figure> |
| |
| <p>This file is stored as <code class="highlighter-rouge">druid/src/test/resources/druid-wiki-model.json</code>, |
| so you can connect to Druid via |
| <a href="https://github.com/julianhyde/sqlline"><code class="highlighter-rouge">sqlline</code></a> |
| as follows:</p> |
| |
| <figure class="highlight"><pre><code class="language-bash" data-lang="bash"><span class="nv">$ </span>./sqlline |
| sqlline> <span class="o">!</span>connect jdbc:calcite:model<span class="o">=</span>druid/src/test/resources/druid-wiki-model.json admin admin |
| sqlline> <span class="k">select</span> <span class="s2">"countryName"</span>, cast<span class="o">(</span>count<span class="o">(</span><span class="k">*</span><span class="o">)</span> as integer<span class="o">)</span> as c |
| from <span class="s2">"wiki"</span> |
| group by <span class="s2">"countryName"</span> |
| order by c desc limit 5<span class="p">;</span> |
| +----------------+------------+ |
| | countryName | C | |
| +----------------+------------+ |
| | | 35445 | |
| | United States | 528 | |
| | Italy | 256 | |
| | United Kingdom | 234 | |
| | France | 205 | |
| +----------------+------------+ |
| 5 rows selected <span class="o">(</span>0.279 seconds<span class="o">)</span> |
| sqlline></code></pre></figure> |
| |
| <p>That query shows the top 5 countries of origin of wiki page edits |
| on 2015-09-12 (the date covered by the <code class="highlighter-rouge">wikiticker</code> data set).</p> |
| |
| <p>Now let’s see how the query was evaluated:</p> |
| |
| <figure class="highlight"><pre><code class="language-bash" data-lang="bash">sqlline> <span class="o">!</span><span class="nb">set </span>outputformat csv |
| sqlline> explain plan <span class="k">for |
| select</span> <span class="s2">"countryName"</span>, cast<span class="o">(</span>count<span class="o">(</span><span class="k">*</span><span class="o">)</span> as integer<span class="o">)</span> as c |
| from <span class="s2">"wiki"</span> |
| group by <span class="s2">"countryName"</span> |
| order by c desc limit 5<span class="p">;</span> |
| <span class="s1">'PLAN'</span> |
| <span class="s1">'EnumerableInterpreter |
| BindableProject(countryName=[$0], C=[CAST($1):INTEGER NOT NULL]) |
| BindableSort(sort0=[$1], dir0=[DESC], fetch=[5]) |
| DruidQuery(table=[[wiki, wiki]], groups=[{4}], aggs=[[COUNT()]]) |
| '</span> |
| 1 row selected <span class="o">(</span>0.024 seconds<span class="o">)</span></code></pre></figure> |
| |
| <p>That plan shows that Calcite was able to push down the <code class="highlighter-rouge">GROUP BY</code> |
| part of the query to Druid, including the <code class="highlighter-rouge">COUNT(*)</code> function, |
| but not the <code class="highlighter-rouge">ORDER BY ... LIMIT</code>. (We plan to lift this restriction; |
| see [<a href="https://issues.apache.org/jira/browse/CALCITE-1206">CALCITE-1206</a>].)</p> |
| |
| <h1 id="complex-metrics">Complex Metrics</h1> |
| <p>Druid has special metrics that produce quick but approximate results. |
| Currently there are two types:</p> |
| |
| <ul> |
| <li><code class="highlighter-rouge">hyperUnique</code> - HyperLogLog data sketch used to estimate the cardinality of a dimension</li> |
| <li><code class="highlighter-rouge">thetaSketch</code> - Theta sketch used to also estimate the cardinality of a dimension, |
| but can be used to perform set operations as well.</li> |
| </ul> |
| |
| <p>In the model definition, there is an array of Strings called <code class="highlighter-rouge">complexMetrics</code> that declares |
| the alias for each complex metric defined. The alias is used in SQL, but it’s real column name |
| is used when Calcite generates the JSON query for druid.</p> |
| |
| <h1 id="foodmart-data-set">Foodmart data set</h1> |
| |
| <p>The test VM also includes a data set that denormalizes |
| the sales, product and customer tables of the Foodmart schema |
| into a single Druid data set called “foodmart”.</p> |
| |
| <p>You can access it via the |
| <code class="highlighter-rouge">druid/src/test/resources/druid-foodmart-model.json</code> model.</p> |
| |
| <h1 id="simplifying-the-model">Simplifying the model</h1> |
| |
| <p>If less metadata is provided in the model, the Druid adapter can discover |
| it automatically from Druid. Here is a schema equivalent to the previous one |
| but with <code class="highlighter-rouge">dimensions</code>, <code class="highlighter-rouge">metrics</code> and <code class="highlighter-rouge">timestampColumn</code> removed:</p> |
| |
| <figure class="highlight"><pre><code class="language-json" data-lang="json"><span class="p">{</span><span class="w"> |
| </span><span class="s2">"version"</span><span class="p">:</span><span class="w"> </span><span class="s2">"1.0"</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"defaultSchema"</span><span class="p">:</span><span class="w"> </span><span class="s2">"wiki"</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"schemas"</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="s2">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"custom"</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"wiki"</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"factory"</span><span class="p">:</span><span class="w"> </span><span class="s2">"org.apache.calcite.adapter.druid.DruidSchemaFactory"</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"operand"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"http://localhost:8082"</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"coordinatorUrl"</span><span class="p">:</span><span class="w"> </span><span class="s2">"http://localhost:8081"</span><span class="w"> |
| </span><span class="p">},</span><span class="w"> |
| </span><span class="s2">"tables"</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="s2">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"wiki"</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"factory"</span><span class="p">:</span><span class="w"> </span><span class="s2">"org.apache.calcite.adapter.druid.DruidTableFactory"</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"operand"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"dataSource"</span><span class="p">:</span><span class="w"> </span><span class="s2">"wikiticker"</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"interval"</span><span class="p">:</span><span class="w"> </span><span class="s2">"1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z"</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><span class="w"> |
| </span><span class="p">}</span></code></pre></figure> |
| |
| <p>Calcite dispatches a |
| <a href="https://druid.io/docs/latest/querying/segmentmetadataquery.html">segmentMetadataQuery</a> |
| to Druid to discover the columns of the table. |
| Now, let’s take out the <code class="highlighter-rouge">tables</code> element:</p> |
| |
| <figure class="highlight"><pre><code class="language-json" data-lang="json"><span class="p">{</span><span class="w"> |
| </span><span class="s2">"version"</span><span class="p">:</span><span class="w"> </span><span class="s2">"1.0"</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"defaultSchema"</span><span class="p">:</span><span class="w"> </span><span class="s2">"wiki"</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"schemas"</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="s2">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"custom"</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"wiki"</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"factory"</span><span class="p">:</span><span class="w"> </span><span class="s2">"org.apache.calcite.adapter.druid.DruidSchemaFactory"</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"operand"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> |
| </span><span class="s2">"url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"http://localhost:8082"</span><span class="p">,</span><span class="w"> |
| </span><span class="s2">"coordinatorUrl"</span><span class="p">:</span><span class="w"> </span><span class="s2">"http://localhost:8081"</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> |
| |
| <p>Calcite discovers the “wikiticker” data source via the |
| <a href="https://druid.io/docs/latest/design/coordinator.html#metadata-store-information">/druid/coordinator/v1/metadata/datasources</a> |
| REST call. Now that the “wiki” table element is removed, the table is called |
| “wikiticker”. Any other data sources present in Druid will also appear as |
| tables.</p> |
| |
| <p>Our model is now a single schema based on a custom schema factory with only two |
| operands, so we can |
| <a href="https://issues.apache.org/jira/browse/CALCITE-1206">dispense with the model</a> |
| and supply the operands as part of the connect string:</p> |
| |
| <figure class="highlight"><pre><code class="language-bash" data-lang="bash"> jdbc:calcite:schemaFactory<span class="o">=</span>org.apache.calcite.adapter.druid.DruidSchemaFactory<span class="p">;</span> schema.url<span class="o">=</span>http://localhost:8082<span class="p">;</span> schema.coordinatorUrl<span class="o">=</span>http://localhost:8081</code></pre></figure> |
| |
| <p>In fact, those are the |
| <a href="/apidocs/org/apache/calcite/adapter/druid/DruidSchemaFactory.html">default values of the operands</a>, |
| so we can omit them:</p> |
| |
| <figure class="highlight"><pre><code class="language-bash" data-lang="bash"> jdbc:calcite:schemaFactory<span class="o">=</span>org.apache.calcite.adapter.druid.DruidSchemaFactory</code></pre></figure> |
| |
| <p>Now, we can connect to <code class="highlighter-rouge">sqlline</code> using a very simple connect string, and list |
| the available tables:</p> |
| |
| <figure class="highlight"><pre><code class="language-bash" data-lang="bash"><span class="nv">$ </span>./sqlline |
| sqlline> <span class="o">!</span>connect jdbc:calcite:schemaFactory<span class="o">=</span>org.apache.calcite.adapter.druid.DruidSchemaFactory admin admin |
| sqlline> <span class="o">!</span>tables |
| +-----------+-------------+------------+--------------+ |
| | TABLE_CAT | TABLE_SCHEM | TABLE_NAME | TABLE_TYPE | |
| +-----------+-------------+------------+--------------+ |
| | | adhoc | foodmart | TABLE | |
| | | adhoc | wikiticker | TABLE | |
| | | metadata | COLUMNS | SYSTEM_TABLE | |
| | | metadata | TABLES | SYSTEM_TABLE | |
| +-----------+-------------+------------+--------------+</code></pre></figure> |
| |
| <p>We see the two system tables (<code class="highlighter-rouge">TABLES</code> and <code class="highlighter-rouge">COLUMNS</code>), |
| and the two tables in Druid (<code class="highlighter-rouge">foodmart</code> and <code class="highlighter-rouge">wikiticker</code>).</p> |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| </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=""><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 © 2019 |
| <a href="https://www.apache.org/">Apache Software Foundation</a> |
| under the terms of |
| the <a href="https://www.apache.org/licenses/"> |
| Apache License 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> |