<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.8.7">Jekyll</generator><link href="https://www.queryverse.org//feed.xml" rel="self" type="application/atom+xml" /><link href="https://www.queryverse.org//" rel="alternate" type="text/html" /><updated>2020-06-13T20:00:31+00:00</updated><id>https://www.queryverse.org//feed.xml</id><title type="html">Queryverse</title><subtitle>Queryverse, Julia packages for data science.</subtitle><entry><title type="html">VegaLite.jl v2.1 released</title><link href="https://www.queryverse.org//2020/04/06/vegalite-v2.1/" rel="alternate" type="text/html" title="VegaLite.jl v2.1 released" /><published>2020-04-06T00:00:00+00:00</published><updated>2020-04-06T00:00:00+00:00</updated><id>https://www.queryverse.org//2020/04/06/vegalite-v2.1</id><content type="html" xml:base="https://www.queryverse.org//2020/04/06/vegalite-v2.1/">&lt;p&gt;I just released &lt;a href=&quot;https://github.com/queryverse/VegaLite.jl&quot;&gt;VegaLite.jl&lt;/a&gt; v2.1. While this release just tracks what is happening upstream in the Vega-Lite project, there are some really nice feature additions.&lt;/p&gt;

&lt;p&gt;For all the details you can read through the release notes of Vega-Lite:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/vega/vega-lite/releases/tag/v4.7.0&quot;&gt;Vega-Lite 4.7&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/vega/vega-lite/releases/tag/v4.8.0&quot;&gt;Vega-Lite 4.8&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/vega/vega-lite/releases/tag/v4.9.0&quot;&gt;Vega-Lite 4.9&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/vega/vega-lite/releases/tag/v4.10.0&quot;&gt;Vega-Lite 4.10&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I’ll use the rest of this post to highlight a few key new features.&lt;/p&gt;

&lt;h2 id=&quot;arc-marks&quot;&gt;Arc marks&lt;/h2&gt;

&lt;p&gt;Vega-Lite now supports a new arc mark that makes it easy to create pie, donut and radial charts:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/111269/78106296-f8418e80-73a7-11ea-805b-f96c9d630aa0.png&quot; alt=&quot;arc mark&quot; /&gt;&lt;/p&gt;

&lt;p&gt;For more information, you can read the original Vega-Lite &lt;a href=&quot;https://vega.github.io/vega-lite/docs/arc.html&quot;&gt;documentation&lt;/a&gt; and you can look at a number of &lt;a href=&quot;https://www.queryverse.org/VegaLite.jl/v2.1/examples/examples_circular_plots/&quot;&gt;Julia examples&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;datum-in-encoding&quot;&gt;Datum in encoding&lt;/h2&gt;

&lt;p&gt;The new support for &lt;a href=&quot;https://vega.github.io/vega-lite/docs/datum.html&quot;&gt;datum in encodings&lt;/a&gt; makes it easy to add for example a rule at a given point to a figure.&lt;/p&gt;

&lt;p&gt;An example that adds a horizontal rule to a figure is this:&lt;/p&gt;

&lt;div class=&quot;language-julia highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;using&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;VegaLite&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;VegaDatasets&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;dataset&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;stocks&quot;&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nd&quot;&gt;@vlplot&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;
&lt;span class=&quot;nd&quot;&gt;@vlplot&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;line&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;date:t&quot;&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;price&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;symbol&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;
&lt;span class=&quot;nd&quot;&gt;@vlplot&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mark&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;rule&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;strokeDash&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;size&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;},&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;datum&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;300&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img src=&quot;/assets/blog/images/datum_horizontal.svg&quot; alt=&quot;figure&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Note how the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;y&lt;/code&gt; channel here is given a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;datum&lt;/code&gt;, that is a value from the underlying price domain.&lt;/p&gt;

&lt;p&gt;For temporal values this has especially nice syntax:&lt;/p&gt;

&lt;div class=&quot;language-julia highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;using&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;VegaLite&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;VegaDatasets&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;dataset&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;stocks&quot;&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nd&quot;&gt;@vlplot&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;
&lt;span class=&quot;nd&quot;&gt;@vlplot&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;line&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;date:t&quot;&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;price&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;symbol&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;
&lt;span class=&quot;nd&quot;&gt;@vlplot&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mark&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;rule&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;strokeDash&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;size&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;},&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;datum&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;year&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2006&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;}})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img src=&quot;/assets/blog/images/datum_vertical.svg&quot; alt=&quot;figure&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Note how we can set a value for a specific year here.&lt;/p&gt;

&lt;h2 id=&quot;angle-channel-for-point-and-text-marks&quot;&gt;Angle channel for point and text marks&lt;/h2&gt;

&lt;p&gt;A new angle channel makes it easy to create for example the following wind vector map:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/111269/78104850-b9f6a000-73a4-11ea-8025-ec28cbf2e75a.png&quot; alt=&quot;figure&quot; /&gt;&lt;/p&gt;

&lt;p&gt;You can find the Julia code for this example in the &lt;a href=&quot;https://www.queryverse.org/VegaLite.jl/v2.1/examples/examples_table_based_plots/#Wind-Vector-Map-1&quot;&gt;documentation&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;This release was literally zero work on the Julia side of things, all the thanks for these new features should go to the awesome Vega-Lite team that keeps adding new functionality at an amazing speed!&lt;/p&gt;</content><author><name>David Anthoff</name></author><summary type="html">I just released VegaLite.jl v2.1. While this release just tracks what is happening upstream in the Vega-Lite project, there are some really nice feature additions.</summary></entry><entry><title type="html">VegaLite.jl v2.0.0 released</title><link href="https://www.queryverse.org//2020/03/11/vegalite-v2.0.0/" rel="alternate" type="text/html" title="VegaLite.jl v2.0.0 released" /><published>2020-03-11T00:00:00+00:00</published><updated>2020-03-11T00:00:00+00:00</updated><id>https://www.queryverse.org//2020/03/11/vegalite-v2.0.0</id><content type="html" xml:base="https://www.queryverse.org//2020/03/11/vegalite-v2.0.0/">&lt;p&gt;We released &lt;a href=&quot;https://github.com/queryverse/VegaLite.jl&quot;&gt;VegaLite.jl&lt;/a&gt; v2.0 a couple of days ago. This new version brings &lt;em&gt;a lot&lt;/em&gt; of new features along! I’ll try to walk you through some of them in this blog post.&lt;/p&gt;

&lt;p&gt;For those of you not familiar with the package: &lt;a href=&quot;https://github.com/queryverse/VegaLite.jl&quot;&gt;VegaLite.jl&lt;/a&gt; is a powerful plotting package for Julia.&lt;/p&gt;

&lt;h2 id=&quot;vega-lite-4&quot;&gt;Vega-Lite 4&lt;/h2&gt;

&lt;p&gt;We updated the Julia package to use the latest version of the underlying JavaScript library, &lt;a href=&quot;https://vega.github.io/vega-lite/&quot;&gt;Vega-Lite&lt;/a&gt; 4. This brings a &lt;em&gt;ton&lt;/em&gt; of new features to the table. You can take a look at a detailed description of all these updates by looking at the release notes for all the Vega-Lite versions we now incorporate:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/vega/vega-lite/releases/tag/v4.0.0&quot;&gt;Vega-Lite 4.0&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/vega/vega-lite/releases/tag/v4.1.0&quot;&gt;Vega-Lite 4.1&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/vega/vega-lite/releases/tag/v4.2.0&quot;&gt;Vega-Lite 4.2&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/vega/vega-lite/releases/tag/v4.3.0&quot;&gt;Vega-Lite 4.3&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/vega/vega-lite/releases/tag/v4.4.0&quot;&gt;Vega-Lite 4.4&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/vega/vega-lite/releases/tag/v4.5.0&quot;&gt;Vega-Lite 4.5&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/vega/vega-lite/releases/tag/v4.6.0&quot;&gt;Vega-Lite 4.6&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I encourage you to take a look at these release notes, they have examples for each new feature and give a good overview of what is happening in the underlying library. There is a lot of good stuff (regression, loess, density and quantile transforms, a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;strokeDash&lt;/code&gt; encoding channel, lots of new interactive stuff and a ton of other features)!&lt;/p&gt;

&lt;h2 id=&quot;support-for-inline-data&quot;&gt;Support for inline data&lt;/h2&gt;

&lt;p&gt;We now support inline data, i.e. you can now create a plot from vectors of data directly, without the need to pass a tabular data structure like &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DataFrame&lt;/code&gt; to the plot function. The following example plots a scatter plot of two vectors of random numbers:&lt;/p&gt;

&lt;div class=&quot;language-julia highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;using&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;VegaLite&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;a_vector&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;rand&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;nd&quot;&gt;@vlplot&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;point&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;rand&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;a_vector&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;You can also pass vectors inside a composite value:&lt;/p&gt;

&lt;div class=&quot;language-julia highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;using&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;VegaLite&lt;/span&gt; 

&lt;span class=&quot;nd&quot;&gt;@vlplot&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;line&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Timestep&quot;&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;},&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;rand&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;support-for-positional-x-and-y-encodings&quot;&gt;Support for positional &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;x&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;y&lt;/code&gt; encodings&lt;/h2&gt;

&lt;p&gt;The values for the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;x&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;y&lt;/code&gt; encoding channel can now be passed as positional arguments, thus further reducing the amount of code required for common plots.&lt;/p&gt;

&lt;p&gt;In particular, the second positional argument is now interpreted as the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;x&lt;/code&gt; channel, and the third positional argument as the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;y&lt;/code&gt; channel.&lt;/p&gt;

&lt;p&gt;A simple example that uses some tabular data is this:&lt;/p&gt;

&lt;div class=&quot;language-julia highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;using&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;VegaLite&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;VegaDatasets&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;dataset&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;cars&quot;&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&amp;gt;&lt;/span&gt; &lt;span class=&quot;nd&quot;&gt;@vlplot&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;point&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Acceleration&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Miles_per_Gallon&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The combination of positional arguments and inline data makes the code for a simple scatter plot of two vectors really concise:&lt;/p&gt;

&lt;div class=&quot;language-julia highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;using&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;VegaLite&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;rand&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;b&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;rand&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;nd&quot;&gt;@vlplot&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;point&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;save-plots-as-html-files&quot;&gt;Save plots as HTML files&lt;/h2&gt;

&lt;p&gt;You can now save a plot directly as a HTML file:&lt;/p&gt;

&lt;div class=&quot;language-julia highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;using&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;VegaLite&lt;/span&gt;

&lt;span class=&quot;nd&quot;&gt;@vlplot&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;point&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;rand&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;rand&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;save&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;figure.html&quot;&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;These HTML files are self contained, and are especially useful for interactive charts (which will fully work if someone opens the generated HTML file in a web browser).&lt;/p&gt;

&lt;h2 id=&quot;much-better-support-for-vega-specs&quot;&gt;Much better support for Vega specs&lt;/h2&gt;

&lt;p&gt;The package now exports a new &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@vgplot&lt;/code&gt; macro. It works exactly like &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@vlplot&lt;/code&gt;, except that you can use it to create &lt;a href=&quot;https://vega.github.io/vega/&quot;&gt;Vega&lt;/a&gt; plots. &lt;a href=&quot;https://vega.github.io/vega/&quot;&gt;Vega&lt;/a&gt; is the lower-level plotting library that &lt;a href=&quot;https://vega.github.io/vega-lite/&quot;&gt;Vega-Lite&lt;/a&gt; uses under the hood. It is more verbose than Vega-Lite, but gives you much more control over the types of plots you can create. Take a look at the &lt;a href=&quot;https://vega.github.io/vega/examples/&quot;&gt;Vega examples&lt;/a&gt; to get a sense.&lt;/p&gt;

&lt;h2 id=&quot;better-juno-integration&quot;&gt;Better Juno integration&lt;/h2&gt;

&lt;p&gt;Interactive plots should now work properly in Juno.&lt;/p&gt;

&lt;h2 id=&quot;convert-plots-into-julia-code-experimental&quot;&gt;Convert plots into Julia code (experimental)&lt;/h2&gt;

&lt;p&gt;You can now take a plot object and call a function to get some Julia code that would re-create exactly that plot object. Here is a simple example:&lt;/p&gt;

&lt;div class=&quot;language-julia highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;using&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;VegaLite&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;VegaDatasets&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;p&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dataset&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;cars&quot;&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&amp;gt;&lt;/span&gt; &lt;span class=&quot;nd&quot;&gt;@vlplot&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;point&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Acceleration&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Miles_per_Gallon&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;VegaLite&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;printrepr&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;stdout&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This will output:&lt;/p&gt;

&lt;div class=&quot;language-julia highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nd&quot;&gt;@vlplot&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mark&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;point&quot;&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;encoding&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;field&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Acceleration&quot;&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;},&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;field&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Miles_per_Gallon&quot;&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;}})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This standalone example is probably not very useful, but this functionality can be very convenient if you obtain the plot from some other source.&lt;/p&gt;

&lt;p&gt;For example, here is an example where you copy a Vega-Lite JSON example and convert it into an equivalent Julia code representation:&lt;/p&gt;

&lt;div class=&quot;language-julia highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;using&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;VegaLite&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;p&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;vl&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&quot;&quot;
{
    &quot;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mark&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;: &quot;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;point&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;,
    &quot;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;encoding&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;: {
        &quot;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;: {
            &quot;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;field&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;: &quot;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Miles_per_Gallon&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;
        },
        &quot;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;: {
            &quot;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;field&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;: &quot;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Acceleration&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;
        }
    }
}
&quot;&quot;&quot;&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;VegaLite&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;printrepr&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;stdout&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This also outputs the Julia code that would create this spec:&lt;/p&gt;

&lt;div class=&quot;language-julia highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nd&quot;&gt;@vlplot&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;encoding&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;field&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Miles_per_Gallon&quot;&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;},&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;field&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Acceleration&quot;&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;}},&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mark&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;point&quot;&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Another scenario is that you load a Vega-Lite spec from disc and directly convert it into Julia code:&lt;/p&gt;

&lt;div class=&quot;language-julia highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;using&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;VegaLite&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;VegaLite&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;printrepr&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;stdout&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;load&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;figure.vegalite&quot;&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Or maybe you used &lt;a href=&quot;https://github.com/queryverse/DataVoyager.jl&quot;&gt;DataVoyager.jl&lt;/a&gt; to interactively create a plot and now want to include some code that creates that same figure, but in a non-interactive way:&lt;/p&gt;

&lt;div class=&quot;language-julia highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;using&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;DataVoyager&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;VegaDatasets&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;# Run Voyager&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;w&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dataset&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;cars&quot;&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Voyager&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;()&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;# At this point you would interactively create your plot and proceed once you are done with that&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;# Extract the plot from the UI&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;p&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;w&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;[]&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;# Convert the interactively created plot into Julia code&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;VegaLite&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;printrepr&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;stdout&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;new-examples&quot;&gt;New examples&lt;/h2&gt;

&lt;p&gt;We have &lt;em&gt;a ton&lt;/em&gt; of new examples, both for Vega and Vega-Lite plots in the documentation, check them out &lt;a href=&quot;https://www.queryverse.org/VegaLite.jl/v2.0/&quot;&gt;here&lt;/a&gt;!&lt;/p&gt;

&lt;h2 id=&quot;new-expert-apis-experimental&quot;&gt;New expert APIs (experimental)&lt;/h2&gt;

&lt;p&gt;We now also export a purely non-macro based API. The two functions for that are &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;vlplot&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;vgplot&lt;/code&gt;. Normal users are encouraged to continue to use the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@vlplot&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@vgplot&lt;/code&gt; macros, these new functions are mostly meant for some special situations where other packages can’t use the macro versions of these calls.&lt;/p&gt;

&lt;p&gt;We also export new macros and functions called &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@vlfrag&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@vgfrag&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;vlfrag&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;vgfrag&lt;/code&gt;. These allow you to create spec fragments and then pass these to the main level &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@vlplot&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@vgplot&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;vlplot&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;vgplot&lt;/code&gt; macros and functions.&lt;/p&gt;

&lt;p&gt;For example, in this example I break up the call to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@vlplot&lt;/code&gt; into two calls by using the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@vlfrag&lt;/code&gt; macro:&lt;/p&gt;

&lt;div class=&quot;language-julia highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;using&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;VegaLite&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;VegaDatasets&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;x_frag&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nd&quot;&gt;@vlfrag&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Miles_per_Gallon&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Custom title&quot;&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;dataset&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;cars&quot;&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&amp;gt;&lt;/span&gt; &lt;span class=&quot;nd&quot;&gt;@vlplot&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;point&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x_frag&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;We again discourage use of this feature in normal user code, this is another feature that is probably most useful for package authors that want to make use of &lt;a href=&quot;https://github.com/queryverse/VegaLite.jl&quot;&gt;VegaLite.jl&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;bug-fixes-and-performance&quot;&gt;Bug fixes and performance&lt;/h2&gt;

&lt;p&gt;There are a ton of bug fixes and performance improvements in this version:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;We handle inline data much more efficiently&lt;/li&gt;
  &lt;li&gt;We auto-encode encoding types in sub specs&lt;/li&gt;
  &lt;li&gt;We properly apply shorthands in sub specs&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;thanks&quot;&gt;Thanks&lt;/h2&gt;

&lt;p&gt;This release had a lot of folks contributing, I in particular want to thank &lt;a href=&quot;https://github.com/oheil&quot;&gt;oheil&lt;/a&gt;, &lt;a href=&quot;https://github.com/mcmcgrath13&quot;&gt;mcmcgrath13&lt;/a&gt; and &lt;a href=&quot;https://github.com/tkf&quot;&gt;tkf&lt;/a&gt; for their help!&lt;/p&gt;</content><author><name>David Anthoff</name></author><summary type="html">We released VegaLite.jl v2.0 a couple of days ago. This new version brings a lot of new features along! I’ll try to walk you through some of them in this blog post.</summary></entry><entry><title type="html">ElectronDisplay.jl v1.0.0 Released</title><link href="https://www.queryverse.org//2020/02/05/electrondisplay-v1.0.0/" rel="alternate" type="text/html" title="ElectronDisplay.jl v1.0.0 Released" /><published>2020-02-05T00:00:00+00:00</published><updated>2020-02-05T00:00:00+00:00</updated><id>https://www.queryverse.org//2020/02/05/electrondisplay-v1.0.0</id><content type="html" xml:base="https://www.queryverse.org//2020/02/05/electrondisplay-v1.0.0/">&lt;p&gt;&lt;a href=&quot;https://github.com/queryverse/ElectronDisplay.jl&quot;&gt;ElectronDisplay.jl&lt;/a&gt; is a package that provides a simple UI based on &lt;a href=&quot;https://electronjs.org/&quot;&gt;Electron&lt;/a&gt; for displaying plots and tabular data. It works with most plotting packages and almost all data structures that represent tabular data in the Julia ecosystem. The package is a core piece of the &lt;a href=&quot;https://github.com/queryverse&quot;&gt;Queryverse&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;what-is-new&quot;&gt;What is new?&lt;/h2&gt;
&lt;p&gt;There are a bunch of bugfixes as well as some new features in v1.0.0. The main new feature is the &lt;a href=&quot;https://github.com/julia-vscode/plotgallery&quot;&gt;plotgallery&lt;/a&gt;, an interactive plot display UI that is written in TypeScript and based on React. It supports displaying multiple plots in the same window simultaniously, even if those plots are created with different plotting packages. For example, you can display a Gadfly.jl figure and then plot a VegaLite.jl plot, or multiple VegaLite.jl plots, and they would show in a single window instead of opening a new window each time or replacing the old plots.&lt;/p&gt;

&lt;h3 id=&quot;some-functionalities-in-detail&quot;&gt;Some functionalities in detail&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;Press CTRL + C on Windows and Linux or Command + C on macOS to copy the current figure to the system clipboard&lt;/li&gt;
  &lt;li&gt;Press arrow keys to switch between plots quickly and delete/backspace to remove a graph&lt;/li&gt;
  &lt;li&gt;Supports Vega, VegaLite, and several image formats (such as PNG, JPG, and SVG)&lt;/li&gt;
  &lt;li&gt;Support viewport-sized plots that resize according to the window size&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&quot;/assets/blog/images/electrondisplay-screenshot-plotgallery.png&quot; alt=&quot;Plotgallery screenshot&quot; /&gt;&lt;/p&gt;

&lt;p&gt;You can have a look at the detailed release notes &lt;a href=&quot;https://github.com/queryverse/ElectronDisplay.jl/releases&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;contributions-are-welcomed&quot;&gt;Contributions are welcomed&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/queryverse/ElectronDisplay.jl&quot;&gt;ElectronDisplay.jl&lt;/a&gt; is still a new package that needs help from the community to resolve the current issues that it has. In fact, as an apprentice of the &lt;a href=&quot;https://urap.berkeley.edu/&quot;&gt;Undergraduate Research Apprentice Program&lt;/a&gt; supervised by David Anthoff, I have been working on several issues on this project over the past few weeks after I made the initial pull request. If you are interested in making contributions to the project, you can have a look at &lt;a href=&quot;https://github.com/queryverse/ElectronDisplay.jl/issues&quot;&gt;Issues for ElectronDisplay.jl&lt;/a&gt;, or &lt;a href=&quot;https://github.com/julia-vscode/plotgallery/issues&quot;&gt;Issues for Plotgallery&lt;/a&gt;.&lt;/p&gt;</content><author><name>Tony Lian</name></author><summary type="html">ElectronDisplay.jl is a package that provides a simple UI based on Electron for displaying plots and tabular data. It works with most plotting packages and almost all data structures that represent tabular data in the Julia ecosystem. The package is a core piece of the Queryverse.</summary></entry><entry><title type="html">Announcing ElectronDisplay.jl</title><link href="https://www.queryverse.org//2019/02/13/electrondisplay/" rel="alternate" type="text/html" title="Announcing ElectronDisplay.jl" /><published>2019-02-13T00:00:00+00:00</published><updated>2019-02-13T00:00:00+00:00</updated><id>https://www.queryverse.org//2019/02/13/electrondisplay</id><content type="html" xml:base="https://www.queryverse.org//2019/02/13/electrondisplay/">&lt;p&gt;&lt;a href=&quot;https://github.com/queryverse/ElectronDisplay.jl&quot;&gt;ElectronDisplay.jl&lt;/a&gt; is a package that provides a simple UI based on &lt;a href=&quot;https://electronjs.org/&quot;&gt;Electron&lt;/a&gt; for displaying plots and tabular data. It works with most plotting packages and almost all data structures that represent tabular data in the Julia ecosystem. The package is a core piece of the &lt;a href=&quot;https://github.com/queryverse&quot;&gt;Queryverse&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;plot-display&quot;&gt;Plot display&lt;/h2&gt;

&lt;p&gt;Anytime you load &lt;a href=&quot;https://github.com/queryverse/ElectronDisplay.jl&quot;&gt;ElectronDisplay.jl&lt;/a&gt; via &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;using ElectonDisplay&lt;/code&gt;, it automatically becomes the default display for you current Julia session. From that moment on, whenever you display a figure from any of the supported plotting packages, it will show up in a window that is managed by &lt;a href=&quot;https://github.com/queryverse/ElectronDisplay.jl&quot;&gt;ElectronDisplay.jl&lt;/a&gt;. Any plotting package that hooks into the standard Julia &lt;a href=&quot;https://docs.julialang.org/en/v1.1/base/io-network/#Multimedia-I/O-1&quot;&gt;multimedia I/O&lt;/a&gt; API will work with this setup, as long as it supports either the PNG or SVG format with its &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;show&lt;/code&gt; method.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/queryverse/ElectronDisplay.jl&quot;&gt;ElectronDisplay.jl&lt;/a&gt; provides more tightly integrated support for &lt;a href=&quot;https://github.com/sglyon/PlotlyJS.jl&quot;&gt;PlotlyJS.jl&lt;/a&gt; and &lt;a href=&quot;https://github.com/queryverse/VegaLite.jl&quot;&gt;VegaLite.jl&lt;/a&gt;: plots from both packages support a full range of interactive features inside the window that &lt;a href=&quot;https://github.com/queryverse/ElectronDisplay.jl&quot;&gt;ElectronDisplay.jl&lt;/a&gt; opens for them.&lt;/p&gt;

&lt;p&gt;Here is a simple example of how this works. Executing the following example code&lt;/p&gt;

&lt;div class=&quot;language-julia highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;julia&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;using&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;VegaLite&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;VegaDatasets&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ElectronDisplay&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;julia&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dataset&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;cars&quot;&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&amp;gt;&lt;/span&gt; &lt;span class=&quot;nd&quot;&gt;@vlplot&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;point&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Acceleration&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Miles_per_Gallon&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Origin&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;will open a window that displays this plot:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/blog/images/electrondisplay-screenshot-vegalite.png&quot; alt=&quot;VegaLite.jl screenshot&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;table-display&quot;&gt;Table display&lt;/h2&gt;

&lt;p&gt;Thanks to &lt;a href=&quot;https://github.com/tkf&quot;&gt;tks&lt;/a&gt;’s fantastic recent contribution, &lt;a href=&quot;https://github.com/queryverse/ElectronDisplay.jl&quot;&gt;ElectronDisplay.jl&lt;/a&gt; now also has support for showing tabular data in a grid. To display a table in that way, you simply pass it to the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;electrondisplay&lt;/code&gt; function, and it will show in a new window.&lt;/p&gt;

&lt;p&gt;The following example demonstrates how easy it is to display a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DataFrame&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-julia highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;julia&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;using&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;DataFrames&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ElectronDisplay&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;julia&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;df&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;DataFrame&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;rand&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;rand&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;rand&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;));&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;julia&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;electrondisplay&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;df&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The table view works with almost any tabular source, not just &lt;a href=&quot;https://github.com/JuliaData/DataFrames.jl&quot;&gt;DataFrames.jl&lt;/a&gt;. For example, here we are showing the result of a &lt;a href=&quot;https://github.com/queryverse/Query.jl&quot;&gt;Query.jl&lt;/a&gt; query directly in the grid, without ever materializing it into a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DataFrame&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-julia highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;julia&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;using&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;VegaDatasets&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Query&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ElectronDisplay&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;julia&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dataset&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;cars&quot;&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&amp;gt;&lt;/span&gt;
       &lt;span class=&quot;nd&quot;&gt;@filter&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Origin&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;USA&quot;&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&amp;gt;&lt;/span&gt;
       &lt;span class=&quot;nd&quot;&gt;@select&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-:&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Miles_per_Gallon&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&amp;gt;&lt;/span&gt;
       &lt;span class=&quot;n&quot;&gt;electrondisplay&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And the results are shown in a window like this:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/blog/images/electrondisplay-screenshot-grid.png&quot; alt=&quot;Grid screenshot&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The table display in &lt;a href=&quot;https://github.com/queryverse/ElectronDisplay.jl&quot;&gt;ElectronDisplay.jl&lt;/a&gt; works for any source that either supports a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;show&lt;/code&gt; method for the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;application/vnd.dataresource+json&lt;/code&gt; MIME type, or implements the &lt;a href=&quot;https://github.com/queryverse/TableTraits.jl&quot;&gt;TableTraits.jl&lt;/a&gt; interface. Anything that iterates named tuples automatically is a &lt;a href=&quot;https://github.com/queryverse/TableTraits.jl&quot;&gt;TableTraits.jl&lt;/a&gt; source, so even packages that have never heard of either option might well work with &lt;a href=&quot;https://github.com/queryverse/ElectronDisplay.jl&quot;&gt;ElectronDisplay.jl&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;summary&quot;&gt;Summary&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/queryverse/ElectronDisplay.jl&quot;&gt;ElectronDisplay.jl&lt;/a&gt; is probably most useful for people that work directly in the Julia REPL and not in one of the more fully feature IDEs. It is also a very young package, and any help with the package would be most welcome! I have created a few issues with ideas for improvements, but I am sure there are many more. I think this could be a project where someone with web UI experience could really contribute significantly.&lt;/p&gt;</content><author><name>David Anthoff</name></author><summary type="html">ElectronDisplay.jl is a package that provides a simple UI based on Electron for displaying plots and tabular data. It works with most plotting packages and almost all data structures that represent tabular data in the Julia ecosystem. The package is a core piece of the Queryverse.</summary></entry><entry><title type="html">Query.jl v0.11 released</title><link href="https://www.queryverse.org//2019/02/02/query-v0.11/" rel="alternate" type="text/html" title="Query.jl v0.11 released" /><published>2019-02-02T00:00:00+00:00</published><updated>2019-02-02T00:00:00+00:00</updated><id>https://www.queryverse.org//2019/02/02/query-v0.11</id><content type="html" xml:base="https://www.queryverse.org//2019/02/02/query-v0.11/">&lt;p&gt;We just released &lt;a href=&quot;https://github.com/queryverse/Query.jl&quot;&gt;Query.jl&lt;/a&gt; v0.11. The new version adds four new standalone query operators: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@select&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@rename&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@mutate&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@unique&lt;/code&gt;. We also fixed a number of bugs and wrote a bunch of new documentation. Finally, the standalone versions of the query operators are no longer considered experimental, so feel free to use the versions that use the pipe operator &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;|&amp;gt;&lt;/code&gt; without any worries that they might go away in the future. The rest of this post will showcase the new query operators we added.&lt;/p&gt;

&lt;h2 id=&quot;the-select-query-operator&quot;&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@select&lt;/code&gt; query operator&lt;/h2&gt;

&lt;p&gt;The standalone &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@select&lt;/code&gt; query operator makes it easier to select a subset of columns from a source table and arrange them in some specified order. Note that the discussion in this section is about the &lt;a href=&quot;http://www.queryverse.org/Query.jl/stable/standalonequerycommands/#The-@select-command-1&quot;&gt;standalone&lt;/a&gt; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@select&lt;/code&gt; query operator, not the &lt;a href=&quot;http://www.queryverse.org/Query.jl/stable/linqquerycommands/#Projecting-1&quot;&gt;LINQ style&lt;/a&gt; version of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@select&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;In the most basic example, you can simply specify all the columns that you want to include in the result table. You can select columns either by their name, or their position.&lt;/p&gt;

&lt;p&gt;Lets first create a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DataFrame&lt;/code&gt; with some example data that we will use as the basis for most examples in this post:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;julia&amp;gt; using Query, DataFrames

julia&amp;gt; df = DataFrame(firstCol=rand(10), colA=rand(10), colB=rand(10), colC=rand(10), lastCol=rand(10))
10×5 DataFrame
│ Row │ firstCol    │ colA      │ colB       │ colC      │ lastCol   │
│     │ Float64     │ Float64   │ Float64    │ Float64   │ Float64   │
├─────┼─────────────┼───────────┼────────────┼───────────┼───────────┤
│ 1   │ 0.0815091   │ 0.726354  │ 0.164546   │ 0.419195  │ 0.0685362 │
│ 2   │ 0.984546    │ 0.132284  │ 0.00516908 │ 0.619361  │ 0.847543  │
│ 3   │ 0.452009    │ 0.421744  │ 0.443238   │ 0.581122  │ 0.518726  │
│ 4   │ 0.551547    │ 0.204774  │ 0.80987    │ 0.0977708 │ 0.866429  │
│ 5   │ 0.0537391   │ 0.362015  │ 0.760544   │ 0.775301  │ 0.810517  │
│ 6   │ 0.837029    │ 0.0614884 │ 0.596101   │ 0.0613467 │ 0.230335  │
│ 7   │ 0.701862    │ 0.702575  │ 0.714068   │ 0.283429  │ 0.308963  │
│ 8   │ 0.626259    │ 0.246562  │ 0.573619   │ 0.869932  │ 0.148938  │
│ 9   │ 0.000844883 │ 0.432564  │ 0.289367   │ 0.92641   │ 0.592507  │
│ 10  │ 0.365743    │ 0.666146  │ 0.932312   │ 0.352096  │ 0.684766  │
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Now we select the column named &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;colB&lt;/code&gt;, the second column and the column named &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;lastCol&lt;/code&gt; into a new table:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;julia&amp;gt; df |&amp;gt; @select(:colB, 2, :lastCol)
10x3 query result
colB       │ colA      │ lastCol
───────────┼───────────┼──────────
0.164546   │ 0.726354  │ 0.0685362
0.00516908 │ 0.132284  │ 0.847543
0.443238   │ 0.421744  │ 0.518726
0.80987    │ 0.204774  │ 0.866429
0.760544   │ 0.362015  │ 0.810517
0.596101   │ 0.0614884 │ 0.230335
0.714068   │ 0.702575  │ 0.308963
0.573619   │ 0.246562  │ 0.148938
0.289367   │ 0.432564  │ 0.592507
0.932312   │ 0.666146  │ 0.684766
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Note that we are achieving two things at the same time here: we are picking only a few of the columns from the source table, and we are rearranging the order of the columns.&lt;/p&gt;

&lt;p&gt;There are a whole number of options available that make it easier to select multiple columns without specifying each individually.&lt;/p&gt;

&lt;p&gt;First, we can use the standard julia range syntax to select consecutive columns:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;julia&amp;gt; df |&amp;gt; @select(:colB : :lastCol, :colA)
10x4 query result
colB       │ colC      │ lastCol   │ colA
───────────┼───────────┼───────────┼──────────
0.164546   │ 0.419195  │ 0.0685362 │ 0.726354
0.00516908 │ 0.619361  │ 0.847543  │ 0.132284
0.443238   │ 0.581122  │ 0.518726  │ 0.421744
0.80987    │ 0.0977708 │ 0.866429  │ 0.204774
0.760544   │ 0.775301  │ 0.810517  │ 0.362015
0.596101   │ 0.0613467 │ 0.230335  │ 0.0614884
0.714068   │ 0.283429  │ 0.308963  │ 0.702575
0.573619   │ 0.869932  │ 0.148938  │ 0.246562
0.289367   │ 0.92641   │ 0.592507  │ 0.432564
0.932312   │ 0.352096  │ 0.684766  │ 0.666146
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;In that example, we first selected all columns between &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;colB&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;lastCol&lt;/code&gt; (so that would be &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;colB&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;colC&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;lastCol&lt;/code&gt;), and then we also included &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;colA&lt;/code&gt; as the second argument to the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@select&lt;/code&gt; call.&lt;/p&gt;

&lt;p&gt;We can also use the range syntax with column position indices:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;julia&amp;gt; df |&amp;gt; @select(3:5, :colA)
10x4 query result
colB       │ colC      │ lastCol   │ colA
───────────┼───────────┼───────────┼──────────
0.164546   │ 0.419195  │ 0.0685362 │ 0.726354
0.00516908 │ 0.619361  │ 0.847543  │ 0.132284
0.443238   │ 0.581122  │ 0.518726  │ 0.421744
0.80987    │ 0.0977708 │ 0.866429  │ 0.204774
0.760544   │ 0.775301  │ 0.810517  │ 0.362015
0.596101   │ 0.0613467 │ 0.230335  │ 0.0614884
0.714068   │ 0.283429  │ 0.308963  │ 0.702575
0.573619   │ 0.869932  │ 0.148938  │ 0.246562
0.289367   │ 0.92641   │ 0.592507  │ 0.432564
0.932312   │ 0.352096  │ 0.684766  │ 0.666146
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;We also provide a number of convenience functions for bulk column selection. For example, to select all columns that have a name that starts with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;col&lt;/code&gt;, we can write:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;julia&amp;gt; df |&amp;gt; @select(startswith(&quot;col&quot;))
10x3 query result
colA      │ colB       │ colC
──────────┼────────────┼──────────
0.726354  │ 0.164546   │ 0.419195
0.132284  │ 0.00516908 │ 0.619361
0.421744  │ 0.443238   │ 0.581122
0.204774  │ 0.80987    │ 0.0977708
0.362015  │ 0.760544   │ 0.775301
0.0614884 │ 0.596101   │ 0.0613467
0.702575  │ 0.714068   │ 0.283429
0.246562  │ 0.573619   │ 0.869932
0.432564  │ 0.289367   │ 0.92641
0.666146  │ 0.932312   │ 0.352096
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Or we can select all columns that have a name that ends with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Col&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;julia&amp;gt; df |&amp;gt; @select(endswith(&quot;Col&quot;))
10x2 query result
firstCol    │ lastCol
────────────┼──────────
0.0815091   │ 0.0685362
0.984546    │ 0.847543
0.452009    │ 0.518726
0.551547    │ 0.866429
0.0537391   │ 0.810517
0.837029    │ 0.230335
0.701862    │ 0.308963
0.626259    │ 0.148938
0.000844883 │ 0.592507
0.365743    │ 0.684766
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Lets say we have a situation where we want to select a large number of columns that we can easily select with one of the bulk column options discussed so far, except for one specific column. Here is how we can run such a query:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;julia&amp;gt; df |&amp;gt; @select(startswith(&quot;col&quot;), -:colB)
10x2 query result
colA      │ colC
──────────┼──────────
0.726354  │ 0.419195
0.132284  │ 0.619361
0.421744  │ 0.581122
0.204774  │ 0.0977708
0.362015  │ 0.775301
0.0614884 │ 0.0613467
0.702575  │ 0.283429
0.246562  │ 0.869932
0.432564  │ 0.92641
0.666146  │ 0.352096
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Here we first select all columns that have a name that starts with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;col&lt;/code&gt;. At this point we have selected the columns &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;colA&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;colB&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;colC&lt;/code&gt;. Next, we remove &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;colB&lt;/code&gt; from this list, by specifying a minus &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-&lt;/code&gt; in front of its name as the next argument.&lt;/p&gt;

&lt;p&gt;There is one twist to removing columns: if the first argument to the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@select&lt;/code&gt; query operator starts with a minus, then we implicitly start out with &lt;em&gt;all&lt;/em&gt; columns selected. Here is an example that demonstrates this:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;julia&amp;gt; df |&amp;gt; @select(-:colB)
10x4 query result
firstCol    │ colA      │ colC      │ lastCol
────────────┼───────────┼───────────┼──────────
0.0815091   │ 0.726354  │ 0.419195  │ 0.0685362
0.984546    │ 0.132284  │ 0.619361  │ 0.847543
0.452009    │ 0.421744  │ 0.581122  │ 0.518726
0.551547    │ 0.204774  │ 0.0977708 │ 0.866429
0.0537391   │ 0.362015  │ 0.775301  │ 0.810517
0.837029    │ 0.0614884 │ 0.0613467 │ 0.230335
0.701862    │ 0.702575  │ 0.283429  │ 0.308963
0.626259    │ 0.246562  │ 0.869932  │ 0.148938
0.000844883 │ 0.432564  │ 0.92641   │ 0.592507
0.365743    │ 0.666146  │ 0.352096  │ 0.684766
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Because we start this &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@select&lt;/code&gt; query operator with an argument that has a minus &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-&lt;/code&gt; in front, we start out with all columns, and then remove the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;colB&lt;/code&gt; column.&lt;/p&gt;

&lt;p&gt;The minus &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-&lt;/code&gt; can of course also be combined with all the bulk column options. The next example selects all columns from the source table, except if they have a column name that starts with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;col&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;julia&amp;gt; df |&amp;gt; @select(-startswith(&quot;col&quot;))
10x2 query result
firstCol    │ lastCol
────────────┼──────────
0.0815091   │ 0.0685362
0.984546    │ 0.847543
0.452009    │ 0.518726
0.551547    │ 0.866429
0.0537391   │ 0.810517
0.837029    │ 0.230335
0.701862    │ 0.308963
0.626259    │ 0.148938
0.000844883 │ 0.592507
0.365743    │ 0.684766
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;If you are familiar with &lt;a href=&quot;https://dplyr.tidyverse.org/&quot;&gt;dplyr&lt;/a&gt; all of this will be highly familiar: we largely copied the semantics from that package.&lt;/p&gt;

&lt;h2 id=&quot;the-rename-query-operator&quot;&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@rename&lt;/code&gt; query operator&lt;/h2&gt;

&lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@rename&lt;/code&gt; query operator renames one or more columns from a table. Each rename is specified as a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Pair&lt;/code&gt;, where the first element is either the old name of the column that should be renamed, or the position of the column. The second element must be a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Symbol&lt;/code&gt; with the new name for the column. Here is an example:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;julia&amp;gt; df |&amp;gt; @rename(:colB=&amp;gt;:foo, 1=&amp;gt;:bar)
10x5 query result
bar         │ colA      │ foo        │ colC      │ lastCol
────────────┼───────────┼────────────┼───────────┼──────────
0.0815091   │ 0.726354  │ 0.164546   │ 0.419195  │ 0.0685362
0.984546    │ 0.132284  │ 0.00516908 │ 0.619361  │ 0.847543
0.452009    │ 0.421744  │ 0.443238   │ 0.581122  │ 0.518726
0.551547    │ 0.204774  │ 0.80987    │ 0.0977708 │ 0.866429
0.0537391   │ 0.362015  │ 0.760544   │ 0.775301  │ 0.810517
0.837029    │ 0.0614884 │ 0.596101   │ 0.0613467 │ 0.230335
0.701862    │ 0.702575  │ 0.714068   │ 0.283429  │ 0.308963
0.626259    │ 0.246562  │ 0.573619   │ 0.869932  │ 0.148938
0.000844883 │ 0.432564  │ 0.289367   │ 0.92641   │ 0.592507
0.365743    │ 0.666146  │ 0.932312   │ 0.352096  │ 0.684766
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Here we are renaming the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;colB&lt;/code&gt; column to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;foo&lt;/code&gt;, and the first column to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bar&lt;/code&gt;. This example highlights that one can rename multiple columns in a single call to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@rename&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;All other columns in a source table are left unmodified by the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@rename&lt;/code&gt; query operator, and the order of columns is also not changed.&lt;/p&gt;

&lt;p&gt;The semantics of this query operator once again follow the equivalent &lt;a href=&quot;https://dplyr.tidyverse.org/&quot;&gt;dplyr&lt;/a&gt; function.&lt;/p&gt;

&lt;h2 id=&quot;the-mutate-query-operator&quot;&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@mutate&lt;/code&gt; query operator&lt;/h2&gt;

&lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@mutate&lt;/code&gt; query operator can be used to either add columns to a table, or mutate the content of some columns in a table. Lets say we want to add a new column to our table that is the sum of column &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;colA&lt;/code&gt; and the log of column &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;colB&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;julia&amp;gt; df |&amp;gt; @mutate(newCol = _.colA + log(_.colB))
10x6 query result
firstCol    │ colA      │ colB       │ colC      │ lastCol   │ newCol
────────────┼───────────┼────────────┼───────────┼───────────┼────────────
0.0815091   │ 0.726354  │ 0.164546   │ 0.419195  │ 0.0685362 │ -1.07821
0.984546    │ 0.132284  │ 0.00516908 │ 0.619361  │ 0.847543  │ -5.13278
0.452009    │ 0.421744  │ 0.443238   │ 0.581122  │ 0.518726  │ -0.391904
0.551547    │ 0.204774  │ 0.80987    │ 0.0977708 │ 0.866429  │ -0.00610799
0.0537391   │ 0.362015  │ 0.760544   │ 0.775301  │ 0.810517  │ 0.0882928
0.837029    │ 0.0614884 │ 0.596101   │ 0.0613467 │ 0.230335  │ -0.455857
0.701862    │ 0.702575  │ 0.714068   │ 0.283429  │ 0.308963  │ 0.365798
0.626259    │ 0.246562  │ 0.573619   │ 0.869932  │ 0.148938  │ -0.309229
0.000844883 │ 0.432564  │ 0.289367   │ 0.92641   │ 0.592507  │ -0.807497
0.365743    │ 0.666146  │ 0.932312   │ 0.352096  │ 0.684766  │ 0.596058
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;We pass each column we want compute for the output table as a keyword argument to the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@mutate&lt;/code&gt; query operator. The name of the keyword argument will become the name of the column that we are computing. To the right of the equal sign &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;=&lt;/code&gt; we pass an expression that computes the value for the current row for the new column. We have access to the current row via the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_&lt;/code&gt; syntax (in the same way it is used in all the other standalone query operators). In our example this allows us for example to reference the value of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;colA&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;colB&lt;/code&gt; in the current row &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_&lt;/code&gt;. If the output name for the column (in our case &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;newCol&lt;/code&gt;) does not exist as a column in the input table, a new column with that name will be added at the end of the table.&lt;/p&gt;

&lt;p&gt;The next example uses an output name for the column that already exists, in which case the content of that column will be replaced with the new, computed values:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;julia&amp;gt; df |&amp;gt; @mutate(firstCol = _.colA + log(_.colB))
10x5 query result
firstCol    │ colA      │ colB       │ colC      │ lastCol
────────────┼───────────┼────────────┼───────────┼──────────
-1.07821    │ 0.726354  │ 0.164546   │ 0.419195  │ 0.0685362
-5.13278    │ 0.132284  │ 0.00516908 │ 0.619361  │ 0.847543
-0.391904   │ 0.421744  │ 0.443238   │ 0.581122  │ 0.518726
-0.00610799 │ 0.204774  │ 0.80987    │ 0.0977708 │ 0.866429
0.0882928   │ 0.362015  │ 0.760544   │ 0.775301  │ 0.810517
-0.455857   │ 0.0614884 │ 0.596101   │ 0.0613467 │ 0.230335
0.365798    │ 0.702575  │ 0.714068   │ 0.283429  │ 0.308963
-0.309229   │ 0.246562  │ 0.573619   │ 0.869932  │ 0.148938
-0.807497   │ 0.432564  │ 0.289367   │ 0.92641   │ 0.592507
0.596058    │ 0.666146  │ 0.932312   │ 0.352096  │ 0.684766
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;One can also specify multiple output columns in a single call to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@mutate&lt;/code&gt;, for example the following code replaces the values in one existing column (named &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;firstCol&lt;/code&gt;) and adds a new column named &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;newCol&lt;/code&gt;.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;julia&amp;gt; df |&amp;gt; @mutate(firstCol = _.colA + log(_.colB), newCol=_.colC * 2)
10x6 query result
firstCol    │ colA      │ colB       │ colC      │ lastCol   │ newCol
────────────┼───────────┼────────────┼───────────┼───────────┼─────────
-1.07821    │ 0.726354  │ 0.164546   │ 0.419195  │ 0.0685362 │ 0.838391
-5.13278    │ 0.132284  │ 0.00516908 │ 0.619361  │ 0.847543  │ 1.23872
-0.391904   │ 0.421744  │ 0.443238   │ 0.581122  │ 0.518726  │ 1.16224
-0.00610799 │ 0.204774  │ 0.80987    │ 0.0977708 │ 0.866429  │ 0.195542
0.0882928   │ 0.362015  │ 0.760544   │ 0.775301  │ 0.810517  │ 1.5506
-0.455857   │ 0.0614884 │ 0.596101   │ 0.0613467 │ 0.230335  │ 0.122693
0.365798    │ 0.702575  │ 0.714068   │ 0.283429  │ 0.308963  │ 0.566858
-0.309229   │ 0.246562  │ 0.573619   │ 0.869932  │ 0.148938  │ 1.73986
-0.807497   │ 0.432564  │ 0.289367   │ 0.92641   │ 0.592507  │ 1.85282
0.596058    │ 0.666146  │ 0.932312   │ 0.352096  │ 0.684766  │ 0.704192
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Note that in all of these examples, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@mutate&lt;/code&gt; leaves any column that is not named explicitly as an output column alone.&lt;/p&gt;

&lt;p&gt;And it might not come as a surprise at this point: we again followed the lead of the equivalent &lt;a href=&quot;https://dplyr.tidyverse.org/&quot;&gt;dplyr&lt;/a&gt; function in the design.&lt;/p&gt;

&lt;h2 id=&quot;the-unique-query-operator&quot;&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@unique&lt;/code&gt; query operator&lt;/h2&gt;

&lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@unique&lt;/code&gt; query operator is simple: it removes any duplicate values from an input sequence. Here is a simple example where we remove duplicate values from an array of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Int&lt;/code&gt; values:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;julia&amp;gt; [1,2,3,4,5,2,4] |&amp;gt; @unique()
?-element query result
 1
 2
 3
 4
 5
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;One can of course also use this with tabular data:&lt;/p&gt;

&lt;div class=&quot;language-julia highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; &lt;span class=&quot;n&quot;&gt;julia&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;df2&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;DataFrame&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;])&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;×2&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;DataFrame&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;│&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Row&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;│&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;     &lt;span class=&quot;n&quot;&gt;│&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;b&lt;/span&gt;     &lt;span class=&quot;n&quot;&gt;│&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;│&lt;/span&gt;     &lt;span class=&quot;n&quot;&gt;│&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Int64&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;│&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;Int64&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;│&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;├─────┼───────┼───────┤&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;│&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;   &lt;span class=&quot;n&quot;&gt;│&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;     &lt;span class=&quot;n&quot;&gt;│&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;     &lt;span class=&quot;n&quot;&gt;│&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;│&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;   &lt;span class=&quot;n&quot;&gt;│&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;     &lt;span class=&quot;n&quot;&gt;│&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;     &lt;span class=&quot;n&quot;&gt;│&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;│&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;   &lt;span class=&quot;n&quot;&gt;│&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;     &lt;span class=&quot;n&quot;&gt;│&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;     &lt;span class=&quot;n&quot;&gt;│&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;│&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;   &lt;span class=&quot;n&quot;&gt;│&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;     &lt;span class=&quot;n&quot;&gt;│&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;     &lt;span class=&quot;n&quot;&gt;│&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;julia&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;df2&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&amp;gt;&lt;/span&gt; &lt;span class=&quot;nd&quot;&gt;@unique&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x2&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;query&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;result&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;│&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;b&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;──┼──&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;│&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;│&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;│&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;As always, please let us know about any issues or problems that you might run into while using &lt;a href=&quot;https://github.com/queryverse/Query.jl&quot;&gt;Query.jl&lt;/a&gt; over in the github repository.&lt;/p&gt;</content><author><name>David Anthoff</name></author><summary type="html">We just released Query.jl v0.11. The new version adds four new standalone query operators: @select, @rename, @mutate and @unique. We also fixed a number of bugs and wrote a bunch of new documentation. Finally, the standalone versions of the query operators are no longer considered experimental, so feel free to use the versions that use the pipe operator |&amp;gt; without any worries that they might go away in the future. The rest of this post will showcase the new query operators we added.</summary></entry><entry><title type="html">Welcome to the new Queryverse homepage</title><link href="https://www.queryverse.org//2019/01/19/hello-world/" rel="alternate" type="text/html" title="Welcome to the new Queryverse homepage" /><published>2019-01-19T00:00:00+00:00</published><updated>2019-01-19T00:00:00+00:00</updated><id>https://www.queryverse.org//2019/01/19/hello-world</id><content type="html" xml:base="https://www.queryverse.org//2019/01/19/hello-world/">&lt;p&gt;Welcome to the new homepage for all things Queryverse! Going forward we
will use this blog to announce new features and generally explain the packages
that make up the Queryverse.&lt;/p&gt;</content><author><name>David Anthoff</name></author><summary type="html">Welcome to the new homepage for all things Queryverse! Going forward we will use this blog to announce new features and generally explain the packages that make up the Queryverse.</summary></entry><entry><title type="html">Query.jl v0.10 released</title><link href="https://www.queryverse.org//2018/08/29/query-v0.10/" rel="alternate" type="text/html" title="Query.jl v0.10 released" /><published>2018-08-29T00:00:00+00:00</published><updated>2018-08-29T00:00:00+00:00</updated><id>https://www.queryverse.org//2018/08/29/query-v0.10</id><content type="html" xml:base="https://www.queryverse.org//2018/08/29/query-v0.10/">&lt;p&gt;I just released &lt;a href=&quot;https://github.com/queryverse/Query.jl&quot;&gt;Query.jl&lt;/a&gt; v0.10. This is the first version that is compatible with julia 1.0, and at the same time it drops support for older julia versions.&lt;/p&gt;

&lt;p&gt;This version comes with two breaking changes, other than that there are no new features.&lt;/p&gt;

&lt;h2 id=&quot;new-way-to-select-group-key&quot;&gt;New way to select group key&lt;/h2&gt;

&lt;p&gt;In previous versions one selected the value of a group key via the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.key&lt;/code&gt; syntax, like in this example:&lt;/p&gt;

&lt;div class=&quot;language-julia highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nd&quot;&gt;@from&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;df&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;begin&lt;/span&gt;
    &lt;span class=&quot;nd&quot;&gt;@group&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;by&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;children&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;into&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;g&lt;/span&gt;
    &lt;span class=&quot;nd&quot;&gt;@select&lt;/span&gt; &lt;span class=&quot;x&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Key&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Count&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;length&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;)}&lt;/span&gt;
    &lt;span class=&quot;nd&quot;&gt;@collect&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;DataFrame&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This syntax is no longer support, instead you have to use the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;key&lt;/code&gt; function to access the key of a group:&lt;/p&gt;

&lt;div class=&quot;language-julia highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nd&quot;&gt;@from&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;df&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;begin&lt;/span&gt;
    &lt;span class=&quot;nd&quot;&gt;@group&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;by&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;children&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;into&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;g&lt;/span&gt;
    &lt;span class=&quot;nd&quot;&gt;@select&lt;/span&gt; &lt;span class=&quot;x&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Key&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;),&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Count&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;length&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;)}&lt;/span&gt;
    &lt;span class=&quot;nd&quot;&gt;@collect&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;DataFrame&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;-syntax-removed&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;..&lt;/code&gt; syntax removed&lt;/h2&gt;

&lt;p&gt;In previous versions one could use the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;a..b&lt;/code&gt; syntax as a shortcut for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;map(i-&amp;gt;i.b, a)&lt;/code&gt;. This syntax has been removed, and instead groups of table rows now support access to a whole column via a simple &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;a.b&lt;/code&gt; syntax. For example, a typical groupby query might now look like this:&lt;/p&gt;

&lt;div class=&quot;language-julia highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nd&quot;&gt;@from&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;df&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;begin&lt;/span&gt;
    &lt;span class=&quot;nd&quot;&gt;@group&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;by&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;state&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;into&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;g&lt;/span&gt;
    &lt;span class=&quot;nd&quot;&gt;@select&lt;/span&gt; &lt;span class=&quot;x&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;group&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;),&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mage&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mean&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;age&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;oldest&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;maximum&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;age&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;youngest&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;minimum&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;age&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;)}&lt;/span&gt;
    &lt;span class=&quot;nd&quot;&gt;@collect&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;DataFrame&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;</content><author><name>David Anthoff</name></author><summary type="html">I just released Query.jl v0.10. This is the first version that is compatible with julia 1.0, and at the same time it drops support for older julia versions.</summary></entry><entry><title type="html">Youtube tutorial - Introduction to Queryverse.jl</title><link href="https://www.queryverse.org//2018/06/18/youtube-queryverse-tutorial/" rel="alternate" type="text/html" title="Youtube tutorial - Introduction to Queryverse.jl" /><published>2018-06-18T00:00:00+00:00</published><updated>2018-06-18T00:00:00+00:00</updated><id>https://www.queryverse.org//2018/06/18/youtube-queryverse-tutorial</id><content type="html" xml:base="https://www.queryverse.org//2018/06/18/youtube-queryverse-tutorial/">&lt;p&gt;I recorded an online tutorial to the &lt;a href=&quot;https://github.com/davidanthoff/Queryverse.jl&quot;&gt;Queryverse.jl&lt;/a&gt; last week. You can watch the tutorial &lt;a href=&quot;https://www.youtube.com/watch?v=OFPNph-WxLM&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The tutorial covers tabular file IO, data manipulation with &lt;a href=&quot;https://github.com/davidanthoff/Query.jl&quot;&gt;Query.jl&lt;/a&gt; and visual data exploration with &lt;a href=&quot;https://github.com/queryverse/VegaLite.jl&quot;&gt;VegaLite.jl&lt;/a&gt; and &lt;a href=&quot;https://github.com/davidanthoff/DataVoyager.jl&quot;&gt;DataVoyager.jl&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Any feedback would be most welcome!&lt;/p&gt;</content><author><name>David Anthoff</name></author><summary type="html">I recorded an online tutorial to the Queryverse.jl last week. You can watch the tutorial here.</summary></entry><entry><title type="html">Query.jl v0.9.x released</title><link href="https://www.queryverse.org//2017/12/20/query-0.9/" rel="alternate" type="text/html" title="Query.jl v0.9.x released" /><published>2017-12-20T00:00:00+00:00</published><updated>2017-12-20T00:00:00+00:00</updated><id>https://www.queryverse.org//2017/12/20/query-0.9</id><content type="html" xml:base="https://www.queryverse.org//2017/12/20/query-0.9/">&lt;p&gt;I just released &lt;a href=&quot;https://github.com/davidanthoff/Query.jl&quot;&gt;Query.jl&lt;/a&gt;
v0.9.0. The new version adds the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@take&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@drop&lt;/code&gt; standalone query
operators and brings pretty printing to uncollected queries.&lt;/p&gt;

&lt;h2 id=&quot;pretty-printing&quot;&gt;Pretty printing&lt;/h2&gt;

&lt;p&gt;In previous versions queries displayed a really awful mess of internal
data when they were displayed in the REPL. In practice one always had to
collect a query into something like a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DataFrame&lt;/code&gt; to get a nice view
of the query result. The new version changes that and provides a nice
output for any query, even an uncollected one. Here is an example:&lt;/p&gt;

&lt;div class=&quot;language-julia highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;julia&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;using&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;FileIO&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Query&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;CSVFiles&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;julia&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;filename&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;https://gist.githubusercontent.com/davidanthoff/bebfd24c1a3f32f576eb61bee77f5944/raw/dd9233ad860037a2155f3a9ca3c37eb2d5572573/testdata2.csv&quot;&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;julia&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;load&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;filename&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&amp;gt;&lt;/span&gt; &lt;span class=&quot;nd&quot;&gt;@map&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;({&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;Year&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Cause_Name&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;})&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;15028&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x2&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;query&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;result&lt;/span&gt;
&lt;span class=&quot;kt&quot;&gt;Year&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;│&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Cause_Name&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;─────┼───────────────────────&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;1999&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;│&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Unintentional&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Injuries&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;1999&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;│&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Unintentional&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Injuries&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;1999&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;│&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Unintentional&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Injuries&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;1999&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;│&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Unintentional&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Injuries&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;1999&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;│&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Unintentional&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Injuries&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;1999&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;│&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Unintentional&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Injuries&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;1999&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;│&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Unintentional&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Injuries&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;1999&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;│&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Unintentional&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Injuries&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;1999&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;│&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Unintentional&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Injuries&lt;/span&gt;
&lt;span class=&quot;mi&quot;&gt;1999&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;│&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Unintentional&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Injuries&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;...&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;15018&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;more&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;rows&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The pretty printing should work for the values returned from any of the
query operators. The output format is heavily inspired by R’s tibbles.&lt;/p&gt;

&lt;p&gt;I hope this will make interactive work much more pleasant because it
should be easier to build up more complicated queries step by step, while
periodically running a query to check intermediate results.&lt;/p&gt;

&lt;p&gt;I also plan to add this to the whole tabular file IO of the iterable
tables ecosystem at a later date (e.g. &lt;a href=&quot;https://github.com/davidanthoff/CSVFiles.jl&quot;&gt;CSVFiles.jl&lt;/a&gt;,
&lt;a href=&quot;https://github.com/davidanthoff/FeatherFiles.jl&quot;&gt;FeatherFiles.jl&lt;/a&gt;,
&lt;a href=&quot;https://github.com/davidanthoff/ExcelFiles.jl&quot;&gt;ExcelFiles.jl&lt;/a&gt;,
&lt;a href=&quot;https://github.com/davidanthoff/StatFiles.jl&quot;&gt;StatFiles.jl&lt;/a&gt; etc.).&lt;/p&gt;

&lt;h2 id=&quot;the-take-and-drop-query-commands&quot;&gt;The @take and @drop query commands&lt;/h2&gt;

&lt;p&gt;Those are fairly straightforward: both of these filter elements out of a
sequence. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@take&lt;/code&gt; limits the number of elements to some upper maximum,
and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@drop&lt;/code&gt; skips a number of elements. Here is an example of how one
can use these:&lt;/p&gt;

&lt;div class=&quot;language-julia highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;using&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;FileIO&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Query&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;CSVFiles&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;filename&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;https://gist.githubusercontent.com/davidanthoff/bebfd24c1a3f32f576eb61bee77f5944/raw/dd9233ad860037a2155f3a9ca3c37eb2d5572573/testdata2.csv&quot;&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;load&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;filename&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nd&quot;&gt;@filter&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Cause_Name!&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;All Causes&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;isnull&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Age_adjusted_Death_Rate&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nd&quot;&gt;@groupby&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Cause_Name&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nd&quot;&gt;@map&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;({&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cause&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;death_rate&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sum&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;..&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Age_adjusted_Death_Rate&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;)})&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nd&quot;&gt;@orderby_descending&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;death_rate&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nd&quot;&gt;@drop&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nd&quot;&gt;@take&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;save&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;output.feather&quot;&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This example showcases a whole range of features, including the use of
the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@drop&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@take&lt;/code&gt; operations. The official documentation for
these two new operators is in the “Experimental Features” section in the
&lt;a href=&quot;https://github.com/davidanthoff/Query.jl&quot;&gt;Query.jl&lt;/a&gt; &lt;a href=&quot;http://www.david-anthoff.com/Query.jl/stable/&quot;&gt;documentation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Any feedback on these new features (and old ones) is most welcome, and of
course any help with the overall package would also be fantastic!&lt;/p&gt;

&lt;p&gt;This post is being discussed &lt;a href=&quot;https://discourse.julialang.org/t/query-jl-v0-9-x-released/7885&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;</content><author><name>David Anthoff</name></author><summary type="html">I just released Query.jl v0.9.0. The new version adds the @take and @drop standalone query operators and brings pretty printing to uncollected queries.</summary></entry><entry><title type="html">Query.jl v0.8.x released</title><link href="https://www.queryverse.org//2017/11/21/query-0.8/" rel="alternate" type="text/html" title="Query.jl v0.8.x released" /><published>2017-11-21T00:00:00+00:00</published><updated>2017-11-21T00:00:00+00:00</updated><id>https://www.queryverse.org//2017/11/21/query-0.8</id><content type="html" xml:base="https://www.queryverse.org//2017/11/21/query-0.8/">&lt;p&gt;I just released &lt;a href=&quot;https://github.com/davidanthoff/Query.jl&quot;&gt;Query.jl&lt;/a&gt;
v0.8.0. The new version has some breaking renames in the experimental
parts of the package (that is why they are experimental!), extends the
set of experimental standalone query commands, adds a slight twist to
the experimental anonymous function syntax and ships with a whole bunch
of package refactoring under the hood.&lt;/p&gt;

&lt;h2 id=&quot;renamed-experimental-standalone-query-commands&quot;&gt;Renamed experimental standalone query commands&lt;/h2&gt;

&lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@select&lt;/code&gt; standalone command was renamed to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@map&lt;/code&gt;, and the
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@where&lt;/code&gt; command to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@filter&lt;/code&gt;. Those names are more in line with
julia conventions.&lt;/p&gt;

&lt;p&gt;This change only applies to the experimental standalone versions of the
query commands that you would use with the pipe operator. Nothing has
changed about the LINQ syntax, i.e. that part will retain the SQL-like
terms from LINQ. I have no plans to change those terms going forward,
i.e. this does not indicate that there are any breaking changes planned
for the stable part of LINQ.&lt;/p&gt;

&lt;h2 id=&quot;new-experimental-standalone-query-commands&quot;&gt;New experimental standalone query commands&lt;/h2&gt;

&lt;p&gt;This release adds support for the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@groupjoin&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@join&lt;/code&gt; and
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@mapmany&lt;/code&gt; standalone query commands, i.e. you can now use those with
the pipe syntax. &lt;a href=&quot;http://www.david-anthoff.com/Query.jl/stable/experimental.html#Standalone-query-operators-1&quot;&gt;This&lt;/a&gt;
part of the documentation describes the arguments to those commands.&lt;/p&gt;

&lt;h2 id=&quot;support-for-two-arguments-in-the-experimental-anonymous-function-syntax&quot;&gt;Support for two arguments in the experimental anonymous function syntax&lt;/h2&gt;

&lt;p&gt;Some of new standalone query commands require an anonymous function that
takes two arguments. The existing experimental shortcut syntax for
creating anonymous functions has been extended to support that scenario.
To create a two argument anonymous function, you simply have to use both
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;__&lt;/code&gt; (double underscore) in the expression that should be
turned into an anonymous function. For example &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;{a=_, b=__}&lt;/code&gt; will be
translated into &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;(i1,i2)-&amp;gt;{a=i1, b=i2}&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id=&quot;package-refactoring&quot;&gt;Package refactoring&lt;/h2&gt;

&lt;p&gt;This release continues the breakup of the very large package
&lt;a href=&quot;https://github.com/davidanthoff/Query.jl&quot;&gt;Query.jl&lt;/a&gt; into smaller packages
that do specific things. The current situation now is this:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/davidanthoff/IteratorInterfaceExtensions.jl&quot;&gt;IteratorInterfaceExtensions.jl&lt;/a&gt;
defines a number of small extensions to the base julia iterator interface
that are used by both &lt;a href=&quot;https://github.com/davidanthoff/Query.jl&quot;&gt;Query.jl&lt;/a&gt;
and the iterable tables universe.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/davidanthoff/QueryOperators.jl&quot;&gt;QueryOperators.jl&lt;/a&gt;
contains the definition of the query operators and the default iterator
based backend implementation.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/davidanthoff/Query.jl&quot;&gt;Query.jl&lt;/a&gt; now contains the
syntax for the two supported front-ends: the traditional LINQ style
syntax and the new experimental standalone commands.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/davidanthoff/TableTraits.jl&quot;&gt;TableTraits.jl&lt;/a&gt; defines
a very minimal interface for tabular data interop.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/davidanthoff/TableTraitsUtils.jl&quot;&gt;TableTraitsUtils.jl&lt;/a&gt;
provides some helper functions that make it easier to implement the
interface defined in &lt;a href=&quot;https://github.com/davidanthoff/TableTraits.jl&quot;&gt;TableTraits.jl&lt;/a&gt;.
Some packages use this to implement the table traits interface, but
others don’t need it.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/davidanthoff/IterableTables.jl&quot;&gt;IterableTables.jl&lt;/a&gt;
contains all the integrations for various packages with the iterable
tables ecosystem that have not yet moved into those packages themselves.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This refactoring significantly simplifies the dependency situation with
these packages. The dependency graph now looks roughly like this:&lt;/p&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;
                                             IterableTables
                                            /
                                           /- TableTraitUtils
                                          /
                              TableTraits
                            /
IteratorInterfaceExtensions
                            \
                              QueryOperators
                                            \
                                             Query
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;thanks&quot;&gt;Thanks&lt;/h2&gt;

&lt;p&gt;Thanks as always to all the folks that contributed to this effort with
bug reports, suggestions and PRs. This release also got some new
benchmarks that were contributed by &lt;a href=&quot;https://discourse.julialang.org/u/floswald&quot;&gt;floswald&lt;/a&gt;
that will hopefully trigger some performance improvements going forward.&lt;/p&gt;

&lt;p&gt;Please do report any bugs and suggestions back! And help with this whole
effort is of course also always most welcome.&lt;/p&gt;

&lt;p&gt;This post is being discussed &lt;a href=&quot;https://discourse.julialang.org/t/query-jl-v0-8x-released/7233&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;</content><author><name>David Anthoff</name></author><summary type="html">I just released Query.jl v0.8.0. The new version has some breaking renames in the experimental parts of the package (that is why they are experimental!), extends the set of experimental standalone query commands, adds a slight twist to the experimental anonymous function syntax and ships with a whole bunch of package refactoring under the hood.</summary></entry></feed>