You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by jh...@apache.org on 2015/05/29 21:47:56 UTC
svn commit: r1682538 [5/6] - in /incubator/calcite/site: develop/ docs/
news/ news/2015/01/31/release-1.0.0-incubating/
news/2015/03/13/release-1.1.0-incubating/
news/2015/04/07/release-1.2.0-incubating/ news/2015/04/24/new-committers/
news/2015/05/29/...
Modified: incubator/calcite/site/docs/tutorial.html
URL: http://svn.apache.org/viewvc/incubator/calcite/site/docs/tutorial.html?rev=1682538&r1=1682537&r2=1682538&view=diff
==============================================================================
--- incubator/calcite/site/docs/tutorial.html (original)
+++ incubator/calcite/site/docs/tutorial.html Fri May 29 19:47:55 2015
@@ -626,29 +626,30 @@ capability.</p>
<p>CSV also serves as a template for building adapters to other
data formats. Even though there are not many lines of code, it covers
-several important concepts:
-* user-defined schema using SchemaFactory and Schema interfaces;
-* declaring schemas in a model JSON file;
-* declaring views in a model JSON file;
-* user-defined table using the Table interface;
-* determining the record type of a table;
-* a simple implementation of Table, using the ScannableTable interface, that
- enumerates all rows directly;
-* a more advanced implementation that implements FilterableTable, and can
- filter out rows according to simple predicates;
-* advanced implementation of Table, using TranslatableTable, that translates
- to relational operators using planner rules.</p>
+several important concepts:</p>
+
+<ul>
+ <li>user-defined schema using SchemaFactory and Schema interfaces;</li>
+ <li>declaring schemas in a model JSON file;</li>
+ <li>declaring views in a model JSON file;</li>
+ <li>user-defined table using the Table interface;</li>
+ <li>determining the record type of a table;</li>
+ <li>a simple implementation of Table, using the ScannableTable interface, that
+enumerates all rows directly;</li>
+ <li>a more advanced implementation that implements FilterableTable, and can
+filter out rows according to simple predicates;</li>
+ <li>advanced implementation of Table, using TranslatableTable, that translates
+to relational operators using planner rules.</li>
+</ul>
<h2 id="download-and-build">Download and build</h2>
<p>You need Java (1.7 or higher; 1.8 preferred), git and maven (3.2.1 or later).</p>
-<p><code>bash
-$ git clone https://github.com/apache/incubator-calcite.git
-$ cd incubator-calcite
-$ mvn install -DskipTests -Dcheckstyle.skip=true
-$ cd example/csv
-</code></p>
+<div class="highlight"><pre><code class="language-bash" data-lang="bash"><span class="nv">$ </span>git clone https://github.com/apache/incubator-calcite.git
+<span class="nv">$ </span><span class="nb">cd </span>incubator-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>
<h2 id="first-queries">First queries</h2>
@@ -656,27 +657,23 @@ $ cd example/csv
<a href="https://github.com/julianhyde/sqlline">sqlline</a>, a SQL shell
that is included in this project.</p>
-<p><code>bash
-$ ./sqlline
-sqlline> !connect jdbc:calcite:model=target/test-classes/model.json admin admin
-</code></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>
<p>(If you are running Windows, the command is <code>sqlline.bat</code>.)</p>
<p>Execute a metadata query:</p>
-<p><code>bash
-sqlline> !tables
+<div class="highlight"><pre><code class="language-bash" data-lang="bash">sqlline> !tables
+------------+--------------+-------------+---------------+----------+------+
-| TABLE_CAT | TABLE_SCHEM | TABLE_NAME | TABLE_TYPE | REMARKS | TYPE |
+<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>
+------------+--------------+-------------+---------------+----------+------+
-| 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></p>
+<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>
<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>
@@ -696,44 +693,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>
-<p><code>bash
-sqlline> SELECT * FROM emps;
-+--------+--------+---------+---------+----------------+--------+-------+---+
-| EMPNO | NAME | DEPTNO | GENDER | CITY | EMPID | AGE | S |
+<div class="highlight"><pre><code class="language-bash" data-lang="bash">sqlline> SELECT * FROM emps<span class="p">;</span>
+--------+--------+---------+---------+----------------+--------+-------+---+
-| 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 |
+<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>
+--------+--------+---------+---------+----------------+--------+-------+---+
-</code></p>
+<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>
<p>Now JOIN and GROUP BY:</p>
-<p><code>bash
-sqlline> SELECT d.name, COUNT(*)
-. . . .> FROM emps AS e JOIN depts AS d ON e.deptno = d.deptno
-. . . .> GROUP BY d.name;
-+------------+---------+
-| NAME | EXPR$1 |
+<div class="highlight"><pre><code class="language-bash" data-lang="bash">sqlline> SELECT d.name, COUNT<span class="o">(</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>
+------------+---------+
-| Sales | 1 |
-| Marketing | 2 |
+<span class="p">|</span> NAME <span class="p">|</span> EXPR<span class="nv">$1</span> <span class="p">|</span>
+------------+---------+
-</code></p>
+<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>
<p>Last, the VALUES operator generates a single row, and is a convenient
way to test expressions and SQL built-in functions:</p>
-<p><code>bash
-sqlline> VALUES CHAR_LENGTH('Hello, ' || 'world!');
+<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>
+---------+
-| EXPR$0 |
+<span class="p">|</span> EXPR<span class="nv">$0</span> <span class="p">|</span>
+---------+
-| 13 |
-+---------+
-</code></p>
+<span class="p">|</span> <span class="m">13</span> <span class="p">|</span>
++---------+</code></pre></div>
<p>Calcite has many other SQL features. We donât have time to cover them
here. Write some more queries to experiment.</p>
@@ -757,113 +748,108 @@ 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>
-<p><code>json
-{
- version: '1.0',
- defaultSchema: 'SALES',
- schemas: [
- {
- name: 'SALES',
- type: 'custom',
- factory: 'org.apache.calcite.adapter.csv.CsvSchemaFactory',
- operand: {
- directory: 'target/test-classes/sales'
- }
- }
- ]
-}
-</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">'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>
<p>The model defines a single schema called âSALESâ. The schema is
powered by a plugin class,
-<a href="../example/csv/src/main/java/org/apache/calcite/adapter/csv/CsvSchemaFactory.java">org.apache.calcite.adapter.csv.CsvSchemaFactory</a>,
+<a href="http://github.com/apache/incubator-calcite/blob/master/example/csv/src/main/java/org/apache/calcite/adapter/csv/CsvSchemaFactory.java">org.apache.calcite.adapter.csv.CsvSchemaFactory</a>,
which is part of the
calcite-example-csv project and implements the Calcite interface
-<a href="http://www.hydromatic.net/calcite/apidocs/org/apache/calcite/schema/SchemaFactory.html">SchemaFactory</a>.
+<a href="/apidocs/org/apache/calcite/schema/SchemaFactory.html">SchemaFactory</a>.
Its <code>create</code> method instantiates a
schema, passing in the <code>directory</code> argument from the model file:</p>
-<p><code>java
-public Schema create(SchemaPlus parentSchema, String name,
- Map<String, Object> operand) {
- String directory = (String) operand.get("directory");
- String flavorName = (String) operand.get("flavor");
- CsvTable.Flavor flavor;
- if (flavorName == null) {
- flavor = CsvTable.Flavor.SCANNABLE;
- } else {
- flavor = CsvTable.Flavor.valueOf(flavorName.toUpperCase());
- }
- return new CsvSchema(
- new File(directory),
- flavor);
-}
-</code></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>
+ <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">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="n">flavor</span><span class="o">);</span>
+<span class="o">}</span></code></pre></div>
<p>Driven by the model, the schema factory instantiates a single schema
called âSALESâ. The schema is an instance of
-<a href="../example/csv/src/main/java/org/apache/calcite/adapter/csv/CsvSchema.java">org.apache.calcite.adapter.csv.CsvSchema</a>
-and implements the Calcite interface <a href="http://www.hydromatic.net/calcite/apidocs/org/apache/calcite/schema/Schema.html">Schema</a>.</p>
+<a href="http://github.com/apache/incubator-calcite/blob/master/example/csv/src/main/java/org/apache/calcite/adapter/csv/CsvSchema.java">org.apache.calcite.adapter.csv.CsvSchema</a>
+and implements the Calcite interface
+<a href="/calcite/apidocs/org/apache/calcite/schema/Schema.html">Schema</a>.</p>
<p>A schemaâs job is to produce a list of tables. (It can also list sub-schemas and
table-functions, but these are advanced features and calcite-example-csv does
not support them.) The tables implement Calciteâs
-<a href="http://www.hydromatic.net/calcite/apidocs/org/apache/calcite/schema/Table.html">Table</a>
+<a href="/apidocs/org/apache/calcite/schema/Table.html">Table</a>
interface. <code>CsvSchema</code> produces tables that are instances of
-<a href="../example/csv/src/main/java/org/apache/calcite/adapter/csv/CsvTable.java">CsvTable</a>
+<a href="http://github.com/apache/incubator-calcite/blob/master/example/csv/src/main/java/org/apache/calcite/adapter/csv/CsvTable.java">CsvTable</a>
and its sub-classes.</p>
<p>Here is the relevant code from <code>CsvSchema</code>, overriding the
-<code><a href="http://www.hydromatic.net/calcite/apidocs/org/apache/calcite/schema/impl/AbstractSchema.html#getTableMap()">getTableMap()</a></code>
+<code><a href="/apidocs/org/apache/calcite/schema/impl/AbstractSchema.html#getTableMap()">getTableMap()</a></code>
method in the <code>AbstractSchema</code> base class.</p>
-<p>```java
-protected Map<String, Table> getTableMap() {
- // Look for files in the directory ending in â.csvâ, â.csv.gzâ, â.jsonâ,
- // â.json.gzâ.
- File[] files = directoryFile.listFiles(
- new FilenameFilter() {
- public boolean accept(File dir, String name) {
- final String nameSansGz = trim(name, â.gzâ);
- return nameSansGz.endsWith(â.csvâ)
- || nameSansGz.endsWith(â.jsonâ);
- }
- });
- if (files == null) {
- System.out.println(âdirectory â + directoryFile + â not foundâ);
- files = new File[0];
- }
- // Build a map from table name to table; each file becomes a table.
- final ImmutableMap.Builder<String, Table> builder = ImmutableMap.builder();
- for (File file : files) {
- String tableName = trim(file.getName(), â.gzâ);
- final String tableNameSansJson = trimOrNull(tableName, â.jsonâ);
- if (tableNameSansJson != null) {
- JsonTable table = new JsonTable(file);
- builder.put(tableNameSansJson, table);
- continue;
- }
- tableName = trim(tableName, â.csvâ);
- final Table table = createTable(file);
- builder.put(tableName, table);
- }
- return builder.build();
-}</p>
-
-<p>/** Creates different sub-type of table based on the âflavorâ attribute. */
-private Table createTable(File file) {
- switch (flavor) {
- case TRANSLATABLE:
- return new CsvTranslatableTable(file, null);
- case SCANNABLE:
- return new CsvScannableTable(file, null);
- case FILTERABLE:
- return new CsvFilterableTable(file, null);
- default:
- throw new AssertionError(âUnknown flavor â + flavor);
- }
-}
-```</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>
+ <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="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">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="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">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="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="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">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">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">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="o">}</span>
+<span class="o">}</span></code></pre></div>
<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
@@ -891,29 +877,27 @@ clause that are not used in the final re
<p>Here is a schema that defines a view:</p>
-<p><code>json
-{
- version: '1.0',
- defaultSchema: 'SALES',
- schemas: [
- {
- name: 'SALES',
- type: 'custom',
- factory: 'org.apache.calcite.adapter.csv.CsvSchemaFactory',
- operand: {
- directory: 'target/test-classes/sales'
- },
- tables: [
- {
- name: 'FEMALE_EMPS',
- type: 'view',
- sql: 'SELECT * FROM emps WHERE gender = \'F\''
- }
- ]
- }
- ]
-}
-</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">'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>
<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.
@@ -924,27 +908,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>
-<p><code>json
- {
- name: 'FEMALE_EMPS',
- type: 'view',
- sql: [
- 'SELECT * FROM emps',
- 'WHERE gender = \'F\''
- ]
- }
-</code></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>
<p>Now we have defined a view, we can use it in queries just as if it were a table:</p>
-<p><code>sql
-sqlline> SELECT e.name, d.name FROM female_emps AS e JOIN depts AS d on e.deptno = d.deptno;
-+--------+------------+
-| NAME | NAME |
-+--------+------------+
-| Wilma | Marketing |
-+--------+------------+
-</code></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>
<h2 id="custom-tables">Custom tables</h2>
@@ -953,62 +933,56 @@ They donât need to live in a custom
<p>There is an example in <code>model-with-custom-table.json</code>:</p>
-<p><code>json
-{
- version: '1.0',
- defaultSchema: 'CUSTOM_TABLE',
- schemas: [
- {
- name: 'CUSTOM_TABLE',
- tables: [
- {
- name: 'EMPS',
- type: 'custom',
- factory: 'org.apache.calcite.adapter.csv.CsvTableFactory',
- operand: {
- file: 'target/test-classes/sales/EMPS.csv.gz',
- flavor: "scannable"
- }
- }
- ]
- }
- ]
-}
-</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>
<p>We can query the table in the usual way:</p>
-<p><code>sql
-sqlline> !connect jdbc:calcite:model=target/test-classes/model-with-custom-table.json admin admin
-sqlline> SELECT empno, name FROM custom_table.emps;
-+--------+--------+
-| EMPNO | NAME |
-+--------+--------+
-| 100 | Fred |
-| 110 | Eric |
-| 110 | John |
-| 120 | Wilma |
-| 130 | Alice |
-+--------+--------+
-</code></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>
+<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="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>
<p>The schema is a regular one, and contains a custom table powered by
-<a href="../example/csv/src/main/java/org/apache/calcite/adapter/csv/CsvTableFactory.java">org.apache.calcite.adapter.csv.CsvTableFactory</a>,
+<a href="http://github.com/apache/incubator-calcite/blob/master/example/csv/src/main/java/org/apache/calcite/adapter/csv/CsvTableFactory.java">org.apache.calcite.adapter.csv.CsvTableFactory</a>,
which implements the Calcite interface
-<a href="http://www.hydromatic.net/calcite/apidocs/org/apache/calcite/schema/TableFactory.html">TableFactory</a>.
+<a href="/apidocs/org/apache/calcite/schema/TableFactory.html">TableFactory</a>.
Its <code>create</code> method instantiates a <code>CsvScannableTable</code>,
passing in the <code>file</code> argument from the model file:</p>
-<p><code>java
-public CsvTable create(SchemaPlus schema, String name,
- Map<String, Object> map, RelDataType rowType) {
- String fileName = (String) map.get("file");
- final File file = new File(fileName);
- final RelProtoDataType protoRowType =
- rowType != null ? RelDataTypeImpl.proto(rowType) : null;
- return new CsvScannableTable(file, protoRowType);
-}
-</code></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>
+ <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="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>
<p>Implementing a custom table is often a simpler alternative to implementing
a custom schema. Both approaches might end up creating a similar implementation
@@ -1025,18 +999,16 @@ more control (say, providing different p
<p>Models can include comments using <code>/* ... */</code> and <code>//</code> syntax:</p>
-<p><code>json
-{
- version: '1.0',
- /* Multi-line
- comment. */
- defaultSchema: 'CUSTOM_TABLE',
- // Single-line comment.
- schemas: [
- ..
- ]
-}
-</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">/*</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>
<p>(Comments are not standard JSON, but are a harmless extension.)</p>
@@ -1061,98 +1033,92 @@ 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>
-<p><code>sql
-sqlline> !connect jdbc:calcite:model=target/test-classes/model.json admin admin
-sqlline> explain plan for select name from emps;
-+-----------------------------------------------------+
-| PLAN |
-+-----------------------------------------------------+
-| EnumerableCalcRel(expr#0..9=[{inputs}], NAME=[$t1]) |
-| EnumerableTableAccessRel(table=[[SALES, EMPS]]) |
-+-----------------------------------------------------+
-sqlline> !connect jdbc:calcite:model=target/test-classes/smart.json admin admin
-sqlline> explain plan for select name from emps;
-+-----------------------------------------------------+
-| PLAN |
-+-----------------------------------------------------+
-| EnumerableCalcRel(expr#0..9=[{inputs}], NAME=[$t1]) |
-| CsvTableScan(table=[[SALES, EMPS]]) |
-+-----------------------------------------------------+
-</code></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>
+<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="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="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="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>
<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>
-<p><code>json
-flavor: "translatable"
-</code></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>
<p>This causes a <code>CsvSchema</code> to be created with
<code>flavor = TRANSLATABLE</code>,
and its <code>createTable</code> method creates instances of
-<a href="../example/csv/src/main/java/org/apache/calcite/adapter/csv/CsvTranslatableTable.java">CsvTranslatableTable</a>
+<a href="http://github.com/apache/incubator-calcite/blob/master/example/csv/src/main/java/org/apache/calcite/adapter/csv/CsvTranslatableTable.java">CsvTranslatableTable</a>
rather than a <code>CsvScannableTable</code>.</p>
<p><code>CsvTranslatableTable</code> implements the
-<code><a href="http://www.hydromatic.net/calcite/apidocs/org/apache/calcite/schema/TranslatableTable.html#toRel()">TranslatableTable.toRel()</a></code>
+<code><a href="/apidocs/org/apache/calcite/schema/TranslatableTable.html#toRel()">TranslatableTable.toRel()</a></code>
method to create
-<a href="../example/csv/src/main/java/org/apache/calcite/adapter/csv/CsvTableScan.java">CsvTableScan</a>.
+<a href="http://github.com/apache/incubator-calcite/blob/master/example/csv/src/main/java/org/apache/calcite/adapter/csv/CsvTableScan.java">CsvTableScan</a>.
Table scans are the leaves of a query operator tree.
The usual implementation is
-<code><a href="http://www.hydromatic.net/calcite/apidocs/org/apache/calcite/adapter/enumerable/EnumerableTableScan.html">EnumerableTableScan</a></code>,
+<code><a href="/apidocs/org/apache/calcite/adapter/enumerable/EnumerableTableScan.html">EnumerableTableScan</a></code>,
but we have created a distinctive sub-type that will cause rules to fire.</p>
<p>Here is the rule in its entirety:</p>
-<p>```java
-public class CsvProjectTableScanRule extends RelOptRule {
- public static final CsvProjectTableScanRule INSTANCE =
- new CsvProjectTableScanRule();</p>
-
-<p>private CsvProjectTableScanRule() {
- super(
- operand(Project.class,
- operand(CsvTableScan.class, none())),
- âCsvProjectTableScanRuleâ);
- }</p>
-
-<p>@Override
- public void onMatch(RelOptRuleCall call) {
- final Project project = call.rel(0);
- final CsvTableScan scan = call.rel(1);
- int[] fields = getProjectFields(project.getProjects());
- if (fields == null) {
- // Project contains expressions more complex than just field references.
- return;
- }
- call.transformTo(
- new CsvTableScan(
- scan.getCluster(),
- scan.getTable(),
- scan.csvTable,
- fields));
- }</p>
-
-<p>private int[] getProjectFields(List<rexnode> exps) {
- final int[] fields = new int[exps.size()];
- for (int i = 0; i < exps.size(); i++) {
- final RexNode exp = exps.get(i);
- if (exp instanceof RexInputRef) {
- fields[i] = ((RexInputRef) exp).getIndex();
- } else {
- return null; // not a simple projection
- }
- }
- return fields;
- }
-}
-```</rexnode></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>
+ <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="kd">private</span> <span class="nf">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="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">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>
+ <span class="k">if</span> <span class="o">(</span><span class="n">fields</span> <span class="o">==</span> <span class="kc">null</span><span class="o">)</span> <span class="o">{</span>
+ <span class="c1">// Project contains expressions more complex than just field references.</span>
+ <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="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">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>
+ <span class="k">if</span> <span class="o">(</span><span class="n">exp</span> <span class="k">instanceof</span> <span class="n">RexInputRef</span><span class="o">)</span> <span class="o">{</span>
+ <span class="n">fields</span><span class="o">[</span><span class="n">i</span><span class="o">]</span> <span class="o">=</span> <span class="o">((</span><span class="n">RexInputRef</span><span class="o">)</span> <span class="n">exp</span><span class="o">).</span><span class="na">getIndex</span><span class="o">();</span>
+ <span class="o">}</span> <span class="k">else</span> <span class="o">{</span>
+ <span class="k">return</span> <span class="kc">null</span><span class="o">;</span> <span class="c1">// not a simple projection</span>
+ <span class="o">}</span>
+ <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>
<p>The constructor declares the pattern of relational expressions that will cause
the rule to fire.</p>
<p>The <code>onMatch</code> method generates a new relational expression and calls
-<code><a href="http://www.hydromatic.net/calcite/apidocs/org/apache/calcite/plan/RelOptRuleCall.html#transformTo(org.apache.calcite.rel.RelNode)">RelOptRuleCall.transformTo()</a></code>
+<code><a href="/apidocs/org/apache/calcite/plan/RelOptRuleCall.html#transformTo(org.apache.calcite.rel.RelNode)">RelOptRuleCall.transformTo()</a></code>
to indicate that the rule has fired successfully.</p>
<h2 id="the-query-optimization-process">The query optimization process</h2>
@@ -1196,25 +1162,23 @@ operator statistics it is based upon. Bu
<p>For example, this schema reads from a MySQL âfoodmartâ database:</p>
-<p><code>json
-{
- version: '1.0',
- defaultSchema: 'FOODMART',
- schemas: [
- {
- name: 'FOODMART',
- type: 'custom',
- factory: 'org.apache.calcite.adapter.jdbc.JdbcSchema$Factory',
- operand: {
- jdbcDriver: 'com.mysql.jdbc.Driver',
- jdbcUrl: 'jdbc:mysql://localhost/foodmart',
- jdbcUser: 'foodmart',
- jdbcPassword: 'foodmart'
- }
- }
- ]
-}
-</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">'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>
<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
@@ -1241,57 +1205,53 @@ those in-memory tables, effectively a ca
<p>For example, the following model reads tables from a MySQL
âfoodmartâ database:</p>
-<p><code>json
-{
- version: '1.0',
- defaultSchema: 'FOODMART_CLONE',
- schemas: [
- {
- name: 'FOODMART_CLONE',
- type: 'custom',
- factory: 'org.apache.calcite.adapter.clone.CloneSchema$Factory',
- operand: {
- jdbcDriver: 'com.mysql.jdbc.Driver',
- jdbcUrl: 'jdbc:mysql://localhost/foodmart',
- jdbcUser: 'foodmart',
- jdbcPassword: 'foodmart'
- }
- }
- ]
-}
-</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">'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>
<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>
-<p><code>json
-{
- version: '1.0',
- defaultSchema: 'FOODMART_CLONE',
- schemas: [
- {
- name: 'FOODMART',
- type: 'custom',
- factory: 'org.apache.calcite.adapter.jdbc.JdbcSchema$Factory',
- operand: {
- jdbcDriver: 'com.mysql.jdbc.Driver',
- jdbcUrl: 'jdbc:mysql://localhost/foodmart',
- jdbcUser: 'foodmart',
- jdbcPassword: 'foodmart'
- }
- },
- {
- name: 'FOODMART_CLONE',
- type: 'custom',
- factory: 'org.apache.calcite.adapter.clone.CloneSchema$Factory',
- operand: {
- source: 'FOODMART'
- }
- }
- ]
-}
-</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">'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>
<p>You can use this approach to create a clone schema on any type of
schema, not just JDBC.</p>
@@ -1345,13 +1305,6 @@ relational operators?</p>
<p>(To be written.)</p>
-<h2 id="further-resources">Further resources</h2>
-
-<ul>
- <li><a href="http://calcite.incubator.apache.org">Apache Calcite</a> home
-page</li>
-</ul>
-
Modified: incubator/calcite/site/news/2015/01/31/release-1.0.0-incubating/index.html
URL: http://svn.apache.org/viewvc/incubator/calcite/site/news/2015/01/31/release-1.0.0-incubating/index.html?rev=1682538&r1=1682537&r2=1682538&view=diff
==============================================================================
--- incubator/calcite/site/news/2015/01/31/release-1.0.0-incubating/index.html (original)
+++ incubator/calcite/site/news/2015/01/31/release-1.0.0-incubating/index.html Fri May 29 19:47:55 2015
@@ -95,6 +95,14 @@
<option value="/news/2015/01/31/release-1.0.0-incubating/">Release 1.0.0 Incubating</option>
+ <option value="/news/2014/11/05/release-0.9.2-incubating/">Release 0.9.2 Incubating</option>
+
+ <option value="/news/2014/10/02/release-0.9.1-incubating/">Release 0.9.1 Incubating</option>
+
+ <option value="/news/2014/08/19/release-0.9.0-incubating/">Release 0.9.0 Incubating</option>
+
+ <option value="/news/2014/06/27/release-0.8.0-incubating/">Release 0.8.0 Incubating</option>
+
</optgroup>
</select>
</div>
@@ -176,8 +184,9 @@ improvements to the algorithms that impl
including an interpreter that can evaluate queries without compilation;
and fixes about 30 bugs.</p>
-<p>See the <a href="/docs/history.html#v1-0-0">release notes</a>.</p>
-
+
+ <p>See the <a href="/docs/history.html#v1-0-0">release notes</a>.</p>
+
</div>
</article>
@@ -212,6 +221,10 @@ and fixes about 30 bugs.</p>
<a href="/news/2015/01/31/release-1.0.0-incubating/">1.0.0-incubating</a>
</li>
+ <li class="">
+ <a href="/news/2014/11/05/release-0.9.2-incubating/">0.9.2-incubating</a>
+ </li>
+
</ul>
<h4>Other News</h4>
<ul>
@@ -225,6 +238,14 @@ and fixes about 30 bugs.</p>
+
+
+
+
+
+
+
+
Modified: incubator/calcite/site/news/2015/03/13/release-1.1.0-incubating/index.html
URL: http://svn.apache.org/viewvc/incubator/calcite/site/news/2015/03/13/release-1.1.0-incubating/index.html?rev=1682538&r1=1682537&r2=1682538&view=diff
==============================================================================
--- incubator/calcite/site/news/2015/03/13/release-1.1.0-incubating/index.html (original)
+++ incubator/calcite/site/news/2015/03/13/release-1.1.0-incubating/index.html Fri May 29 19:47:55 2015
@@ -95,6 +95,14 @@
<option value="/news/2015/01/31/release-1.0.0-incubating/">Release 1.0.0 Incubating</option>
+ <option value="/news/2014/11/05/release-0.9.2-incubating/">Release 0.9.2 Incubating</option>
+
+ <option value="/news/2014/10/02/release-0.9.1-incubating/">Release 0.9.1 Incubating</option>
+
+ <option value="/news/2014/08/19/release-0.9.0-incubating/">Release 0.9.0 Incubating</option>
+
+ <option value="/news/2014/06/27/release-0.8.0-incubating/">Release 0.8.0 Incubating</option>
+
</optgroup>
</select>
</div>
@@ -175,8 +183,9 @@ later.</p>
<code>RelNode</code>. We strongly suggest that you use these rather than
calling constructors directly.</p>
-<p>See the <a href="/docs/history.html#v1-1-0">release notes</a>.</p>
-
+
+ <p>See the <a href="/docs/history.html#v1-1-0">release notes</a>.</p>
+
</div>
</article>
@@ -211,6 +220,10 @@ calling constructors directly.</p>
<a href="/news/2015/01/31/release-1.0.0-incubating/">1.0.0-incubating</a>
</li>
+ <li class="">
+ <a href="/news/2014/11/05/release-0.9.2-incubating/">0.9.2-incubating</a>
+ </li>
+
</ul>
<h4>Other News</h4>
<ul>
@@ -224,6 +237,14 @@ calling constructors directly.</p>
+
+
+
+
+
+
+
+
Modified: incubator/calcite/site/news/2015/04/07/release-1.2.0-incubating/index.html
URL: http://svn.apache.org/viewvc/incubator/calcite/site/news/2015/04/07/release-1.2.0-incubating/index.html?rev=1682538&r1=1682537&r2=1682538&view=diff
==============================================================================
--- incubator/calcite/site/news/2015/04/07/release-1.2.0-incubating/index.html (original)
+++ incubator/calcite/site/news/2015/04/07/release-1.2.0-incubating/index.html Fri May 29 19:47:55 2015
@@ -95,6 +95,14 @@
<option value="/news/2015/01/31/release-1.0.0-incubating/">Release 1.0.0 Incubating</option>
+ <option value="/news/2014/11/05/release-0.9.2-incubating/">Release 0.9.2 Incubating</option>
+
+ <option value="/news/2014/10/02/release-0.9.1-incubating/">Release 0.9.1 Incubating</option>
+
+ <option value="/news/2014/08/19/release-0.9.0-incubating/">Release 0.9.0 Incubating</option>
+
+ <option value="/news/2014/06/27/release-0.8.0-incubating/">Release 0.8.0 Incubating</option>
+
</optgroup>
</select>
</div>
@@ -175,8 +183,9 @@ distribution among relational expression
and [<a href="https://issues.apache.org/jira/browse/CALCITE-307">CALCITE-307</a>]
improve implicit and explicit conversions in SQL.</p>
-<p>See the <a href="/docs/history.html#v1-2-0">release notes</a>.</p>
-
+
+ <p>See the <a href="/docs/history.html#v1-2-0">release notes</a>.</p>
+
</div>
</article>
@@ -211,6 +220,10 @@ improve implicit and explicit conversion
<a href="/news/2015/01/31/release-1.0.0-incubating/">1.0.0-incubating</a>
</li>
+ <li class="">
+ <a href="/news/2014/11/05/release-0.9.2-incubating/">0.9.2-incubating</a>
+ </li>
+
</ul>
<h4>Other News</h4>
<ul>
@@ -224,6 +237,14 @@ improve implicit and explicit conversion
+
+
+
+
+
+
+
+
Modified: incubator/calcite/site/news/2015/04/24/new-committers/index.html
URL: http://svn.apache.org/viewvc/incubator/calcite/site/news/2015/04/24/new-committers/index.html?rev=1682538&r1=1682537&r2=1682538&view=diff
==============================================================================
--- incubator/calcite/site/news/2015/04/24/new-committers/index.html (original)
+++ incubator/calcite/site/news/2015/04/24/new-committers/index.html Fri May 29 19:47:55 2015
@@ -95,6 +95,14 @@
<option value="/news/2015/01/31/release-1.0.0-incubating/">Release 1.0.0 Incubating</option>
+ <option value="/news/2014/11/05/release-0.9.2-incubating/">Release 0.9.2 Incubating</option>
+
+ <option value="/news/2014/10/02/release-0.9.1-incubating/">Release 0.9.1 Incubating</option>
+
+ <option value="/news/2014/08/19/release-0.9.0-incubating/">Release 0.9.0 Incubating</option>
+
+ <option value="/news/2014/06/27/release-0.8.0-incubating/">Release 0.8.0 Incubating</option>
+
</optgroup>
</select>
</div>
@@ -172,6 +180,7 @@ committers for their work on Calcite. We
<li>Nick Dimiduk</li>
</ul>
+
</div>
</article>
@@ -206,6 +215,10 @@ committers for their work on Calcite. We
<a href="/news/2015/01/31/release-1.0.0-incubating/">1.0.0-incubating</a>
</li>
+ <li class="">
+ <a href="/news/2014/11/05/release-0.9.2-incubating/">0.9.2-incubating</a>
+ </li>
+
</ul>
<h4>Other News</h4>
<ul>
@@ -219,6 +232,14 @@ committers for their work on Calcite. We
+
+
+
+
+
+
+
+
Modified: incubator/calcite/site/news/2015/05/29/release-1.3.0-incubating/index.html
URL: http://svn.apache.org/viewvc/incubator/calcite/site/news/2015/05/29/release-1.3.0-incubating/index.html?rev=1682538&r1=1682537&r2=1682538&view=diff
==============================================================================
--- incubator/calcite/site/news/2015/05/29/release-1.3.0-incubating/index.html (original)
+++ incubator/calcite/site/news/2015/05/29/release-1.3.0-incubating/index.html Fri May 29 19:47:55 2015
@@ -95,6 +95,14 @@
<option value="/news/2015/01/31/release-1.0.0-incubating/">Release 1.0.0 Incubating</option>
+ <option value="/news/2014/11/05/release-0.9.2-incubating/">Release 0.9.2 Incubating</option>
+
+ <option value="/news/2014/10/02/release-0.9.1-incubating/">Release 0.9.1 Incubating</option>
+
+ <option value="/news/2014/08/19/release-0.9.0-incubating/">Release 0.9.0 Incubating</option>
+
+ <option value="/news/2014/06/27/release-0.8.0-incubating/">Release 0.8.0 Incubating</option>
+
</optgroup>
</select>
</div>
@@ -167,8 +175,9 @@ and
<a href="https://issues.apache.org/jira/browse/CALCITE-704">filtered aggregate functions</a>
and various improvements to Avatica.</p>
-<p>See the <a href="/docs/history.html#v1-3-0">release notes</a>.</p>
-
+
+ <p>See the <a href="/docs/history.html#v1-3-0">release notes</a>.</p>
+
</div>
</article>
@@ -203,6 +212,10 @@ and various improvements to Avatica.</p>
<a href="/news/2015/01/31/release-1.0.0-incubating/">1.0.0-incubating</a>
</li>
+ <li class="">
+ <a href="/news/2014/11/05/release-0.9.2-incubating/">0.9.2-incubating</a>
+ </li>
+
</ul>
<h4>Other News</h4>
<ul>
@@ -216,6 +229,14 @@ and various improvements to Avatica.</p>
+
+
+
+
+
+
+
+
Modified: incubator/calcite/site/news/index.html
URL: http://svn.apache.org/viewvc/incubator/calcite/site/news/index.html?rev=1682538&r1=1682537&r2=1682538&view=diff
==============================================================================
--- incubator/calcite/site/news/index.html (original)
+++ incubator/calcite/site/news/index.html Fri May 29 19:47:55 2015
@@ -95,6 +95,14 @@
<option value="/news/2015/01/31/release-1.0.0-incubating/">Release 1.0.0 Incubating</option>
+ <option value="/news/2014/11/05/release-0.9.2-incubating/">Release 0.9.2 Incubating</option>
+
+ <option value="/news/2014/10/02/release-0.9.1-incubating/">Release 0.9.1 Incubating</option>
+
+ <option value="/news/2014/08/19/release-0.9.0-incubating/">Release 0.9.0 Incubating</option>
+
+ <option value="/news/2014/06/27/release-0.8.0-incubating/">Release 0.8.0 Incubating</option>
+
</optgroup>
</select>
</div>
@@ -169,8 +177,9 @@ and
<a href="https://issues.apache.org/jira/browse/CALCITE-704">filtered aggregate functions</a>
and various improvements to Avatica.</p>
-<p>See the <a href="/docs/history.html#v1-3-0">release notes</a>.</p>
-
+
+ <p>See the <a href="/docs/history.html#v1-3-0">release notes</a>.</p>
+
</div>
</article>
@@ -247,6 +256,7 @@ committers for their work on Calcite. We
<li>Nick Dimiduk</li>
</ul>
+
</div>
</article>
@@ -326,8 +336,9 @@ distribution among relational expression
and [<a href="https://issues.apache.org/jira/browse/CALCITE-307">CALCITE-307</a>]
improve implicit and explicit conversions in SQL.</p>
-<p>See the <a href="/docs/history.html#v1-2-0">release notes</a>.</p>
-
+
+ <p>See the <a href="/docs/history.html#v1-2-0">release notes</a>.</p>
+
</div>
</article>
@@ -407,8 +418,9 @@ later.</p>
<code>RelNode</code>. We strongly suggest that you use these rather than
calling constructors directly.</p>
-<p>See the <a href="/docs/history.html#v1-1-0">release notes</a>.</p>
-
+
+ <p>See the <a href="/docs/history.html#v1-1-0">release notes</a>.</p>
+
</div>
</article>
@@ -489,8 +501,292 @@ improvements to the algorithms that impl
including an interpreter that can evaluate queries without compilation;
and fixes about 30 bugs.</p>
-<p>See the <a href="/docs/history.html#v1-0-0">release notes</a>.</p>
+
+ <p>See the <a href="/docs/history.html#v1-0-0">release notes</a>.</p>
+
+ </div>
+</article>
+
+
+ <article>
+ <h2>
+ <a href="/news/2014/11/05/release-0.9.2-incubating/">
+ Release 0.9.2 Incubating
+ </a>
+ </h2>
+ <span class="post-category">
+ <span class="label">
+ release
+ </span>
+ </span>
+ <div class="post-meta">
+ <span class="post-date">
+ 05 Nov 2014
+ </span>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ <a href="http://people.apache.org/~jhyde" class="post-author">
+ <img src="http://github.com/julianhyde.png"
+ class="avatar" alt="jhyde avatar"
+ width="24" height="24">
+ jhyde
+ </a>
+ </div>
+ <div class="post-content">
+ <p>A fairly minor release, and last release before we rename all of the
+packages and lots of classes, in what we expect to call 1.0. If you
+have an existing application, itâs worth upgrading to this first,
+before you move on to 1.0.</p>
+
+
+ <p>See the <a href="/docs/history.html#v0-9-2">release notes</a>.</p>
+
+ </div>
+</article>
+
+
+ <article>
+ <h2>
+ <a href="/news/2014/10/02/release-0.9.1-incubating/">
+ Release 0.9.1 Incubating
+ </a>
+ </h2>
+ <span class="post-category">
+ <span class="label">
+ release
+ </span>
+ </span>
+ <div class="post-meta">
+ <span class="post-date">
+ 02 Oct 2014
+ </span>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ <a href="http://people.apache.org/~jhyde" class="post-author">
+ <img src="http://github.com/julianhyde.png"
+ class="avatar" alt="jhyde avatar"
+ width="24" height="24">
+ jhyde
+ </a>
+ </div>
+ <div class="post-content">
+ <p>This is the first release as Calcite. (The project was previously called Optiq.)</p>
+
+
+ <p>See the <a href="/docs/history.html#v0-9-1">release notes</a>.</p>
+
+ </div>
+</article>
+
+
+ <article>
+ <h2>
+ <a href="/news/2014/08/19/release-0.9.0-incubating/">
+ Release 0.9.0 Incubating
+ </a>
+ </h2>
+ <span class="post-category">
+ <span class="label">
+ release
+ </span>
+ </span>
+ <div class="post-meta">
+ <span class="post-date">
+ 19 Aug 2014
+ </span>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ <a href="http://people.apache.org/~jhyde" class="post-author">
+ <img src="http://github.com/julianhyde.png"
+ class="avatar" alt="jhyde avatar"
+ width="24" height="24">
+ jhyde
+ </a>
+ </div>
+ <div class="post-content">
+ <p>This is the first release under the Apache incubator process.</p>
+
+ <p>See the <a href="/docs/history.html#v0-9-0">release notes</a>.</p>
+
+ </div>
+</article>
+
+
+ <article>
+ <h2>
+ <a href="/news/2014/06/27/release-0.8.0-incubating/">
+ Release 0.8.0 Incubating
+ </a>
+ </h2>
+ <span class="post-category">
+ <span class="label">
+ release
+ </span>
+ </span>
+ <div class="post-meta">
+ <span class="post-date">
+ 27 Jun 2014
+ </span>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ <a href="http://people.apache.org/~jhyde" class="post-author">
+ <img src="http://github.com/julianhyde.png"
+ class="avatar" alt="jhyde avatar"
+ width="24" height="24">
+ jhyde
+ </a>
+ </div>
+ <div class="post-content">
+ <p>This is the first release under the Apache incubator process.</p>
+
+
+ <p>See the <a href="/docs/history.html#v0-8">release notes</a>.</p>
+
</div>
</article>
@@ -536,6 +832,10 @@ of the website.</p>
<a href="/news/2015/01/31/release-1.0.0-incubating/">1.0.0-incubating</a>
</li>
+ <li class="">
+ <a href="/news/2014/11/05/release-0.9.2-incubating/">0.9.2-incubating</a>
+ </li>
+
</ul>
<h4>Other News</h4>
<ul>
@@ -549,6 +849,14 @@ of the website.</p>
+
+
+
+
+
+
+
+
Modified: incubator/calcite/site/news/releases/index.html
URL: http://svn.apache.org/viewvc/incubator/calcite/site/news/releases/index.html?rev=1682538&r1=1682537&r2=1682538&view=diff
==============================================================================
--- incubator/calcite/site/news/releases/index.html (original)
+++ incubator/calcite/site/news/releases/index.html Fri May 29 19:47:55 2015
@@ -95,6 +95,14 @@
<option value="/news/2015/01/31/release-1.0.0-incubating/">Release 1.0.0 Incubating</option>
+ <option value="/news/2014/11/05/release-0.9.2-incubating/">Release 0.9.2 Incubating</option>
+
+ <option value="/news/2014/10/02/release-0.9.1-incubating/">Release 0.9.1 Incubating</option>
+
+ <option value="/news/2014/08/19/release-0.9.0-incubating/">Release 0.9.0 Incubating</option>
+
+ <option value="/news/2014/06/27/release-0.8.0-incubating/">Release 0.8.0 Incubating</option>
+
</optgroup>
</select>
</div>
@@ -169,8 +177,9 @@ and
<a href="https://issues.apache.org/jira/browse/CALCITE-704">filtered aggregate functions</a>
and various improvements to Avatica.</p>
-<p>See the <a href="/docs/history.html#v1-3-0">release notes</a>.</p>
-
+
+ <p>See the <a href="/docs/history.html#v1-3-0">release notes</a>.</p>
+
</div>
</article>
@@ -250,8 +259,9 @@ distribution among relational expression
and [<a href="https://issues.apache.org/jira/browse/CALCITE-307">CALCITE-307</a>]
improve implicit and explicit conversions in SQL.</p>
-<p>See the <a href="/docs/history.html#v1-2-0">release notes</a>.</p>
-
+
+ <p>See the <a href="/docs/history.html#v1-2-0">release notes</a>.</p>
+
</div>
</article>
@@ -331,8 +341,9 @@ later.</p>
<code>RelNode</code>. We strongly suggest that you use these rather than
calling constructors directly.</p>
-<p>See the <a href="/docs/history.html#v1-1-0">release notes</a>.</p>
-
+
+ <p>See the <a href="/docs/history.html#v1-1-0">release notes</a>.</p>
+
</div>
</article>
@@ -413,8 +424,292 @@ improvements to the algorithms that impl
including an interpreter that can evaluate queries without compilation;
and fixes about 30 bugs.</p>
-<p>See the <a href="/docs/history.html#v1-0-0">release notes</a>.</p>
+
+ <p>See the <a href="/docs/history.html#v1-0-0">release notes</a>.</p>
+
+ </div>
+</article>
+
+ <article>
+ <h2>
+ <a href="/news/2014/11/05/release-0.9.2-incubating/">
+ Release 0.9.2 Incubating
+ </a>
+ </h2>
+ <span class="post-category">
+ <span class="label">
+ release
+ </span>
+ </span>
+ <div class="post-meta">
+ <span class="post-date">
+ 05 Nov 2014
+ </span>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ <a href="http://people.apache.org/~jhyde" class="post-author">
+ <img src="http://github.com/julianhyde.png"
+ class="avatar" alt="jhyde avatar"
+ width="24" height="24">
+ jhyde
+ </a>
+ </div>
+ <div class="post-content">
+ <p>A fairly minor release, and last release before we rename all of the
+packages and lots of classes, in what we expect to call 1.0. If you
+have an existing application, itâs worth upgrading to this first,
+before you move on to 1.0.</p>
+
+
+ <p>See the <a href="/docs/history.html#v0-9-2">release notes</a>.</p>
+
+ </div>
+</article>
+
+
+ <article>
+ <h2>
+ <a href="/news/2014/10/02/release-0.9.1-incubating/">
+ Release 0.9.1 Incubating
+ </a>
+ </h2>
+ <span class="post-category">
+ <span class="label">
+ release
+ </span>
+ </span>
+ <div class="post-meta">
+ <span class="post-date">
+ 02 Oct 2014
+ </span>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ <a href="http://people.apache.org/~jhyde" class="post-author">
+ <img src="http://github.com/julianhyde.png"
+ class="avatar" alt="jhyde avatar"
+ width="24" height="24">
+ jhyde
+ </a>
+ </div>
+ <div class="post-content">
+ <p>This is the first release as Calcite. (The project was previously called Optiq.)</p>
+
+
+ <p>See the <a href="/docs/history.html#v0-9-1">release notes</a>.</p>
+
+ </div>
+</article>
+
+
+ <article>
+ <h2>
+ <a href="/news/2014/08/19/release-0.9.0-incubating/">
+ Release 0.9.0 Incubating
+ </a>
+ </h2>
+ <span class="post-category">
+ <span class="label">
+ release
+ </span>
+ </span>
+ <div class="post-meta">
+ <span class="post-date">
+ 19 Aug 2014
+ </span>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ <a href="http://people.apache.org/~jhyde" class="post-author">
+ <img src="http://github.com/julianhyde.png"
+ class="avatar" alt="jhyde avatar"
+ width="24" height="24">
+ jhyde
+ </a>
+ </div>
+ <div class="post-content">
+ <p>This is the first release under the Apache incubator process.</p>
+
+
+ <p>See the <a href="/docs/history.html#v0-9-0">release notes</a>.</p>
+
+ </div>
+</article>
+
+
+ <article>
+ <h2>
+ <a href="/news/2014/06/27/release-0.8.0-incubating/">
+ Release 0.8.0 Incubating
+ </a>
+ </h2>
+ <span class="post-category">
+ <span class="label">
+ release
+ </span>
+ </span>
+ <div class="post-meta">
+ <span class="post-date">
+ 27 Jun 2014
+ </span>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ <a href="http://people.apache.org/~jhyde" class="post-author">
+ <img src="http://github.com/julianhyde.png"
+ class="avatar" alt="jhyde avatar"
+ width="24" height="24">
+ jhyde
+ </a>
+ </div>
+ <div class="post-content">
+ <p>This is the first release under the Apache incubator process.</p>
+
+
+ <p>See the <a href="/docs/history.html#v0-8">release notes</a>.</p>
+
</div>
</article>
@@ -451,6 +746,10 @@ and fixes about 30 bugs.</p>
<a href="/news/2015/01/31/release-1.0.0-incubating/">1.0.0-incubating</a>
</li>
+ <li class="">
+ <a href="/news/2014/11/05/release-0.9.2-incubating/">0.9.2-incubating</a>
+ </li>
+
</ul>
<h4>Other News</h4>
<ul>
@@ -464,6 +763,14 @@ and fixes about 30 bugs.</p>
+
+
+
+
+
+
+
+