blob: 7ca6b254cb7c7ee6f399a2eb96d9321b894694e9 [file] [log] [blame]
<!DOCTYPE HTML>
<html lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta charset="UTF-8">
<title>Release 1.28.0</title>
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="generator" content="Jekyll v4.2.2">
<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">
</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/2023/02/07/release_1.33.0/">Release_1.33.0</option>
<option value="/news/2022/09/10/release-1.32.0/">Release 1.32.0</option>
<option value="/news/2022/08/02/release-1.31.0/">Release 1.31.0</option>
<option value="/news/2022/03/19/release-1.30.0/">Release 1.30.0</option>
<option value="/news/2021/12/25/release-1.29.0/">Release 1.29.0</option>
<option value="/news/2021/10/19/release-1.28.0/">Release 1.28.0</option>
<option value="/news/2021/06/03/release-1.27.0/">Release 1.27.0</option>
<option value="/news/2021/01/11/meetup/">Calcite Online Meetup January 2021</option>
<option value="/news/2020/10/06/release-1.26.0/">Release 1.26.0</option>
<option value="/news/2020/08/22/release-1.25.0/">Release 1.25.0</option>
<option value="/news/2020/07/23/release-1.24.0/">Release 1.24.0</option>
<option value="/news/2020/05/23/release-1.23.0/">Release 1.23.0</option>
<option value="/news/2020/03/05/release-1.22.0/">Release 1.22.0</option>
<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>
</optgroup>
</select>
</div>
<div class="unit four-fifths">
<article>
<h2>
Release 1.28.0
<a href="/news/2021/10/19/release-1.28.0/" class="permalink" title="Permalink"></a>
</h2>
<span class="post-category">
<span class="label">
release
</span>
</span>
<div class="post-meta">
<span class="post-date">
19 Oct 2021
</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>The <a href="">Apache Calcite PMC</a>
is pleased to announce
<a href="/docs/history.html#v1-28-0">Apache Calcite release 1.28.0</a>.</p>
<p>This release comes four months after <a href="/docs/history.html#v1-27-0">1.27.0</a>,
contains contributions from 38 authors,
and resolves 76 issues.
New features include the
<a href="https://issues.apache.org/jira/browse/CALCITE-4486">UNIQUE</a>
sub-query predicate, the
<a href="https://issues.apache.org/jira/browse/CALCITE-4661">MODE</a> aggregate function,
<a href="https://issues.apache.org/jira/browse/CALCITE-4644">PERCENTILE_CONT and PERCENTILE_DISC</a>
inverse distribution functions, an
<a href="https://issues.apache.org/jira/browse/CALCITE-4614">Exasol dialect</a>
for the JDBC adapter, and improvements to
<a href="https://issues.apache.org/jira/browse/CALCITE-4779">materialized</a>
<a href="https://issues.apache.org/jira/browse/CALCITE-3935">view</a>
<a href="https://issues.apache.org/jira/browse/CALCITE-4774">recognition</a>.</p>
<p>This release contains some breaking changes (described below) due to the
<a href="https://issues.apache.org/jira/browse/CALCITE-4787">replacement of ImmutableBeans with Immutables</a>.
Two APIs are deprecated and will be
<a href="/docs/history.html#to-be-removed-in-1-29-0">removed in release 1.29</a>.</p>
<h2 id="breaking-changes-to-immutablebeans">Breaking changes to ImmutableBeans</h2>
<p>In 1.28, Calcite converted the recently introduced
<a href="https://issues.apache.org/jira/browse/CALCITE-3328">configuration system</a>
from an internal system based on
<a href="https://github.com/apache/calcite/blob/main/core/src/main/java/org/apache/calcite/util/ImmutableBeans.java">ImmutableBeans</a>
to instead use the <a href="https://immutables.github.io/">Immutables</a>
annotation processor. This library brings a large number of additional
features that should make value-type classes in Calcite easier to
build and leverage. It also reduces reliance on dynamic proxies, which
should improve performance and reduce memory footprint. Lastly, this
change increases compatibility with ahead-of-time compilation
technologies such as <a href="https://www.graalvm.org/">GraalVM</a>. As part of
this change, a number of minor changes have been made and key methods
and classes have been deprecated. The change was designed to minimize
disruption to existing consumers of Calcite but the following minor
changes needed to be made:</p>
<ul>
<li>The
<a href="https://github.com/apache/calcite/blob/main/core/src/main/java/org/apache/calcite/plan/RelRule.java#L125">RelRule.Config.EMPTY</a>
field is now deprecated. To create a new configuration subclass, you
can either use your preferred interface-implementation based
construction or you can leverage Immutables. To do the latter,
<a href="https://immutables.github.io/getstarted.html">configure your project</a>
to use the Immutables annotation processor and annotate your
subclass with the
<a href="https://immutables.github.io/immutable.html#value"><code class="language-plaintext highlighter-rouge">@Value.Immutable</code></a>
annotation.</li>
<li>Where <code class="language-plaintext highlighter-rouge">RelRule.Config</code> subclasses were nested 2+ classes deep, the
interfaces have been marked deprecated and are superceded by new,
uniquely named interfaces. The original Configs extend the new
uniquely named interfaces. Subclassing these work as before and the
existing rule signatures accept any previously implemented Config
implementations. However, this is a breaking change if a user stored
an instance of the <code class="language-plaintext highlighter-rouge">DEFAULT</code> object using the Config class name (as
the <code class="language-plaintext highlighter-rouge">DEFAULT</code> instance now only implements the uniquely named
interface).</li>
<li>The <code class="language-plaintext highlighter-rouge">RelRule.Config.as()</code> method should only be used for safe
downcasts. Before, it could do arbitrary casts. The exception is
that arbitrary <code class="language-plaintext highlighter-rouge">as()</code> will continue to work when using the
deprecated <code class="language-plaintext highlighter-rouge">RelRule.Config.EMPTY</code> field. In most cases, this should
be a non-breaking change. However, all Calcite-defined <code class="language-plaintext highlighter-rouge">DEFAULT</code>
rule config instances use Immutables. As such, if one had previously
subclassed a <code class="language-plaintext highlighter-rouge">RelRule.Config</code> subclass and then used the <code class="language-plaintext highlighter-rouge">DEFAULT</code>
instance from that subclass, the <code class="language-plaintext highlighter-rouge">as()</code> call will no longer work to
coerce the <code class="language-plaintext highlighter-rouge">DEFAULT</code> instance into a arbitrary subclass. In essence,
outside the <code class="language-plaintext highlighter-rouge">EMPTY</code> use, <code class="language-plaintext highlighter-rouge">as()</code> is now only safe to do if a Java
cast is also safe.</li>
<li>
<code class="language-plaintext highlighter-rouge">ExchangeRemoveConstantKeysRule.Config</code> and
<code class="language-plaintext highlighter-rouge">ValuesReduceRule.Config</code> now declare concrete bounds for their
matchHandler configuration. This is a breaking change if one did not
use the Rule as a bounding variable.</li>
<li>Collections used in Immutables value classes will be converted to
Immutable collection types even if the passed in parameter is
mutable (such as an <code class="language-plaintext highlighter-rouge">ArrayList</code>). As such, consumers of those
configuration properties cannot mutate the returned collections.</li>
</ul>
<p>See the <a href="/docs/history.html#v1-28-0">release notes</a>;
<a href="/downloads#source-releases">download</a> the release.</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/2023/02/07/release_1.33.0/">1.33.0</a>
</li>
<li class="">
<a href="/news/2022/09/10/release-1.32.0/">1.32.0</a>
</li>
<li class="">
<a href="/news/2022/08/02/release-1.31.0/">1.31.0</a>
</li>
<li class="">
<a href="/news/2022/03/19/release-1.30.0/">1.30.0</a>
</li>
<li class="">
<a href="/news/2021/12/25/release-1.29.0/">1.29.0</a>
</li>
</ul>
<h4>Other News</h4>
<ul>
<li class="">
<a href="/news/2021/01/11/meetup/">Calcite Online Meetup January 2021</a>
</li>
<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="">
<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 © 2023
<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>
<p>
<a href="https://privacy.apache.org/policies/privacy-policy-public.html">Privacy Policy</a>
</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>