blob: 7133cae5fe11f263009518a208b6bc2ca48faea7 [file] [log] [blame]
<!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="http://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=[&gt;($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">&gt;</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 &copy;&nbsp;2019
<a href="https://www.apache.org/">Apache Software Foundation</a>
under the terms of
the <a href="https://www.apache.org/licenses/">
Apache&nbsp;License&nbsp;v2</a>. Apache Calcite and its logo are
trademarks of the Apache Software Foundation.</p>
</div>
</footer>
<script>
var anchorForId = function (id) {
var anchor = document.createElement("a");
anchor.className = "header-link";
anchor.href = "#" + id;
anchor.innerHTML = "<span class=\"sr-only\">Permalink</span><i class=\"fa fa-link\"></i>";
anchor.title = "Permalink";
return anchor;
};
var linkifyAnchors = function (level, containingElement) {
var headers = containingElement.getElementsByTagName("h" + level);
for (var h = 0; h < headers.length; h++) {
var header = headers[h];
if (typeof header.id !== "undefined" && header.id !== "") {
header.appendChild(anchorForId(header.id));
}
}
};
document.onreadystatechange = function () {
if (this.readyState === "complete") {
var contentBlock = document.getElementsByClassName("docs")[0] || document.getElementsByClassName("news")[0];
if (!contentBlock) {
return;
}
for (var level = 1; level <= 6; level++) {
linkifyAnchors(level, contentBlock);
}
}
};
</script>
</body>
</html>