Modified: calcite/site/docs/tutorial.html URL: http://svn.apache.org/viewvc/calcite/site/docs/tutorial.html?rev=1739659&r1=1739658&r2=1739659&view=diff ============================================================================== --- calcite/site/docs/tutorial.html (original) +++ calcite/site/docs/tutorial.html Sun Apr 17 21:26:04 2016 @@ -4,7 +4,7 @@ <meta charset="UTF-8"> <title>Tutorial</title> <meta name="viewport" content="width=device-width,initial-scale=1"> - <meta name="generator" content="Jekyll v2.4.0"> + <meta name="generator" content="Jekyll v3.0.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"> @@ -844,10 +844,10 @@ to relational operators using planner ru <p>You need Java (1.7 or higher; 1.8 preferred), git and maven (3.2.1 or later).</p> -<div class="highlight"><pre><code class="language-bash" data-lang="bash"><span class="nv">$ </span>git clone https://github.com/apache/calcite.git -<span class="nv">$ </span><span class="nb">cd </span>calcite -<span class="nv">$ </span>mvn install -DskipTests -Dcheckstyle.skip<span class="o">=</span><span class="nb">true</span> -<span class="nv">$ </span><span class="nb">cd </span>example/csv</code></pre></div> +<figure class="highlight"><pre><code class="language-bash" data-lang="bash"><span class="gp">$ </span>git clone https://github.com/apache/calcite.git +<span class="gp">$ </span><span class="nb">cd </span>calcite +<span class="gp">$ </span>mvn install -DskipTests -Dcheckstyle.skip<span class="o">=</span><span class="nb">true</span> +<span class="gp">$ </span><span class="nb">cd </span>example/csv</code></pre></figure> <h2 id="first-queries">First queries</h2> @@ -855,23 +855,23 @@ to relational operators using planner ru <a href="https://github.com/julianhyde/sqlline">sqlline</a>, a SQL shell that is included in this project.</p> -<div class="highlight"><pre><code class="language-bash" data-lang="bash"><span class="nv">$ </span>./sqlline -sqlline> !connect jdbc:calcite:model<span class="o">=</span>target/test-classes/model.json admin admin</code></pre></div> +<figure class="highlight"><pre><code class="language-bash" data-lang="bash"><span class="gp">$ </span>./sqlline +<span class="gp">sqlline> </span>!connect jdbc:calcite:model<span class="o">=</span>target/test-classes/model.json admin admin</code></pre></figure> -<p>(If you are running Windows, the command is <code>sqlline.bat</code>.)</p> +<p>(If you are running Windows, the command is <code class="highlighter-rouge">sqlline.bat</code>.)</p> <p>Execute a metadata query:</p> -<div class="highlight"><pre><code class="language-bash" data-lang="bash">sqlline> !tables +<figure class="highlight"><pre><code class="language-bash" data-lang="bash"><span class="gp">sqlline> </span>!tables +------------+--------------+-------------+---------------+----------+------+ -<span class="p">|</span> TABLE_CAT <span class="p">|</span> TABLE_SCHEM <span class="p">|</span> TABLE_NAME <span class="p">|</span> TABLE_TYPE <span class="p">|</span> REMARKS <span class="p">|</span> TYPE <span class="p">|</span> +| TABLE_CAT | TABLE_SCHEM | TABLE_NAME | TABLE_TYPE | REMARKS | TYPE | +------------+--------------+-------------+---------------+----------+------+ -<span class="p">|</span> null <span class="p">|</span> SALES <span class="p">|</span> DEPTS <span class="p">|</span> TABLE <span class="p">|</span> null <span class="p">|</span> null <span class="p">|</span> -<span class="p">|</span> null <span class="p">|</span> SALES <span class="p">|</span> EMPS <span class="p">|</span> TABLE <span class="p">|</span> null <span class="p">|</span> null <span class="p">|</span> -<span class="p">|</span> null <span class="p">|</span> SALES <span class="p">|</span> HOBBIES <span class="p">|</span> TABLE <span class="p">|</span> null <span class="p">|</span> null <span class="p">|</span> -<span class="p">|</span> null <span class="p">|</span> metadata <span class="p">|</span> COLUMNS <span class="p">|</span> SYSTEM_TABLE <span class="p">|</span> null <span class="p">|</span> null <span class="p">|</span> -<span class="p">|</span> null <span class="p">|</span> metadata <span class="p">|</span> TABLES <span class="p">|</span> SYSTEM_TABLE <span class="p">|</span> null <span class="p">|</span> null <span class="p">|</span> -+------------+--------------+-------------+---------------+----------+------+</code></pre></div> +| null | SALES | DEPTS | TABLE | null | null | +| null | SALES | EMPS | TABLE | null | null | +| null | SALES | HOBBIES | TABLE | null | null | +| null | metadata | COLUMNS | SYSTEM_TABLE | null | null | +| null | metadata | TABLES | SYSTEM_TABLE | null | null | ++------------+--------------+-------------+---------------+----------+------+</code></pre></figure> <p>(JDBC experts, note: sqllineâs <code>!tables</code> command is just executing <a href="http://docs.oracle.com/javase/7/docs/api/java/sql/DatabaseMetaData.html#getTables(java.lang.String, java.lang.String, java.lang.String, java.lang.String[])"><code>DatabaseMetaData.getTables()</code></a> @@ -891,38 +891,38 @@ the <code>EMPS</code> and <code>DEPTS</c <p>Letâs execute some queries on those tables, to show that Calcite is providing a full implementation of SQL. First, a table scan:</p> -<div class="highlight"><pre><code class="language-bash" data-lang="bash">sqlline> SELECT * FROM emps<span class="p">;</span> +<figure class="highlight"><pre><code class="language-bash" data-lang="bash"><span class="gp">sqlline> </span>SELECT <span class="k">*</span> FROM emps; +--------+--------+---------+---------+----------------+--------+-------+---+ -<span class="p">|</span> EMPNO <span class="p">|</span> NAME <span class="p">|</span> DEPTNO <span class="p">|</span> GENDER <span class="p">|</span> CITY <span class="p">|</span> EMPID <span class="p">|</span> AGE <span class="p">|</span> S <span class="p">|</span> +| EMPNO | NAME | DEPTNO | GENDER | CITY | EMPID | AGE | S | +--------+--------+---------+---------+----------------+--------+-------+---+ -<span class="p">|</span> <span class="m">100</span> <span class="p">|</span> Fred <span class="p">|</span> <span class="m">10</span> <span class="p">|</span> <span class="p">|</span> <span class="p">|</span> <span class="m">30</span> <span class="p">|</span> <span class="m">25</span> <span class="p">|</span> t <span class="p">|</span> -<span class="p">|</span> <span class="m">110</span> <span class="p">|</span> Eric <span class="p">|</span> <span class="m">20</span> <span class="p">|</span> M <span class="p">|</span> San Francisco <span class="p">|</span> <span class="m">3</span> <span class="p">|</span> <span class="m">80</span> <span class="p">|</span> n <span class="p">|</span> -<span class="p">|</span> <span class="m">110</span> <span class="p">|</span> John <span class="p">|</span> <span class="m">40</span> <span class="p">|</span> M <span class="p">|</span> Vancouver <span class="p">|</span> <span class="m">2</span> <span class="p">|</span> null <span class="p">|</span> f <span class="p">|</span> -<span class="p">|</span> <span class="m">120</span> <span class="p">|</span> Wilma <span class="p">|</span> <span class="m">20</span> <span class="p">|</span> F <span class="p">|</span> <span class="p">|</span> <span class="m">1</span> <span class="p">|</span> <span class="m">5</span> <span class="p">|</span> n <span class="p">|</span> -<span class="p">|</span> <span class="m">130</span> <span class="p">|</span> Alice <span class="p">|</span> <span class="m">40</span> <span class="p">|</span> F <span class="p">|</span> Vancouver <span class="p">|</span> <span class="m">2</span> <span class="p">|</span> null <span class="p">|</span> f <span class="p">|</span> -+--------+--------+---------+---------+----------------+--------+-------+---+</code></pre></div> +| 100 | Fred | 10 | | | 30 | 25 | t | +| 110 | Eric | 20 | M | San Francisco | 3 | 80 | n | +| 110 | John | 40 | M | Vancouver | 2 | null | f | +| 120 | Wilma | 20 | F | | 1 | 5 | n | +| 130 | Alice | 40 | F | Vancouver | 2 | null | f | ++--------+--------+---------+---------+----------------+--------+-------+---+</code></pre></figure> <p>Now JOIN and GROUP BY:</p> -<div class="highlight"><pre><code class="language-bash" data-lang="bash">sqlline> SELECT d.name, COUNT<span class="o">(</span>*<span class="o">)</span> +<figure class="highlight"><pre><code class="language-bash" data-lang="bash"><span class="gp">sqlline> </span>SELECT d.name, COUNT<span class="o">(</span><span class="k">*</span><span class="o">)</span> . . . .> FROM emps AS e JOIN depts AS d ON e.deptno <span class="o">=</span> d.deptno -. . . .> GROUP BY d.name<span class="p">;</span> +. . . .> GROUP BY d.name; +------------+---------+ -<span class="p">|</span> NAME <span class="p">|</span> EXPR<span class="nv">$1</span> <span class="p">|</span> +| NAME | EXPR<span class="nv">$1</span> | +------------+---------+ -<span class="p">|</span> Sales <span class="p">|</span> <span class="m">1</span> <span class="p">|</span> -<span class="p">|</span> Marketing <span class="p">|</span> <span class="m">2</span> <span class="p">|</span> -+------------+---------+</code></pre></div> +| Sales | 1 | +| Marketing | 2 | ++------------+---------+</code></pre></figure> <p>Last, the VALUES operator generates a single row, and is a convenient way to test expressions and SQL built-in functions:</p> -<div class="highlight"><pre><code class="language-bash" data-lang="bash">sqlline> VALUES CHAR_LENGTH<span class="o">(</span><span class="s1">'Hello, '</span> <span class="o">||</span> <span class="s1">'world!'</span><span class="o">)</span><span class="p">;</span> +<figure class="highlight"><pre><code class="language-bash" data-lang="bash"><span class="gp">sqlline> </span>VALUES CHAR_LENGTH<span class="o">(</span><span class="s1">'Hello, '</span> <span class="o">||</span> <span class="s1">'world!'</span><span class="o">)</span>; +---------+ -<span class="p">|</span> EXPR<span class="nv">$0</span> <span class="p">|</span> +| EXPR<span class="nv">$0</span> | +---------+ -<span class="p">|</span> <span class="m">13</span> <span class="p">|</span> -+---------+</code></pre></div> +| 13 | ++---------+</code></pre></figure> <p>Calcite has many other SQL features. We donât have time to cover them here. Write some more queries to experiment.</p> @@ -946,20 +946,20 @@ executed. Now letâs look at those s <p>On the JDBC connect string we gave the path of a model in JSON format. Here is the model:</p> -<div class="highlight"><pre><code class="language-json" data-lang="json"><span class="p">{</span> - <span class="err">version:</span> <span class="err">'1.0',</span> - <span class="err">defaultSchema:</span> <span class="err">'SALES',</span> - <span class="err">schemas:</span> <span class="err">[</span> - <span class="err">{</span> - <span class="err">name:</span> <span class="err">'SALES',</span> - <span class="err">type:</span> <span class="err">'custom',</span> - <span class="err">factory:</span> <span class="err">'org.apache.calcite.adapter.csv.CsvSchemaFactory',</span> - <span class="err">operand:</span> <span class="err">{</span> - <span class="err">directory:</span> <span class="err">'target/test-classes/sales'</span> - <span class="p">}</span> - <span class="err">}</span> - <span class="err">]</span> -<span class="err">}</span></code></pre></div> +<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="w"> </span><span class="err">'1.0',</span><span class="w"> + </span><span class="err">defaultSchema:</span><span class="w"> </span><span class="err">'SALES',</span><span class="w"> + </span><span class="err">schemas:</span><span class="w"> </span><span class="err">[</span><span class="w"> + </span><span class="err">{</span><span class="w"> + </span><span class="err">name:</span><span class="w"> </span><span class="err">'SALES',</span><span class="w"> + </span><span class="err">type:</span><span class="w"> </span><span class="err">'custom',</span><span class="w"> + </span><span class="err">factory:</span><span class="w"> </span><span class="err">'org.apache.calcite.adapter.csv.CsvSchemaFactory',</span><span class="w"> + </span><span class="err">operand:</span><span class="w"> </span><span class="err">{</span><span class="w"> + </span><span class="err">directory:</span><span class="w"> </span><span class="err">'target/test-classes/sales'</span><span class="w"> + </span><span class="p">}</span><span class="w"> + </span><span class="err">}</span><span class="w"> + </span><span class="err">]</span><span class="w"> +</span><span class="err">}</span></code></pre></figure> <p>The model defines a single schema called âSALESâ. The schema is powered by a plugin class, @@ -970,20 +970,20 @@ calcite-example-csv project and implemen Its <code>create</code> method instantiates a schema, passing in the <code>directory</code> argument from the model file:</p> -<div class="highlight"><pre><code class="language-java" data-lang="java"><span class="kd">public</span> <span class="n">Schema</span> <span class="nf">create</span><span class="o">(</span><span class="n">SchemaPlus</span> <span class="n">parentSchema</span><span class="o">,</span> <span class="n">String</span> <span class="n">name</span><span class="o">,</span> +<figure class="highlight"><pre><code class="language-java" data-lang="java"><span class="kd">public</span> <span class="n">Schema</span> <span class="nf">create</span><span class="p">(</span><span class="n">SchemaPlus</span> <span class="n">parentSchema</span><span class="o">,</span> <span class="n">String</span> <span class="n">name</span><span class="o">,</span> <span class="n">Map</span><span class="o"><</span><span class="n">String</span><span class="o">,</span> <span class="n">Object</span><span class="o">></span> <span class="n">operand</span><span class="o">)</span> <span class="o">{</span> - <span class="n">String</span> <span class="n">directory</span> <span class="o">=</span> <span class="o">(</span><span class="n">String</span><span class="o">)</span> <span class="n">operand</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="s">"directory"</span><span class="o">);</span> - <span class="n">String</span> <span class="n">flavorName</span> <span class="o">=</span> <span class="o">(</span><span class="n">String</span><span class="o">)</span> <span class="n">operand</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="s">"flavor"</span><span class="o">);</span> + <span class="n">String</span> <span class="n">directory</span> <span class="o">=</span> <span class="o">(</span><span class="n">String</span><span class="o">)</span> <span class="n">operand</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="s">"directory"</span><span class="o">);</span> + <span class="n">String</span> <span class="n">flavorName</span> <span class="o">=</span> <span class="o">(</span><span class="n">String</span><span class="o">)</span> <span class="n">operand</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="s">"flavor"</span><span class="o">);</span> <span class="n">CsvTable</span><span class="o">.</span><span class="na">Flavor</span> <span class="n">flavor</span><span class="o">;</span> <span class="k">if</span> <span class="o">(</span><span class="n">flavorName</span> <span class="o">==</span> <span class="kc">null</span><span class="o">)</span> <span class="o">{</span> <span class="n">flavor</span> <span class="o">=</span> <span class="n">CsvTable</span><span class="o">.</span><span class="na">Flavor</span><span class="o">.</span><span class="na">SCANNABLE</span><span class="o">;</span> <span class="o">}</span> <span class="k">else</span> <span class="o">{</span> <span class="n">flavor</span> <span class="o">=</span> <span class="n">CsvTable</span><span class="o">.</span><span class="na">Flavor</span><span class="o">.</span><span class="na">valueOf</span><span class="o">(</span><span class="n">flavorName</span><span class="o">.</span><span class="na">toUpperCase</span><span class="o">());</span> <span class="o">}</span> - <span class="k">return</span> <span class="k">new</span> <span class="nf">CsvSchema</span><span class="o">(</span> - <span class="k">new</span> <span class="nf">File</span><span class="o">(</span><span class="n">directory</span><span class="o">),</span> + <span class="k">return</span> <span class="k">new</span> <span class="n">CsvSchema</span><span class="o">(</span> + <span class="k">new</span> <span class="n">File</span><span class="o">(</span><span class="n">directory</span><span class="o">),</span> <span class="n">flavor</span><span class="o">);</span> -<span class="o">}</span></code></pre></div> +<span class="o">}</span></code></pre></figure> <p>Driven by the model, the schema factory instantiates a single schema called âSALESâ. The schema is an instance of @@ -1003,51 +1003,51 @@ and its sub-classes.</p> <code><a href="/apidocs/org/apache/calcite/schema/impl/AbstractSchema.html#getTableMap()">getTableMap()</a></code> method in the <code>AbstractSchema</code> base class.</p> -<div class="highlight"><pre><code class="language-java" data-lang="java"><span class="kd">protected</span> <span class="n">Map</span><span class="o"><</span><span class="n">String</span><span class="o">,</span> <span class="n">Table</span><span class="o">></span> <span class="nf">getTableMap</span><span class="o">()</span> <span class="o">{</span> - <span class="c1">// Look for files in the directory ending in ".csv", ".csv.gz", ".json",</span> - <span class="c1">// ".json.gz".</span> +<figure class="highlight"><pre><code class="language-java" data-lang="java"><span class="kd">protected</span> <span class="n">Map</span><span class="o"><</span><span class="n">String</span><span class="o">,</span> <span class="n">Table</span><span class="o">></span> <span class="n">getTableMap</span><span class="o">()</span> <span class="o">{</span> + <span class="c1">// Look for files in the directory ending in ".csv", ".csv.gz", ".json",</span> + <span class="c1">// ".json.gz".</span> <span class="n">File</span><span class="o">[]</span> <span class="n">files</span> <span class="o">=</span> <span class="n">directoryFile</span><span class="o">.</span><span class="na">listFiles</span><span class="o">(</span> - <span class="k">new</span> <span class="nf">FilenameFilter</span><span class="o">()</span> <span class="o">{</span> - <span class="kd">public</span> <span class="kt">boolean</span> <span class="nf">accept</span><span class="o">(</span><span class="n">File</span> <span class="n">dir</span><span class="o">,</span> <span class="n">String</span> <span class="n">name</span><span class="o">)</span> <span class="o">{</span> - <span class="kd">final</span> <span class="n">String</span> <span class="n">nameSansGz</span> <span class="o">=</span> <span class="n">trim</span><span class="o">(</span><span class="n">name</span><span class="o">,</span> <span class="s">".gz"</span><span class="o">);</span> - <span class="k">return</span> <span class="n">nameSansGz</span><span class="o">.</span><span class="na">endsWith</span><span class="o">(</span><span class="s">".csv"</span><span class="o">)</span> - <span class="o">||</span> <span class="n">nameSansGz</span><span class="o">.</span><span class="na">endsWith</span><span class="o">(</span><span class="s">".json"</span><span class="o">);</span> + <span class="k">new</span> <span class="n">FilenameFilter</span><span class="o">()</span> <span class="o">{</span> + <span class="kd">public</span> <span class="kt">boolean</span> <span class="n">accept</span><span class="o">(</span><span class="n">File</span> <span class="n">dir</span><span class="o">,</span> <span class="n">String</span> <span class="n">name</span><span class="o">)</span> <span class="o">{</span> + <span class="kd">final</span> <span class="n">String</span> <span class="n">nameSansGz</span> <span class="o">=</span> <span class="n">trim</span><span class="o">(</span><span class="n">name</span><span class="o">,</span> <span class="s">".gz"</span><span class="o">);</span> + <span class="k">return</span> <span class="n">nameSansGz</span><span class="o">.</span><span class="na">endsWith</span><span class="o">(</span><span class="s">".csv"</span><span class="o">)</span> + <span class="o">||</span> <span class="n">nameSansGz</span><span class="o">.</span><span class="na">endsWith</span><span class="o">(</span><span class="s">".json"</span><span class="o">);</span> <span class="o">}</span> <span class="o">});</span> <span class="k">if</span> <span class="o">(</span><span class="n">files</span> <span class="o">==</span> <span class="kc">null</span><span class="o">)</span> <span class="o">{</span> - <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"directory "</span> <span class="o">+</span> <span class="n">directoryFile</span> <span class="o">+</span> <span class="s">" not found"</span><span class="o">);</span> + <span class="n">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"directory "</span> <span class="o">+</span> <span class="n">directoryFile</span> <span class="o">+</span> <span class="s">" not found"</span><span class="o">);</span> <span class="n">files</span> <span class="o">=</span> <span class="k">new</span> <span class="n">File</span><span class="o">[</span><span class="mi">0</span><span class="o">];</span> <span class="o">}</span> <span class="c1">// Build a map from table name to table; each file becomes a table.</span> <span class="kd">final</span> <span class="n">ImmutableMap</span><span class="o">.</span><span class="na">Builder</span><span class="o"><</span><span class="n">String</span><span class="o">,</span> <span class="n">Table</span><span class="o">></span> <span class="n">builder</span> <span class="o">=</span> <span class="n">ImmutableMap</span><span class="o">.</span><span class="na">builder</span><span class="o">();</span> <span class="k">for</span> <span class="o">(</span><span class="n">File</span> <span class="n">file</span> <span class="o">:</span> <span class="n">files</span><span class="o">)</span> <span class="o">{</span> - <span class="n">String</span> <span class="n">tableName</span> <span class="o">=</span> <span class="n">trim</span><span class="o">(</span><span class="n">file</span><span class="o">.</span><span class="na">getName</span><span class="o">(),</span> <span class="s">".gz"</span><span class="o">);</span> - <span class="kd">final</span> <span class="n">String</span> <span class="n">tableNameSansJson</span> <span class="o">=</span> <span class="n">trimOrNull</span><span class="o">(</span><span class="n">tableName</span><span class="o">,</span> <span class="s">".json"</span><span class="o">);</span> + <span class="n">String</span> <span class="n">tableName</span> <span class="o">=</span> <span class="n">trim</span><span class="o">(</span><span class="n">file</span><span class="o">.</span><span class="na">getName</span><span class="o">(),</span> <span class="s">".gz"</span><span class="o">);</span> + <span class="kd">final</span> <span class="n">String</span> <span class="n">tableNameSansJson</span> <span class="o">=</span> <span class="n">trimOrNull</span><span class="o">(</span><span class="n">tableName</span><span class="o">,</span> <span class="s">".json"</span><span class="o">);</span> <span class="k">if</span> <span class="o">(</span><span class="n">tableNameSansJson</span> <span class="o">!=</span> <span class="kc">null</span><span class="o">)</span> <span class="o">{</span> - <span class="n">JsonTable</span> <span class="n">table</span> <span class="o">=</span> <span class="k">new</span> <span class="nf">JsonTable</span><span class="o">(</span><span class="n">file</span><span class="o">);</span> + <span class="n">JsonTable</span> <span class="n">table</span> <span class="o">=</span> <span class="k">new</span> <span class="n">JsonTable</span><span class="o">(</span><span class="n">file</span><span class="o">);</span> <span class="n">builder</span><span class="o">.</span><span class="na">put</span><span class="o">(</span><span class="n">tableNameSansJson</span><span class="o">,</span> <span class="n">table</span><span class="o">);</span> <span class="k">continue</span><span class="o">;</span> <span class="o">}</span> - <span class="n">tableName</span> <span class="o">=</span> <span class="n">trim</span><span class="o">(</span><span class="n">tableName</span><span class="o">,</span> <span class="s">".csv"</span><span class="o">);</span> + <span class="n">tableName</span> <span class="o">=</span> <span class="n">trim</span><span class="o">(</span><span class="n">tableName</span><span class="o">,</span> <span class="s">".csv"</span><span class="o">);</span> <span class="kd">final</span> <span class="n">Table</span> <span class="n">table</span> <span class="o">=</span> <span class="n">createTable</span><span class="o">(</span><span class="n">file</span><span class="o">);</span> <span class="n">builder</span><span class="o">.</span><span class="na">put</span><span class="o">(</span><span class="n">tableName</span><span class="o">,</span> <span class="n">table</span><span class="o">);</span> <span class="o">}</span> <span class="k">return</span> <span class="n">builder</span><span class="o">.</span><span class="na">build</span><span class="o">();</span> <span class="o">}</span> -<span class="cm">/** Creates different sub-type of table based on the "flavor" attribute. */</span> -<span class="kd">private</span> <span class="n">Table</span> <span class="nf">createTable</span><span class="o">(</span><span class="n">File</span> <span class="n">file</span><span class="o">)</span> <span class="o">{</span> +<span class="cm">/** Creates different sub-type of table based on the "flavor" attribute. */</span> +<span class="kd">private</span> <span class="n">Table</span> <span class="nf">createTable</span><span class="p">(</span><span class="n">File</span> <span class="n">file</span><span class="o">)</span> <span class="o">{</span> <span class="k">switch</span> <span class="o">(</span><span class="n">flavor</span><span class="o">)</span> <span class="o">{</span> <span class="k">case</span> <span class="nl">TRANSLATABLE:</span> - <span class="k">return</span> <span class="k">new</span> <span class="nf">CsvTranslatableTable</span><span class="o">(</span><span class="n">file</span><span class="o">,</span> <span class="kc">null</span><span class="o">);</span> + <span class="k">return</span> <span class="k">new</span> <span class="n">CsvTranslatableTable</span><span class="o">(</span><span class="n">file</span><span class="o">,</span> <span class="kc">null</span><span class="o">);</span> <span class="k">case</span> <span class="nl">SCANNABLE:</span> - <span class="k">return</span> <span class="k">new</span> <span class="nf">CsvScannableTable</span><span class="o">(</span><span class="n">file</span><span class="o">,</span> <span class="kc">null</span><span class="o">);</span> + <span class="k">return</span> <span class="k">new</span> <span class="n">CsvScannableTable</span><span class="o">(</span><span class="n">file</span><span class="o">,</span> <span class="kc">null</span><span class="o">);</span> <span class="k">case</span> <span class="nl">FILTERABLE:</span> - <span class="k">return</span> <span class="k">new</span> <span class="nf">CsvFilterableTable</span><span class="o">(</span><span class="n">file</span><span class="o">,</span> <span class="kc">null</span><span class="o">);</span> + <span class="k">return</span> <span class="k">new</span> <span class="n">CsvFilterableTable</span><span class="o">(</span><span class="n">file</span><span class="o">,</span> <span class="kc">null</span><span class="o">);</span> <span class="k">default</span><span class="o">:</span> - <span class="k">throw</span> <span class="k">new</span> <span class="nf">AssertionError</span><span class="o">(</span><span class="s">"Unknown flavor "</span> <span class="o">+</span> <span class="n">flavor</span><span class="o">);</span> + <span class="k">throw</span> <span class="k">new</span> <span class="n">AssertionError</span><span class="o">(</span><span class="s">"Unknown flavor "</span> <span class="o">+</span> <span class="n">flavor</span><span class="o">);</span> <span class="o">}</span> -<span class="o">}</span></code></pre></div> +<span class="o">}</span></code></pre></figure> <p>The schema scans the directory and finds all files whose name ends with â.csvâ and creates tables for them. In this case, the directory @@ -1075,27 +1075,27 @@ clause that are not used in the final re <p>Here is a schema that defines a view:</p> -<div class="highlight"><pre><code class="language-json" data-lang="json"><span class="p">{</span> - <span class="err">version:</span> <span class="err">'1.0',</span> - <span class="err">defaultSchema:</span> <span class="err">'SALES',</span> - <span class="err">schemas:</span> <span class="err">[</span> - <span class="err">{</span> - <span class="err">name:</span> <span class="err">'SALES',</span> - <span class="err">type:</span> <span class="err">'custom',</span> - <span class="err">factory:</span> <span class="err">'org.apache.calcite.adapter.csv.CsvSchemaFactory',</span> - <span class="err">operand:</span> <span class="err">{</span> - <span class="err">directory:</span> <span class="err">'target/test-classes/sales'</span> - <span class="p">}</span><span class="err">,</span> - <span class="err">tables:</span> <span class="p">[</span> - <span class="p">{</span> - <span class="err">name:</span> <span class="err">'FEMALE_EMPS',</span> - <span class="err">type:</span> <span class="err">'view',</span> - <span class="err">sql:</span> <span class="err">'SELECT</span> <span class="err">*</span> <span class="err">FROM</span> <span class="err">emps</span> <span class="err">WHERE</span> <span class="err">gender</span> <span class="err">=</span> <span class="err">\'F\''</span> - <span class="p">}</span> - <span class="p">]</span> - <span class="err">}</span> - <span class="err">]</span> -<span class="err">}</span></code></pre></div> +<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="w"> </span><span class="err">'1.0',</span><span class="w"> + </span><span class="err">defaultSchema:</span><span class="w"> </span><span class="err">'SALES',</span><span class="w"> + </span><span class="err">schemas:</span><span class="w"> </span><span class="err">[</span><span class="w"> + </span><span class="err">{</span><span class="w"> + </span><span class="err">name:</span><span class="w"> </span><span class="err">'SALES',</span><span class="w"> + </span><span class="err">type:</span><span class="w"> </span><span class="err">'custom',</span><span class="w"> + </span><span class="err">factory:</span><span class="w"> </span><span class="err">'org.apache.calcite.adapter.csv.CsvSchemaFactory',</span><span class="w"> + </span><span class="err">operand:</span><span class="w"> </span><span class="err">{</span><span class="w"> + </span><span class="err">directory:</span><span class="w"> </span><span class="err">'target/test-classes/sales'</span><span class="w"> + </span><span class="p">}</span><span class="err">,</span><span class="w"> + </span><span class="err">tables:</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="w"> </span><span class="err">'FEMALE_EMPS',</span><span class="w"> + </span><span class="err">type:</span><span class="w"> </span><span class="err">'view',</span><span class="w"> + </span><span class="err">sql:</span><span class="w"> </span><span class="err">'SELECT</span><span class="w"> </span><span class="err">*</span><span class="w"> </span><span class="err">FROM</span><span class="w"> </span><span class="err">emps</span><span class="w"> </span><span class="err">WHERE</span><span class="w"> </span><span class="err">gender</span><span class="w"> </span><span class="err">=</span><span class="w"> </span><span class="err">\'F\''</span><span class="w"> + </span><span class="p">}</span><span class="w"> + </span><span class="p">]</span><span class="w"> + </span><span class="err">}</span><span class="w"> + </span><span class="err">]</span><span class="w"> +</span><span class="err">}</span></code></pre></figure> <p>The line <code>type: 'view'</code> tags <code>FEMALE_EMPS</code> as a view, as opposed to a regular table or a custom table. @@ -1106,23 +1106,23 @@ back-slash, in the normal way for JSON.< alternative syntax. If your view has a long SQL statement, you can instead supply a list of lines rather than a single string:</p> -<div class="highlight"><pre><code class="language-json" data-lang="json"><span class="p">{</span> - <span class="err">name:</span> <span class="err">'FEMALE_EMPS',</span> - <span class="err">type:</span> <span class="err">'view',</span> - <span class="err">sql:</span> <span class="err">[</span> - <span class="err">'SELECT</span> <span class="err">*</span> <span class="err">FROM</span> <span class="err">emps',</span> - <span class="err">'WHERE</span> <span class="err">gender</span> <span class="err">=</span> <span class="err">\'F\''</span> - <span class="err">]</span> -<span class="p">}</span></code></pre></div> +<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="w"> </span><span class="err">'FEMALE_EMPS',</span><span class="w"> + </span><span class="err">type:</span><span class="w"> </span><span class="err">'view',</span><span class="w"> + </span><span class="err">sql:</span><span class="w"> </span><span class="err">[</span><span class="w"> + </span><span class="err">'SELECT</span><span class="w"> </span><span class="err">*</span><span class="w"> </span><span class="err">FROM</span><span class="w"> </span><span class="err">emps',</span><span class="w"> + </span><span class="err">'WHERE</span><span class="w"> </span><span class="err">gender</span><span class="w"> </span><span class="err">=</span><span class="w"> </span><span class="err">\'F\''</span><span class="w"> + </span><span class="err">]</span><span class="w"> +</span><span class="p">}</span></code></pre></figure> <p>Now we have defined a view, we can use it in queries just as if it were a table:</p> -<div class="highlight"><pre><code class="language-sql" data-lang="sql"><span class="n">sqlline</span><span class="o">></span> <span class="k">SELECT</span> <span class="n">e</span><span class="p">.</span><span class="n">name</span><span class="p">,</span> <span class="n">d</span><span class="p">.</span><span class="n">name</span> <span class="k">FROM</span> <span class="n">female_emps</span> <span class="k">AS</span> <span class="n">e</span> <span class="k">JOIN</span> <span class="n">depts</span> <span class="k">AS</span> <span class="n">d</span> <span class="k">on</span> <span class="n">e</span><span class="p">.</span><span class="n">deptno</span> <span class="o">=</span> <span class="n">d</span><span class="p">.</span><span class="n">deptno</span><span class="p">;</span> -<span class="o">+</span><span class="c1">--------+------------+</span> -<span class="o">|</span> <span class="n">NAME</span> <span class="o">|</span> <span class="n">NAME</span> <span class="o">|</span> -<span class="o">+</span><span class="c1">--------+------------+</span> -<span class="o">|</span> <span class="n">Wilma</span> <span class="o">|</span> <span class="n">Marketing</span> <span class="o">|</span> -<span class="o">+</span><span class="c1">--------+------------+</span></code></pre></div> +<figure class="highlight"><pre><code class="language-sql" data-lang="sql"><span class="n">sqlline</span><span class="o">></span> <span class="k">SELECT</span> <span class="n">e</span><span class="p">.</span><span class="n">name</span><span class="p">,</span> <span class="n">d</span><span class="p">.</span><span class="n">name</span> <span class="k">FROM</span> <span class="n">female_emps</span> <span class="k">AS</span> <span class="n">e</span> <span class="k">JOIN</span> <span class="n">depts</span> <span class="k">AS</span> <span class="n">d</span> <span class="k">on</span> <span class="n">e</span><span class="p">.</span><span class="n">deptno</span> <span class="o">=</span> <span class="n">d</span><span class="p">.</span><span class="n">deptno</span><span class="p">;</span> +<span class="o">+</span><span class="c1">--------+------------+ +</span><span class="o">|</span> <span class="n">NAME</span> <span class="o">|</span> <span class="n">NAME</span> <span class="o">|</span> +<span class="o">+</span><span class="c1">--------+------------+ +</span><span class="o">|</span> <span class="n">Wilma</span> <span class="o">|</span> <span class="n">Marketing</span> <span class="o">|</span> +<span class="o">+--------+------------+</span></code></pre></figure> <h2 id="custom-tables">Custom tables</h2> @@ -1131,40 +1131,40 @@ They donât need to live in a custom <p>There is an example in <code>model-with-custom-table.json</code>:</p> -<div class="highlight"><pre><code class="language-json" data-lang="json"><span class="p">{</span> - <span class="err">version:</span> <span class="err">'1.0',</span> - <span class="err">defaultSchema:</span> <span class="err">'CUSTOM_TABLE',</span> - <span class="err">schemas:</span> <span class="err">[</span> - <span class="err">{</span> - <span class="err">name:</span> <span class="err">'CUSTOM_TABLE',</span> - <span class="err">tables:</span> <span class="err">[</span> - <span class="err">{</span> - <span class="err">name:</span> <span class="err">'EMPS',</span> - <span class="err">type:</span> <span class="err">'custom',</span> - <span class="err">factory:</span> <span class="err">'org.apache.calcite.adapter.csv.CsvTableFactory',</span> - <span class="err">operand:</span> <span class="err">{</span> - <span class="err">file:</span> <span class="err">'target/test-classes/sales/EMPS.csv.gz',</span> - <span class="err">flavor:</span> <span class="nt">"scannable"</span> - <span class="p">}</span> - <span class="err">}</span> - <span class="err">]</span> - <span class="err">}</span> - <span class="err">]</span> -<span class="err">}</span></code></pre></div> +<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="w"> </span><span class="err">'1.0',</span><span class="w"> + </span><span class="err">defaultSchema:</span><span class="w"> </span><span class="err">'CUSTOM_TABLE',</span><span class="w"> + </span><span class="err">schemas:</span><span class="w"> </span><span class="err">[</span><span class="w"> + </span><span class="err">{</span><span class="w"> + </span><span class="err">name:</span><span class="w"> </span><span class="err">'CUSTOM_TABLE',</span><span class="w"> + </span><span class="err">tables:</span><span class="w"> </span><span class="err">[</span><span class="w"> + </span><span class="err">{</span><span class="w"> + </span><span class="err">name:</span><span class="w"> </span><span class="err">'EMPS',</span><span class="w"> + </span><span class="err">type:</span><span class="w"> </span><span class="err">'custom',</span><span class="w"> + </span><span class="err">factory:</span><span class="w"> </span><span class="err">'org.apache.calcite.adapter.csv.CsvTableFactory',</span><span class="w"> + </span><span class="err">operand:</span><span class="w"> </span><span class="err">{</span><span class="w"> + </span><span class="err">file:</span><span class="w"> </span><span class="err">'target/test-classes/sales/EMPS.csv.gz',</span><span class="w"> + </span><span class="err">flavor:</span><span class="w"> </span><span class="nt">"scannable"</span><span class="w"> + </span><span class="err">}</span><span class="w"> + </span><span class="err">}</span><span class="w"> + </span><span class="err">]</span><span class="w"> + </span><span class="err">}</span><span class="w"> + </span><span class="err">]</span><span class="w"> +</span><span class="err">}</span></code></pre></figure> <p>We can query the table in the usual way:</p> -<div class="highlight"><pre><code class="language-sql" data-lang="sql"><span class="n">sqlline</span><span class="o">></span> <span class="o">!</span><span class="k">connect</span> <span class="n">jdbc</span><span class="p">:</span><span class="n">calcite</span><span class="p">:</span><span class="n">model</span><span class="o">=</span><span class="n">target</span><span class="o">/</span><span class="n">test</span><span class="o">-</span><span class="n">classes</span><span class="o">/</span><span class="n">model</span><span class="o">-</span><span class="k">with</span><span class="o">-</span><span class="n">custom</span><span class="o">-</span><span class="k">table</span><span class="p">.</span><span class="n">json</span> <span class="k">admin</span> <span class="k">admin</span> +<figure class="highlight"><pre><code class="language-sql" data-lang="sql"><span class="n">sqlline</span><span class="o">></span> <span class="o">!</span><span class="k">connect</span> <span class="n">jdbc</span><span class="p">:</span><span class="n">calcite</span><span class="p">:</span><span class="n">model</span><span class="o">=</span><span class="n">target</span><span class="o">/</span><span class="n">test</span><span class="o">-</span><span class="n">classes</span><span class="o">/</span><span class="n">model</span><span class="o">-</span><span class="k">with</span><span class="o">-</span><span class="n">custom</span><span class="o">-</span><span class="k">table</span><span class="p">.</span><span class="n">json</span> <span class="k">admin</span> <span class="k">admin</span> <span class="n">sqlline</span><span class="o">></span> <span class="k">SELECT</span> <span class="n">empno</span><span class="p">,</span> <span class="n">name</span> <span class="k">FROM</span> <span class="n">custom_table</span><span class="p">.</span><span class="n">emps</span><span class="p">;</span> -<span class="o">+</span><span class="c1">--------+--------+</span> -<span class="o">|</span> <span class="n">EMPNO</span> <span class="o">|</span> <span class="n">NAME</span> <span class="o">|</span> -<span class="o">+</span><span class="c1">--------+--------+</span> -<span class="o">|</span> <span class="mi">100</span> <span class="o">|</span> <span class="n">Fred</span> <span class="o">|</span> +<span class="o">+</span><span class="c1">--------+--------+ +</span><span class="o">|</span> <span class="n">EMPNO</span> <span class="o">|</span> <span class="n">NAME</span> <span class="o">|</span> +<span class="o">+</span><span class="c1">--------+--------+ +</span><span class="o">|</span> <span class="mi">100</span> <span class="o">|</span> <span class="n">Fred</span> <span class="o">|</span> <span class="o">|</span> <span class="mi">110</span> <span class="o">|</span> <span class="n">Eric</span> <span class="o">|</span> <span class="o">|</span> <span class="mi">110</span> <span class="o">|</span> <span class="n">John</span> <span class="o">|</span> <span class="o">|</span> <span class="mi">120</span> <span class="o">|</span> <span class="n">Wilma</span> <span class="o">|</span> <span class="o">|</span> <span class="mi">130</span> <span class="o">|</span> <span class="n">Alice</span> <span class="o">|</span> -<span class="o">+</span><span class="c1">--------+--------+</span></code></pre></div> +<span class="o">+--------+--------+</span></code></pre></figure> <p>The schema is a regular one, and contains a custom table powered by <a href="https://github.com/apache/calcite/blob/master/example/csv/src/main/java/org/apache/calcite/adapter/csv/CsvTableFactory.java">org.apache.calcite.adapter.csv.CsvTableFactory</a>, @@ -1173,14 +1173,14 @@ which implements the Calcite interface Its <code>create</code> method instantiates a <code>CsvScannableTable</code>, passing in the <code>file</code> argument from the model file:</p> -<div class="highlight"><pre><code class="language-java" data-lang="java"><span class="kd">public</span> <span class="n">CsvTable</span> <span class="nf">create</span><span class="o">(</span><span class="n">SchemaPlus</span> <span class="n">schema</span><span class="o">,</span> <span class="n">String</span> <span class="n">name</span><span class="o">,</span> +<figure class="highlight"><pre><code class="language-java" data-lang="java"><span class="kd">public</span> <span class="n">CsvTable</span> <span class="nf">create</span><span class="p">(</span><span class="n">SchemaPlus</span> <span class="n">schema</span><span class="o">,</span> <span class="n">String</span> <span class="n">name</span><span class="o">,</span> <span class="n">Map</span><span class="o"><</span><span class="n">String</span><span class="o">,</span> <span class="n">Object</span><span class="o">></span> <span class="n">map</span><span class="o">,</span> <span class="n">RelDataType</span> <span class="n">rowType</span><span class="o">)</span> <span class="o">{</span> - <span class="n">String</span> <span class="n">fileName</span> <span class="o">=</span> <span class="o">(</span><span class="n">String</span><span class="o">)</span> <span class="n">map</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="s">"file"</span><span class="o">);</span> - <span class="kd">final</span> <span class="n">File</span> <span class="n">file</span> <span class="o">=</span> <span class="k">new</span> <span class="nf">File</span><span class="o">(</span><span class="n">fileName</span><span class="o">);</span> + <span class="n">String</span> <span class="n">fileName</span> <span class="o">=</span> <span class="o">(</span><span class="n">String</span><span class="o">)</span> <span class="n">map</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="s">"file"</span><span class="o">);</span> + <span class="kd">final</span> <span class="n">File</span> <span class="n">file</span> <span class="o">=</span> <span class="k">new</span> <span class="n">File</span><span class="o">(</span><span class="n">fileName</span><span class="o">);</span> <span class="kd">final</span> <span class="n">RelProtoDataType</span> <span class="n">protoRowType</span> <span class="o">=</span> <span class="n">rowType</span> <span class="o">!=</span> <span class="kc">null</span> <span class="o">?</span> <span class="n">RelDataTypeImpl</span><span class="o">.</span><span class="na">proto</span><span class="o">(</span><span class="n">rowType</span><span class="o">)</span> <span class="o">:</span> <span class="kc">null</span><span class="o">;</span> - <span class="k">return</span> <span class="k">new</span> <span class="nf">CsvScannableTable</span><span class="o">(</span><span class="n">file</span><span class="o">,</span> <span class="n">protoRowType</span><span class="o">);</span> -<span class="o">}</span></code></pre></div> + <span class="k">return</span> <span class="k">new</span> <span class="n">CsvScannableTable</span><span class="o">(</span><span class="n">file</span><span class="o">,</span> <span class="n">protoRowType</span><span class="o">);</span> +<span class="o">}</span></code></pre></figure> <p>Implementing a custom table is often a simpler alternative to implementing a custom schema. Both approaches might end up creating a similar implementation @@ -1195,18 +1195,18 @@ more control (say, providing different p <h2 id="comments-in-models">Comments in models</h2> -<p>Models can include comments using <code>/* ... */</code> and <code>//</code> syntax:</p> +<p>Models can include comments using <code class="highlighter-rouge">/* ... */</code> and <code class="highlighter-rouge">//</code> syntax:</p> -<div class="highlight"><pre><code class="language-json" data-lang="json"><span class="p">{</span> - <span class="err">version:</span> <span class="err">'1.0',</span> - <span class="err">/*</span> <span class="err">Multi-line</span> - <span class="err">comment.</span> <span class="err">*/</span> - <span class="err">defaultSchema:</span> <span class="err">'CUSTOM_TABLE',</span> - <span class="err">//</span> <span class="err">Single-line</span> <span class="err">comment.</span> - <span class="err">schemas:</span> <span class="err">[</span> - <span class="err">..</span> - <span class="err">]</span> -<span class="p">}</span></code></pre></div> +<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="w"> </span><span class="err">'1.0',</span><span class="w"> + </span><span class="err">/*</span><span class="w"> </span><span class="err">Multi-line</span><span class="w"> + </span><span class="err">comment.</span><span class="w"> </span><span class="err">*/</span><span class="w"> + </span><span class="err">defaultSchema:</span><span class="w"> </span><span class="err">'CUSTOM_TABLE',</span><span class="w"> + </span><span class="err">//</span><span class="w"> </span><span class="err">Single-line</span><span class="w"> </span><span class="err">comment.</span><span class="w"> + </span><span class="err">schemas:</span><span class="w"> </span><span class="err">[</span><span class="w"> + </span><span class="err">..</span><span class="w"> + </span><span class="err">]</span><span class="w"> +</span><span class="p">}</span></code></pre></figure> <p>(Comments are not standard JSON, but are a harmless extension.)</p> @@ -1231,27 +1231,27 @@ schema, and then you define some rules t a subset of columns from a CSV file. Letâs run the same query against two very similar schemas:</p> -<div class="highlight"><pre><code class="language-sql" data-lang="sql"><span class="n">sqlline</span><span class="o">></span> <span class="o">!</span><span class="k">connect</span> <span class="n">jdbc</span><span class="p">:</span><span class="n">calcite</span><span class="p">:</span><span class="n">model</span><span class="o">=</span><span class="n">target</span><span class="o">/</span><span class="n">test</span><span class="o">-</span><span class="n">classes</span><span class="o">/</span><span class="n">model</span><span class="p">.</span><span class="n">json</span> <span class="k">admin</span> <span class="k">admin</span> +<figure class="highlight"><pre><code class="language-sql" data-lang="sql"><span class="n">sqlline</span><span class="o">></span> <span class="o">!</span><span class="k">connect</span> <span class="n">jdbc</span><span class="p">:</span><span class="n">calcite</span><span class="p">:</span><span class="n">model</span><span class="o">=</span><span class="n">target</span><span class="o">/</span><span class="n">test</span><span class="o">-</span><span class="n">classes</span><span class="o">/</span><span class="n">model</span><span class="p">.</span><span class="n">json</span> <span class="k">admin</span> <span class="k">admin</span> <span class="n">sqlline</span><span class="o">></span> <span class="k">explain</span> <span class="n">plan</span> <span class="k">for</span> <span class="k">select</span> <span class="n">name</span> <span class="k">from</span> <span class="n">emps</span><span class="p">;</span> -<span class="o">+</span><span class="c1">-----------------------------------------------------+</span> -<span class="o">|</span> <span class="n">PLAN</span> <span class="o">|</span> -<span class="o">+</span><span class="c1">-----------------------------------------------------+</span> -<span class="o">|</span> <span class="n">EnumerableCalcRel</span><span class="p">(</span><span class="n">expr</span><span class="o">#</span><span class="mi">0</span><span class="p">..</span><span class="mi">9</span><span class="o">=</span><span class="p">[</span><span class="err">{</span><span class="n">inputs</span><span class="err">}</span><span class="p">],</span> <span class="n">NAME</span><span class="o">=</span><span class="p">[</span><span class="err">$</span><span class="n">t1</span><span class="p">])</span> <span class="o">|</span> +<span class="o">+</span><span class="c1">-----------------------------------------------------+ +</span><span class="o">|</span> <span class="n">PLAN</span> <span class="o">|</span> +<span class="o">+</span><span class="c1">-----------------------------------------------------+ +</span><span class="o">|</span> <span class="n">EnumerableCalcRel</span><span class="p">(</span><span class="n">expr</span><span class="o">#</span><span class="mi">0</span><span class="p">..</span><span class="mi">9</span><span class="o">=</span><span class="p">[</span><span class="err">{</span><span class="n">inputs</span><span class="err">}</span><span class="p">],</span> <span class="n">NAME</span><span class="o">=</span><span class="p">[</span><span class="err">$</span><span class="n">t1</span><span class="p">])</span> <span class="o">|</span> <span class="o">|</span> <span class="n">EnumerableTableAccessRel</span><span class="p">(</span><span class="k">table</span><span class="o">=</span><span class="p">[[</span><span class="n">SALES</span><span class="p">,</span> <span class="n">EMPS</span><span class="p">]])</span> <span class="o">|</span> -<span class="o">+</span><span class="c1">-----------------------------------------------------+</span> -<span class="n">sqlline</span><span class="o">></span> <span class="o">!</span><span class="k">connect</span> <span class="n">jdbc</span><span class="p">:</span><span class="n">calcite</span><span class="p">:</span><span class="n">model</span><span class="o">=</span><span class="n">target</span><span class="o">/</span><span class="n">test</span><span class="o">-</span><span class="n">classes</span><span class="o">/</span><span class="n">smart</span><span class="p">.</span><span class="n">json</span> <span class="k">admin</span> <span class="k">admin</span> +<span class="o">+</span><span class="c1">-----------------------------------------------------+ +</span><span class="n">sqlline</span><span class="o">></span> <span class="o">!</span><span class="k">connect</span> <span class="n">jdbc</span><span class="p">:</span><span class="n">calcite</span><span class="p">:</span><span class="n">model</span><span class="o">=</span><span class="n">target</span><span class="o">/</span><span class="n">test</span><span class="o">-</span><span class="n">classes</span><span class="o">/</span><span class="n">smart</span><span class="p">.</span><span class="n">json</span> <span class="k">admin</span> <span class="k">admin</span> <span class="n">sqlline</span><span class="o">></span> <span class="k">explain</span> <span class="n">plan</span> <span class="k">for</span> <span class="k">select</span> <span class="n">name</span> <span class="k">from</span> <span class="n">emps</span><span class="p">;</span> -<span class="o">+</span><span class="c1">-----------------------------------------------------+</span> -<span class="o">|</span> <span class="n">PLAN</span> <span class="o">|</span> -<span class="o">+</span><span class="c1">-----------------------------------------------------+</span> -<span class="o">|</span> <span class="n">EnumerableCalcRel</span><span class="p">(</span><span class="n">expr</span><span class="o">#</span><span class="mi">0</span><span class="p">..</span><span class="mi">9</span><span class="o">=</span><span class="p">[</span><span class="err">{</span><span class="n">inputs</span><span class="err">}</span><span class="p">],</span> <span class="n">NAME</span><span class="o">=</span><span class="p">[</span><span class="err">$</span><span class="n">t1</span><span class="p">])</span> <span class="o">|</span> +<span class="o">+</span><span class="c1">-----------------------------------------------------+ +</span><span class="o">|</span> <span class="n">PLAN</span> <span class="o">|</span> +<span class="o">+</span><span class="c1">-----------------------------------------------------+ +</span><span class="o">|</span> <span class="n">EnumerableCalcRel</span><span class="p">(</span><span class="n">expr</span><span class="o">#</span><span class="mi">0</span><span class="p">..</span><span class="mi">9</span><span class="o">=</span><span class="p">[</span><span class="err">{</span><span class="n">inputs</span><span class="err">}</span><span class="p">],</span> <span class="n">NAME</span><span class="o">=</span><span class="p">[</span><span class="err">$</span><span class="n">t1</span><span class="p">])</span> <span class="o">|</span> <span class="o">|</span> <span class="n">CsvTableScan</span><span class="p">(</span><span class="k">table</span><span class="o">=</span><span class="p">[[</span><span class="n">SALES</span><span class="p">,</span> <span class="n">EMPS</span><span class="p">]])</span> <span class="o">|</span> -<span class="o">+</span><span class="c1">-----------------------------------------------------+</span></code></pre></div> +<span class="o">+-----------------------------------------------------+</span></code></pre></figure> <p>What causes the difference in plan? Letâs follow the trail of evidence. In the <code>smart.json</code> model file, there is just one extra line:</p> -<div class="highlight"><pre><code class="language-json" data-lang="json"><span class="err">flavor:</span> <span class="s2">"translatable"</span></code></pre></div> +<figure class="highlight"><pre><code class="language-json" data-lang="json"><span class="err">flavor:</span><span class="w"> </span><span class="s2">"translatable"</span></code></pre></figure> <p>This causes a <code>CsvSchema</code> to be created with <code>flavor = TRANSLATABLE</code>, @@ -1270,19 +1270,19 @@ but we have created a distinctive sub-ty <p>Here is the rule in its entirety:</p> -<div class="highlight"><pre><code class="language-java" data-lang="java"><span class="kd">public</span> <span class="kd">class</span> <span class="nc">CsvProjectTableScanRule</span> <span class="kd">extends</span> <span class="n">RelOptRule</span> <span class="o">{</span> +<figure class="highlight"><pre><code class="language-java" data-lang="java"><span class="kd">public</span> <span class="kd">class</span> <span class="nc">CsvProjectTableScanRule</span> <span class="kd">extends</span> <span class="n">RelOptRule</span> <span class="o">{</span> <span class="kd">public</span> <span class="kd">static</span> <span class="kd">final</span> <span class="n">CsvProjectTableScanRule</span> <span class="n">INSTANCE</span> <span class="o">=</span> - <span class="k">new</span> <span class="nf">CsvProjectTableScanRule</span><span class="o">();</span> + <span class="k">new</span> <span class="n">CsvProjectTableScanRule</span><span class="o">();</span> - <span class="kd">private</span> <span class="nf">CsvProjectTableScanRule</span><span class="o">()</span> <span class="o">{</span> + <span class="kd">private</span> <span class="n">CsvProjectTableScanRule</span><span class="o">()</span> <span class="o">{</span> <span class="kd">super</span><span class="o">(</span> <span class="n">operand</span><span class="o">(</span><span class="n">Project</span><span class="o">.</span><span class="na">class</span><span class="o">,</span> <span class="n">operand</span><span class="o">(</span><span class="n">CsvTableScan</span><span class="o">.</span><span class="na">class</span><span class="o">,</span> <span class="n">none</span><span class="o">())),</span> - <span class="s">"CsvProjectTableScanRule"</span><span class="o">);</span> + <span class="s">"CsvProjectTableScanRule"</span><span class="o">);</span> <span class="o">}</span> <span class="nd">@Override</span> - <span class="kd">public</span> <span class="kt">void</span> <span class="nf">onMatch</span><span class="o">(</span><span class="n">RelOptRuleCall</span> <span class="n">call</span><span class="o">)</span> <span class="o">{</span> + <span class="kd">public</span> <span class="kt">void</span> <span class="n">onMatch</span><span class="o">(</span><span class="n">RelOptRuleCall</span> <span class="n">call</span><span class="o">)</span> <span class="o">{</span> <span class="kd">final</span> <span class="n">Project</span> <span class="n">project</span> <span class="o">=</span> <span class="n">call</span><span class="o">.</span><span class="na">rel</span><span class="o">(</span><span class="mi">0</span><span class="o">);</span> <span class="kd">final</span> <span class="n">CsvTableScan</span> <span class="n">scan</span> <span class="o">=</span> <span class="n">call</span><span class="o">.</span><span class="na">rel</span><span class="o">(</span><span class="mi">1</span><span class="o">);</span> <span class="kt">int</span><span class="o">[]</span> <span class="n">fields</span> <span class="o">=</span> <span class="n">getProjectFields</span><span class="o">(</span><span class="n">project</span><span class="o">.</span><span class="na">getProjects</span><span class="o">());</span> @@ -1291,14 +1291,14 @@ but we have created a distinctive sub-ty <span class="k">return</span><span class="o">;</span> <span class="o">}</span> <span class="n">call</span><span class="o">.</span><span class="na">transformTo</span><span class="o">(</span> - <span class="k">new</span> <span class="nf">CsvTableScan</span><span class="o">(</span> + <span class="k">new</span> <span class="n">CsvTableScan</span><span class="o">(</span> <span class="n">scan</span><span class="o">.</span><span class="na">getCluster</span><span class="o">(),</span> <span class="n">scan</span><span class="o">.</span><span class="na">getTable</span><span class="o">(),</span> <span class="n">scan</span><span class="o">.</span><span class="na">csvTable</span><span class="o">,</span> <span class="n">fields</span><span class="o">));</span> <span class="o">}</span> - <span class="kd">private</span> <span class="kt">int</span><span class="o">[]</span> <span class="nf">getProjectFields</span><span class="o">(</span><span class="n">List</span><span class="o"><</span><span class="n">RexNode</span><span class="o">></span> <span class="n">exps</span><span class="o">)</span> <span class="o">{</span> + <span class="kd">private</span> <span class="kt">int</span><span class="o">[]</span> <span class="n">getProjectFields</span><span class="o">(</span><span class="n">List</span><span class="o"><</span><span class="n">RexNode</span><span class="o">></span> <span class="n">exps</span><span class="o">)</span> <span class="o">{</span> <span class="kd">final</span> <span class="kt">int</span><span class="o">[]</span> <span class="n">fields</span> <span class="o">=</span> <span class="k">new</span> <span class="kt">int</span><span class="o">[</span><span class="n">exps</span><span class="o">.</span><span class="na">size</span><span class="o">()];</span> <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">i</span> <span class="o"><</span> <span class="n">exps</span><span class="o">.</span><span class="na">size</span><span class="o">();</span> <span class="n">i</span><span class="o">++)</span> <span class="o">{</span> <span class="kd">final</span> <span class="n">RexNode</span> <span class="n">exp</span> <span class="o">=</span> <span class="n">exps</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="n">i</span><span class="o">);</span> @@ -1310,7 +1310,7 @@ but we have created a distinctive sub-ty <span class="o">}</span> <span class="k">return</span> <span class="n">fields</span><span class="o">;</span> <span class="o">}</span> -<span class="o">}</span></code></pre></div> +<span class="o">}</span></code></pre></figure> <p>The constructor declares the pattern of relational expressions that will cause the rule to fire.</p> @@ -1360,23 +1360,23 @@ operator statistics it is based upon. Bu <p>For example, this schema reads from a MySQL âfoodmartâ database:</p> -<div class="highlight"><pre><code class="language-json" data-lang="json"><span class="p">{</span> - <span class="err">version:</span> <span class="err">'1.0',</span> - <span class="err">defaultSchema:</span> <span class="err">'FOODMART',</span> - <span class="err">schemas:</span> <span class="err">[</span> - <span class="err">{</span> - <span class="err">name:</span> <span class="err">'FOODMART',</span> - <span class="err">type:</span> <span class="err">'custom',</span> - <span class="err">factory:</span> <span class="err">'org.apache.calcite.adapter.jdbc.JdbcSchema$Factory',</span> - <span class="err">operand:</span> <span class="err">{</span> - <span class="err">jdbcDriver:</span> <span class="err">'com.mysql.jdbc.Driver',</span> - <span class="err">jdbcUrl:</span> <span class="err">'jdbc:mysql://localhost/foodmart',</span> - <span class="err">jdbcUser:</span> <span class="err">'foodmart',</span> - <span class="err">jdbcPassword:</span> <span class="err">'foodmart'</span> - <span class="p">}</span> - <span class="err">}</span> - <span class="err">]</span> -<span class="err">}</span></code></pre></div> +<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="w"> </span><span class="err">'1.0',</span><span class="w"> + </span><span class="err">defaultSchema:</span><span class="w"> </span><span class="err">'FOODMART',</span><span class="w"> + </span><span class="err">schemas:</span><span class="w"> </span><span class="err">[</span><span class="w"> + </span><span class="err">{</span><span class="w"> + </span><span class="err">name:</span><span class="w"> </span><span class="err">'FOODMART',</span><span class="w"> + </span><span class="err">type:</span><span class="w"> </span><span class="err">'custom',</span><span class="w"> + </span><span class="err">factory:</span><span class="w"> </span><span class="err">'org.apache.calcite.adapter.jdbc.JdbcSchema$Factory',</span><span class="w"> + </span><span class="err">operand:</span><span class="w"> </span><span class="err">{</span><span class="w"> + </span><span class="err">jdbcDriver:</span><span class="w"> </span><span class="err">'com.mysql.jdbc.Driver',</span><span class="w"> + </span><span class="err">jdbcUrl:</span><span class="w"> </span><span class="err">'jdbc:mysql://localhost/foodmart',</span><span class="w"> + </span><span class="err">jdbcUser:</span><span class="w"> </span><span class="err">'foodmart',</span><span class="w"> + </span><span class="err">jdbcPassword:</span><span class="w"> </span><span class="err">'foodmart'</span><span class="w"> + </span><span class="p">}</span><span class="w"> + </span><span class="err">}</span><span class="w"> + </span><span class="err">]</span><span class="w"> +</span><span class="err">}</span></code></pre></figure> <p>(The FoodMart database will be familiar to those of you who have used the Mondrian OLAP engine, because it is Mondrianâs main test data @@ -1403,53 +1403,53 @@ those in-memory tables, effectively a ca <p>For example, the following model reads tables from a MySQL âfoodmartâ database:</p> -<div class="highlight"><pre><code class="language-json" data-lang="json"><span class="p">{</span> - <span class="err">version:</span> <span class="err">'1.0',</span> - <span class="err">defaultSchema:</span> <span class="err">'FOODMART_CLONE',</span> - <span class="err">schemas:</span> <span class="err">[</span> - <span class="err">{</span> - <span class="err">name:</span> <span class="err">'FOODMART_CLONE',</span> - <span class="err">type:</span> <span class="err">'custom',</span> - <span class="err">factory:</span> <span class="err">'org.apache.calcite.adapter.clone.CloneSchema$Factory',</span> - <span class="err">operand:</span> <span class="err">{</span> - <span class="err">jdbcDriver:</span> <span class="err">'com.mysql.jdbc.Driver',</span> - <span class="err">jdbcUrl:</span> <span class="err">'jdbc:mysql://localhost/foodmart',</span> - <span class="err">jdbcUser:</span> <span class="err">'foodmart',</span> - <span class="err">jdbcPassword:</span> <span class="err">'foodmart'</span> - <span class="p">}</span> - <span class="err">}</span> - <span class="err">]</span> -<span class="err">}</span></code></pre></div> +<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="w"> </span><span class="err">'1.0',</span><span class="w"> + </span><span class="err">defaultSchema:</span><span class="w"> </span><span class="err">'FOODMART_CLONE',</span><span class="w"> + </span><span class="err">schemas:</span><span class="w"> </span><span class="err">[</span><span class="w"> + </span><span class="err">{</span><span class="w"> + </span><span class="err">name:</span><span class="w"> </span><span class="err">'FOODMART_CLONE',</span><span class="w"> + </span><span class="err">type:</span><span class="w"> </span><span class="err">'custom',</span><span class="w"> + </span><span class="err">factory:</span><span class="w"> </span><span class="err">'org.apache.calcite.adapter.clone.CloneSchema$Factory',</span><span class="w"> + </span><span class="err">operand:</span><span class="w"> </span><span class="err">{</span><span class="w"> + </span><span class="err">jdbcDriver:</span><span class="w"> </span><span class="err">'com.mysql.jdbc.Driver',</span><span class="w"> + </span><span class="err">jdbcUrl:</span><span class="w"> </span><span class="err">'jdbc:mysql://localhost/foodmart',</span><span class="w"> + </span><span class="err">jdbcUser:</span><span class="w"> </span><span class="err">'foodmart',</span><span class="w"> + </span><span class="err">jdbcPassword:</span><span class="w"> </span><span class="err">'foodmart'</span><span class="w"> + </span><span class="p">}</span><span class="w"> + </span><span class="err">}</span><span class="w"> + </span><span class="err">]</span><span class="w"> +</span><span class="err">}</span></code></pre></figure> <p>Another technique is to build a clone schema on top of an existing schema. You use the <code>source</code> property to reference a schema defined earlier in the model, like this:</p> -<div class="highlight"><pre><code class="language-json" data-lang="json"><span class="p">{</span> - <span class="err">version:</span> <span class="err">'1.0',</span> - <span class="err">defaultSchema:</span> <span class="err">'FOODMART_CLONE',</span> - <span class="err">schemas:</span> <span class="err">[</span> - <span class="err">{</span> - <span class="err">name:</span> <span class="err">'FOODMART',</span> - <span class="err">type:</span> <span class="err">'custom',</span> - <span class="err">factory:</span> <span class="err">'org.apache.calcite.adapter.jdbc.JdbcSchema$Factory',</span> - <span class="err">operand:</span> <span class="err">{</span> - <span class="err">jdbcDriver:</span> <span class="err">'com.mysql.jdbc.Driver',</span> - <span class="err">jdbcUrl:</span> <span class="err">'jdbc:mysql://localhost/foodmart',</span> - <span class="err">jdbcUser:</span> <span class="err">'foodmart',</span> - <span class="err">jdbcPassword:</span> <span class="err">'foodmart'</span> - <span class="p">}</span> - <span class="err">},</span> - <span class="p">{</span> - <span class="err">name:</span> <span class="err">'FOODMART_CLONE',</span> - <span class="err">type:</span> <span class="err">'custom',</span> - <span class="err">factory:</span> <span class="err">'org.apache.calcite.adapter.clone.CloneSchema$Factory',</span> - <span class="err">operand:</span> <span class="err">{</span> - <span class="err">source:</span> <span class="err">'FOODMART'</span> - <span class="p">}</span> - <span class="err">}</span> - <span class="err">]</span> -<span class="err">}</span></code></pre></div> +<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="w"> </span><span class="err">'1.0',</span><span class="w"> + </span><span class="err">defaultSchema:</span><span class="w"> </span><span class="err">'FOODMART_CLONE',</span><span class="w"> + </span><span class="err">schemas:</span><span class="w"> </span><span class="err">[</span><span class="w"> + </span><span class="err">{</span><span class="w"> + </span><span class="err">name:</span><span class="w"> </span><span class="err">'FOODMART',</span><span class="w"> + </span><span class="err">type:</span><span class="w"> </span><span class="err">'custom',</span><span class="w"> + </span><span class="err">factory:</span><span class="w"> </span><span class="err">'org.apache.calcite.adapter.jdbc.JdbcSchema$Factory',</span><span class="w"> + </span><span class="err">operand:</span><span class="w"> </span><span class="err">{</span><span class="w"> + </span><span class="err">jdbcDriver:</span><span class="w"> </span><span class="err">'com.mysql.jdbc.Driver',</span><span class="w"> + </span><span class="err">jdbcUrl:</span><span class="w"> </span><span class="err">'jdbc:mysql://localhost/foodmart',</span><span class="w"> + </span><span class="err">jdbcUser:</span><span class="w"> </span><span class="err">'foodmart',</span><span class="w"> + </span><span class="err">jdbcPassword:</span><span class="w"> </span><span class="err">'foodmart'</span><span class="w"> + </span><span class="p">}</span><span class="w"> + </span><span class="err">},</span><span class="w"> + </span><span class="p">{</span><span class="w"> + </span><span class="err">name:</span><span class="w"> </span><span class="err">'FOODMART_CLONE',</span><span class="w"> + </span><span class="err">type:</span><span class="w"> </span><span class="err">'custom',</span><span class="w"> + </span><span class="err">factory:</span><span class="w"> </span><span class="err">'org.apache.calcite.adapter.clone.CloneSchema$Factory',</span><span class="w"> + </span><span class="err">operand:</span><span class="w"> </span><span class="err">{</span><span class="w"> + </span><span class="err">source:</span><span class="w"> </span><span class="err">'FOODMART'</span><span class="w"> + </span><span class="p">}</span><span class="w"> + </span><span class="err">}</span><span class="w"> + </span><span class="err">]</span><span class="w"> +</span><span class="err">}</span></code></pre></figure> <p>You can use this approach to create a clone schema on any type of schema, not just JDBC.</p> @@ -1549,74 +1549,50 @@ relational operators?</p> - - - - - - - - - - - - - - - - - - - - - - - - <li class=""><a href="/docs/index.html">Background</a></li> @@ -1627,116 +1603,78 @@ relational operators?</p> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <li class="current"><a href="/docs/tutorial.html">Tutorial</a></li> @@ -1747,20 +1685,14 @@ relational operators?</p> - - - - - - <li class=""><a href="/docs/algebra.html">Algebra</a></li> @@ -1779,14 +1711,10 @@ relational operators?</p> - - - - <li class=""><a href="/docs/adapter.html">Adapters</a></li> @@ -1797,104 +1725,70 @@ relational operators?</p> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <li class=""><a href="/docs/stream.html">Streaming</a></li> @@ -1905,80 +1799,54 @@ relational operators?</p> - - - - - - - - - - - - - - - - - - - - - - - - - - <li class=""><a href="/docs/lattice.html">Lattices</a></li> @@ -1997,38 +1865,26 @@ relational operators?</p> - - - - - - - - - - - - <li class=""><a href="/docs/avatica_overview.html">Overview</a></li> @@ -2039,50 +1895,34 @@ relational operators?</p> - - - - - - - - - - - - - - - - <li class=""><a href="/docs/avatica_roadmap.html">Roadmap</a></li> @@ -2093,32 +1933,22 @@ relational operators?</p> - - - - - - - - - - <li class=""><a href="/docs/avatica_json_reference.html">JSON Reference</a></li> @@ -2129,44 +1959,30 @@ relational operators?</p> - - - - - - - - - - - - - - <li class=""><a href="/docs/avatica_protobuf_reference.html">Protobuf Reference</a></li> @@ -2185,98 +2001,66 @@ relational operators?</p> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <li class=""><a href="/docs/reference.html">SQL language</a></li> @@ -2287,86 +2071,58 @@ relational operators?</p> - - - - - - - - - - - - - - - - - - - - - - - - - - - - <li class=""><a href="/docs/model.html">JSON models</a></li> @@ -2377,68 +2133,46 @@ relational operators?</p> - - - - - - - - - - - - - - - - - - - - - - <li class=""><a href="/docs/howto.html">HOWTO</a></li> @@ -2457,62 +2191,42 @@ relational operators?</p> - - - - - - - - - - - - - - - - - - - - <li class=""><a href="/docs/history.html">History</a></li> @@ -2523,92 +2237,62 @@ relational operators?</p> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <li class=""><a href="/docs/powered_by.html">Powered By Calcite</a></li> @@ -2619,143 +2303,161 @@ relational operators?</p> - - - - - - - - - <li class=""><a href="/docs/api.html">API</a></li> - - - - - - - - - - - + + - - - + + + - + + + - + + + - + + + - + + + - + + + + + + + + + + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + + + - + - <li class=""><a href="/docs/testapi.html">Test API</a></li> - + + + </ul>
Modified: calcite/site/downloads/index.html URL: http://svn.apache.org/viewvc/calcite/site/downloads/index.html?rev=1739659&r1=1739658&r2=1739659&view=diff ============================================================================== --- calcite/site/downloads/index.html (original) +++ calcite/site/downloads/index.html Sun Apr 17 21:26:04 2016 @@ -4,7 +4,7 @@ <meta charset="UTF-8"> <title>Downloads</title> <meta name="viewport" content="width=device-width,initial-scale=1"> - <meta name="generator" content="Jekyll v2.4.0"> + <meta name="generator" content="Jekyll v3.0.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"> @@ -194,18 +194,18 @@ succeed.</p> <h1 id="maven-artifacts">Maven artifacts</h1> -<p>Add the following to the dependencies section of your <code>pom.xml</code> file:</p> +<p>Add the following to the dependencies section of your <code class="highlighter-rouge">pom.xml</code> file:</p> -<div class="highlight"><pre><code class="language-xml" data-lang="xml"><span class="nt"><dependencies></span> +<figure class="highlight"><pre><code class="language-xml" data-lang="xml"><span class="nt"><dependencies></span> <span class="nt"><dependency></span> <span class="nt"><groupId></span>org.apache.calcite<span class="nt"></groupId></span> <span class="nt"><artifactId></span>calcite-core<span class="nt"></artifactId></span> <span class="nt"><version></span>1.7.0<span class="nt"></version></span> <span class="nt"></dependency></span> -<span class="nt"></dependencies></span></code></pre></div> +<span class="nt"></dependencies></span></code></pre></figure> -<p>Also include <code><dependency></code> elements for any extension modules you -need: <code>calcite-mongodb</code>, <code>calcite-spark</code>, <code>calcite-splunk</code>, and so +<p>Also include <code class="highlighter-rouge"><dependency></code> elements for any extension modules you +need: <code class="highlighter-rouge">calcite-mongodb</code>, <code class="highlighter-rouge">calcite-spark</code>, <code class="highlighter-rouge">calcite-splunk</code>, and so forth.</p> </article>
