| <!DOCTYPE HTML> |
| <html lang="en-US"> |
| <head> |
| <meta charset="UTF-8"> |
| <title>Algebra builder</title> |
| <meta name="viewport" content="width=device-width,initial-scale=1"> |
| <meta name="generator" content="Jekyll v3.7.3"> |
| <link rel="stylesheet" href="//fonts.googleapis.com/css?family=Lato:300,300italic,400,400italic,700,700italic,900"> |
| <link rel="stylesheet" href="/css/screen.css"> |
| <link rel="icon" type="image/x-icon" href="/favicon.ico"> |
| <!--[if lt IE 9]> |
| <script src="/js/html5shiv.min.js"></script> |
| <script src="/js/respond.min.js"></script> |
| <![endif]--> |
| </head> |
| |
| |
| <body class="wrap"> |
| <header role="banner"> |
| <div class="grid"> |
| <div class="unit center-on-mobiles"> |
| <h1> |
| <a href="/"> |
| <span class="sr-only">Apache Calcite</span> |
| <img src="/img/logo.svg" alt="Calcite Logo"> |
| </a> |
| </h1> |
| </div> |
| <nav class="main-nav"> |
| <ul> |
| <li class=""> |
| <a href="/">Home</a> |
| </li> |
| <li class=""> |
| <a href="/downloads/">Download</a> |
| </li> |
| <li class=""> |
| <a href="/community/">Community</a> |
| </li> |
| <li class=""> |
| <a href="/develop/">Develop</a> |
| </li> |
| <li class="current"> |
| <a href="/news/">News</a> |
| </li> |
| <li class=""> |
| <a href="/docs/">Docs</a> |
| </li> |
| </ul> |
| |
| </nav> |
| </div> |
| </header> |
| |
| |
| <section class="news"> |
| <div class="grid"> |
| |
| <div class="docs-nav-mobile unit whole show-on-mobiles"> |
| <select onchange="if (this.value) window.location.href=this.value"> |
| <option value="">Navigate the blog…</option> |
| <option value="/news/">Home</option> |
| <optgroup label="v1.x"> |
| <option value="/news/2019/09/11/release-1.21.0/">Release 1.21.0</option> |
| <option value="/news/2019/06/24/release-1.20.0/">Release 1.20.0</option> |
| <option value="/news/2019/03/25/release-1.19.0/">Release 1.19.0</option> |
| <option value="/news/2018/12/21/release-1.18.0/">Release 1.18.0</option> |
| <option value="/news/2018/07/20/release-1.17.0/">Release 1.17.0</option> |
| <option value="/news/2018/03/19/release-1.16.0/">Release 1.16.0</option> |
| <option value="/news/2017/12/11/release-1.15.0/">Release 1.15.0</option> |
| <option value="/news/2017/10/02/release-1.14.0/">Release 1.14.0</option> |
| <option value="/news/2017/06/26/release-1.13.0/">Release 1.13.0</option> |
| <option value="/news/2017/03/31/new-avatica-repository/">New Avatica Repository</option> |
| <option value="/news/2017/03/24/release-1.12.0/">Release 1.12.0</option> |
| <option value="/news/2017/01/09/release-1.11.0/">Release 1.11.0</option> |
| <option value="/news/2016/10/12/release-1.10.0/">Release 1.10.0</option> |
| <option value="/news/2016/09/22/release-1.9.0/">Release 1.9.0</option> |
| <option value="/news/2016/06/13/release-1.8.0/">Release 1.8.0</option> |
| <option value="/news/2016/03/22/cassandra-adapter/">Cassandra Adapter</option> |
| <option value="/news/2016/03/22/release-1.7.0/">Release 1.7.0</option> |
| <option value="/news/2016/02/17/streaming-sql-talk/">Streaming SQL in Samza</option> |
| <option value="/news/2016/02/17/elser-pmc/">Calcite appoints Josh Elser to PMC</option> |
| <option value="/news/2016/01/22/release-1.6.0/">Release 1.6.0</option> |
| <option value="/news/2015/11/10/release-1.5.0/">Release 1.5.0</option> |
| <option value="/news/2015/11/08/new-committers/">Calcite adds 2 committers</option> |
| <option value="/news/2015/10/22/calcite-graduates/">Calcite Graduates</option> |
| <option value="/news/2015/09/02/release-1.4.0-incubating/">Release 1.4.0 Incubating</option> |
| <option value="/news/2015/07/31/xldb-best-lightning-talk/">XLDB 2015 best lightning talk</option> |
| <option value="/news/2015/06/05/algebra-builder/">Algebra builder</option> |
| <option value="/news/2015/05/30/release-1.3.0-incubating/">Release 1.3.0 Incubating</option> |
| <option value="/news/2015/04/24/new-committers/">Calcite adds 5 committers</option> |
| <option value="/news/2015/04/07/release-1.2.0-incubating/">Release 1.2.0 Incubating</option> |
| <option value="/news/2015/03/13/release-1.1.0-incubating/">Release 1.1.0 Incubating</option> |
| <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> |
| |
| |
| <div class="unit four-fifths"> |
| <article> |
| <h2> |
| Algebra builder |
| <a href="/news/2015/06/05/algebra-builder/" class="permalink" title="Permalink">∞</a> |
| </h2> |
| <span class="post-category"> |
| <span class="label"> |
| new features |
| </span> |
| </span> |
| <div class="post-meta"> |
| <span class="post-date"> |
| 05 Jun 2015 |
| </span> |
| |
| |
| |
| <a href="http://people.apache.org/~jhyde" class="post-author"> |
| <img src="https://github.com/julianhyde.png" |
| class="avatar" alt="jhyde avatar" |
| width="24" height="24"> |
| jhyde |
| </a> |
| </div> |
| <div class="post-content"> |
| <!-- |
| |
| --> |
| |
| <p>Calcite’s foundation is a comprehensive implementation of relational |
| algebra (together with transformation rules, cost model, and metadata) |
| but to create algebra expressions you had to master a complex API.</p> |
| |
| <p>We’re solving this problem by introducing an |
| <a href="/apidocs/org/apache/calcite/tools/RelBuilder.html">algebra builder</a>, |
| a single class with all the methods you need to build any relational |
| expression.</p> |
| |
| <p>For example,</p> |
| |
| <figure class="highlight"><pre><code class="language-java" data-lang="java"><span class="kd">final</span> <span class="n">FrameworkConfig</span> <span class="n">config</span><span class="o">;</span> |
| <span class="kd">final</span> <span class="n">RelBuilder</span> <span class="n">builder</span> <span class="o">=</span> <span class="n">RelBuilder</span><span class="o">.</span><span class="na">create</span><span class="o">(</span><span class="n">config</span><span class="o">);</span> |
| <span class="kd">final</span> <span class="n">RelNode</span> <span class="n">node</span> <span class="o">=</span> <span class="n">builder</span> |
| <span class="o">.</span><span class="na">scan</span><span class="o">(</span><span class="s">"EMP"</span><span class="o">)</span> |
| <span class="o">.</span><span class="na">aggregate</span><span class="o">(</span><span class="n">builder</span><span class="o">.</span><span class="na">groupKey</span><span class="o">(</span><span class="s">"DEPTNO"</span><span class="o">),</span> |
| <span class="n">builder</span><span class="o">.</span><span class="na">count</span><span class="o">(</span><span class="kc">false</span><span class="o">,</span> <span class="s">"C"</span><span class="o">),</span> |
| <span class="n">builder</span><span class="o">.</span><span class="na">sum</span><span class="o">(</span><span class="kc">false</span><span class="o">,</span> <span class="s">"S"</span><span class="o">,</span> <span class="n">builder</span><span class="o">.</span><span class="na">field</span><span class="o">(</span><span class="s">"SAL"</span><span class="o">)))</span> |
| <span class="o">.</span><span class="na">filter</span><span class="o">(</span> |
| <span class="n">builder</span><span class="o">.</span><span class="na">call</span><span class="o">(</span><span class="n">SqlStdOperatorTable</span><span class="o">.</span><span class="na">GREATER_THAN</span><span class="o">,</span> |
| <span class="n">builder</span><span class="o">.</span><span class="na">field</span><span class="o">(</span><span class="s">"C"</span><span class="o">),</span> |
| <span class="n">builder</span><span class="o">.</span><span class="na">literal</span><span class="o">(</span><span class="mi">10</span><span class="o">)))</span> |
| <span class="o">.</span><span class="na">build</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="n">RelOptUtil</span><span class="o">.</span><span class="na">toString</span><span class="o">(</span><span class="n">node</span><span class="o">));</span></code></pre></figure> |
| |
| <p>creates the algebra</p> |
| |
| <figure class="highlight"><pre><code class="language-text" data-lang="text">LogicalFilter(condition=[>($1, 10)]) |
| LogicalAggregate(group=[{7}], C=[COUNT()], S=[SUM($5)]) |
| LogicalTableScan(table=[[scott, EMP]])</code></pre></figure> |
| |
| <p>which is equivalent to the SQL</p> |
| |
| <figure class="highlight"><pre><code class="language-sql" data-lang="sql"><span class="k">SELECT</span> <span class="n">deptno</span><span class="p">,</span> <span class="k">count</span><span class="p">(</span><span class="o">*</span><span class="p">)</span> <span class="k">AS</span> <span class="k">c</span><span class="p">,</span> <span class="k">sum</span><span class="p">(</span><span class="n">sal</span><span class="p">)</span> <span class="k">AS</span> <span class="n">s</span> |
| <span class="k">FROM</span> <span class="n">emp</span> |
| <span class="k">GROUP</span> <span class="k">BY</span> <span class="n">deptno</span> |
| <span class="k">HAVING</span> <span class="k">count</span><span class="p">(</span><span class="o">*</span><span class="p">)</span> <span class="o">></span> <span class="mi">10</span></code></pre></figure> |
| |
| <p>The <a href="/docs/algebra.html">algebra builder documentation</a> describes the |
| full API and has lots of examples.</p> |
| |
| <p>We’re still working on the algebra builder, but plan to release it |
| with Calcite 1.4 (see |
| [<a href="https://issues.apache.org/jira/browse/CALCITE-748">CALCITE-748</a>]).</p> |
| |
| <p>The algebra builder will make some existing tasks easier (such as |
| writing planner rules), but will also enable new things, such as |
| writing applications directly on top of Calcite, or implementing |
| non-SQL query languages. These applications and languages will be able |
| to take advantage of Calcite’s existing back-ends (including |
| Hive-on-Tez, Drill, MongoDB, Splunk, Spark, JDBC data sources) and |
| extensive set of query-optimization rules.</p> |
| |
| <p>If you have questions or comments, please post to the |
| <a href="/develop">mailing list</a>.</p> |
| |
| |
| </div> |
| </article> |
| |
| </div> |
| |
| <div class="unit one-fifth hide-on-mobiles"> |
| <aside> |
| <ul> |
| <li class=""> |
| <a href="/news/">All News</a> |
| </li> |
| <li class=""> |
| <a href="/news/releases/">Calcite Releases</a> |
| </li> |
| </ul> |
| <h4>Recent Releases</h4> |
| <ul> |
| |
| <li class=""> |
| <a href="/news/2019/09/11/release-1.21.0/">1.21.0</a> |
| </li> |
| |
| <li class=""> |
| <a href="/news/2019/06/24/release-1.20.0/">1.20.0</a> |
| </li> |
| |
| <li class=""> |
| <a href="/news/2019/03/25/release-1.19.0/">1.19.0</a> |
| </li> |
| |
| <li class=""> |
| <a href="/news/2018/12/21/release-1.18.0/">1.18.0</a> |
| </li> |
| |
| <li class=""> |
| <a href="/news/2018/07/20/release-1.17.0/">1.17.0</a> |
| </li> |
| |
| </ul> |
| <h4>Other News</h4> |
| <ul> |
| |
| <li class=""> |
| <a href="/news/2017/03/31/new-avatica-repository/">New Avatica Repository</a> |
| </li> |
| |
| <li class=""> |
| <a href="/news/2016/03/22/cassandra-adapter/">Cassandra Adapter</a> |
| </li> |
| |
| <li class=""> |
| <a href="/news/2016/02/17/streaming-sql-talk/">Streaming SQL in Samza</a> |
| </li> |
| |
| <li class=""> |
| <a href="/news/2016/02/17/elser-pmc/">Calcite appoints Josh Elser to PMC</a> |
| </li> |
| |
| <li class=""> |
| <a href="/news/2015/11/08/new-committers/">Calcite adds 2 committers</a> |
| </li> |
| |
| <li class=""> |
| <a href="/news/2015/10/22/calcite-graduates/">Calcite Graduates</a> |
| </li> |
| |
| <li class=""> |
| <a href="/news/2015/07/31/xldb-best-lightning-talk/">XLDB 2015 best lightning talk</a> |
| </li> |
| |
| <li class="current"> |
| <a href="/news/2015/06/05/algebra-builder/">Algebra builder</a> |
| </li> |
| |
| <li class=""> |
| <a href="/news/2015/04/24/new-committers/">Calcite adds 5 committers</a> |
| </li> |
| |
| </ul> |
| </aside> |
| </div> |
| |
| |
| <div class="clear"></div> |
| |
| </div> |
| </section> |
| |
| |
| <footer role="contentinfo"> |
| <div id="poweredby"> |
| <a href="http://www.apache.org/"> |
| <span class="sr-only">Apache</span> |
| <img src="/img/feather.png" width="190" height="77" alt="Apache Logo"></a> |
| </div> |
| <div id="copyright"> |
| <p>The contents of this website are Copyright © 2019 |
| <a href="https://www.apache.org/">Apache Software Foundation</a> |
| under the terms of |
| the <a href="https://www.apache.org/licenses/"> |
| Apache License v2</a>. Apache Calcite and its logo are |
| trademarks of the Apache Software Foundation.</p> |
| </div> |
| </footer> |
| |
| <script> |
| var anchorForId = function (id) { |
| var anchor = document.createElement("a"); |
| anchor.className = "header-link"; |
| anchor.href = "#" + id; |
| anchor.innerHTML = "<span class=\"sr-only\">Permalink</span><i class=\"fa fa-link\"></i>"; |
| anchor.title = "Permalink"; |
| return anchor; |
| }; |
| |
| var linkifyAnchors = function (level, containingElement) { |
| var headers = containingElement.getElementsByTagName("h" + level); |
| for (var h = 0; h < headers.length; h++) { |
| var header = headers[h]; |
| |
| if (typeof header.id !== "undefined" && header.id !== "") { |
| header.appendChild(anchorForId(header.id)); |
| } |
| } |
| }; |
| |
| document.onreadystatechange = function () { |
| if (this.readyState === "complete") { |
| var contentBlock = document.getElementsByClassName("docs")[0] || document.getElementsByClassName("news")[0]; |
| if (!contentBlock) { |
| return; |
| } |
| for (var level = 1; level <= 6; level++) { |
| linkifyAnchors(level, contentBlock); |
| } |
| } |
| }; |
| </script> |
| |
| |
| </body> |
| </html> |