http://git-wip-us.apache.org/repos/asf/asterixdb-site/blob/100cb803/content/docs/0.9.1/aql/manual.html
----------------------------------------------------------------------
diff --git a/content/docs/0.9.1/aql/manual.html 
b/content/docs/0.9.1/aql/manual.html
new file mode 100644
index 0000000..4b7f477
--- /dev/null
+++ b/content/docs/0.9.1/aql/manual.html
@@ -0,0 +1,1096 @@
+<!DOCTYPE html>
+<!--
+ | Generated by Apache Maven Doxia at 2017-04-24
+ | Rendered using Apache Maven Fluido Skin 1.3.0
+-->
+<html xmlns="http://www.w3.org/1999/xhtml"; xml:lang="en" lang="en">
+  <head>
+    <meta charset="UTF-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+    <meta name="Date-Revision-yyyymmdd" content="20170424" />
+    <meta http-equiv="Content-Language" content="en" />
+    <title>AsterixDB &#x2013; The Asterix Query Language, Version 1.0</title>
+    <link rel="stylesheet" href="../css/apache-maven-fluido-1.3.0.min.css" />
+    <link rel="stylesheet" href="../css/site.css" />
+    <link rel="stylesheet" href="../css/print.css" media="print" />
+
+      
+    <script type="text/javascript" 
src="../js/apache-maven-fluido-1.3.0.min.js"></script>
+
+                          
+        
+<script>(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+        (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new 
Date();a=s.createElement(o),
+        
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+        
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
+
+        ga('create', 'UA-41536543-1', 'uci.edu');
+        ga('send', 'pageview');</script>
+          
+            </head>
+        <body class="topBarDisabled">
+          
+                
+                    
+    
+        <div class="container-fluid">
+          <div id="banner">
+        <div class="pull-left">
+                                                  <a href=".././" 
id="bannerLeft">
+                                                                               
                 <img src="../images/asterixlogo.png"  alt="AsterixDB"/>
+                </a>
+                      </div>
+        <div class="pull-right">  </div>
+        <div class="clear"><hr/></div>
+      </div>
+
+      <div id="breadcrumbs">
+        <ul class="breadcrumb">
+                
+                    
+                  <li id="publishDate">Last Published: 2017-04-24</li>
+                      
+                
+                    
+                 <li id="projectVersion" class="pull-right">Version: 0.9.1</li>
+      
+                                            <li class="divider 
pull-right">|</li>
+                        
+    <li class="pull-right">              <a href="../index.html" 
title="Documentation Home">
+        Documentation Home</a>
+  </li>
+
+                        </ul>
+      </div>
+
+            
+      <div class="row-fluid">
+        <div id="leftColumn" class="span3">
+          <div class="well sidebar-nav">
+                
+                    
+                <ul class="nav nav-list">
+                    <li class="nav-header">Get Started - Installation</li>
+                                
+      <li>
+    
+                          <a href="../ncservice.html" title="Option 1: using 
NCService">
+          <i class="none"></i>
+        Option 1: using NCService</a>
+            </li>
+                  
+      <li>
+    
+                          <a href="../ansible.html" title="Option 2: using 
Ansible">
+          <i class="none"></i>
+        Option 2: using Ansible</a>
+            </li>
+                  
+      <li>
+    
+                          <a href="../aws.html" title="Option 3: using Amazon 
Web Services">
+          <i class="none"></i>
+        Option 3: using Amazon Web Services</a>
+            </li>
+                  
+      <li>
+    
+                          <a href="../yarn.html" title="Option 4: using YARN">
+          <i class="none"></i>
+        Option 4: using YARN</a>
+            </li>
+                  
+      <li>
+    
+                          <a href="../install.html" title="Option 5: using 
Managix (deprecated)">
+          <i class="none"></i>
+        Option 5: using Managix (deprecated)</a>
+            </li>
+                              <li class="nav-header">AsterixDB Primer</li>
+                                
+      <li>
+    
+                          <a href="../sqlpp/primer-sqlpp.html" title="Option 
1: using SQL++">
+          <i class="none"></i>
+        Option 1: using SQL++</a>
+            </li>
+                  
+      <li>
+    
+                          <a href="../aql/primer.html" title="Option 2: using 
AQL">
+          <i class="none"></i>
+        Option 2: using AQL</a>
+            </li>
+                              <li class="nav-header">Data Model</li>
+                                
+      <li>
+    
+                          <a href="../datamodel.html" title="The Asterix Data 
Model">
+          <i class="none"></i>
+        The Asterix Data Model</a>
+            </li>
+                              <li class="nav-header">Queries - SQL++</li>
+                                
+      <li>
+    
+                          <a href="../sqlpp/manual.html" title="The SQL++ 
Query Language">
+          <i class="none"></i>
+        The SQL++ Query Language</a>
+            </li>
+                  
+      <li>
+    
+                          <a href="../sqlpp/builtins.html" title="Builtin 
Functions">
+          <i class="none"></i>
+        Builtin Functions</a>
+            </li>
+                              <li class="nav-header">Queries - AQL</li>
+                                
+      <li class="active">
+    
+            <a href="#"><i class="none"></i>The Asterix Query Language 
(AQL)</a>
+          </li>
+                  
+      <li>
+    
+                          <a href="../aql/builtins.html" title="Builtin 
Functions">
+          <i class="none"></i>
+        Builtin Functions</a>
+            </li>
+                              <li class="nav-header">API/SDK</li>
+                                
+      <li>
+    
+                          <a href="../api.html" title="HTTP API">
+          <i class="none"></i>
+        HTTP API</a>
+            </li>
+                  
+      <li>
+    
+                          <a href="../csv.html" title="CSV Output">
+          <i class="none"></i>
+        CSV Output</a>
+            </li>
+                              <li class="nav-header">Advanced Features</li>
+                                
+      <li>
+    
+                          <a href="../aql/fulltext.html" title="Support of 
Full-text Queries">
+          <i class="none"></i>
+        Support of Full-text Queries</a>
+            </li>
+                  
+      <li>
+    
+                          <a href="../aql/externaldata.html" title="Accessing 
External Data">
+          <i class="none"></i>
+        Accessing External Data</a>
+            </li>
+                  
+      <li>
+    
+                          <a href="../feeds/tutorial.html" title="Support for 
Data Ingestion">
+          <i class="none"></i>
+        Support for Data Ingestion</a>
+            </li>
+                  
+      <li>
+    
+                          <a href="../udf.html" title="User Defined Functions">
+          <i class="none"></i>
+        User Defined Functions</a>
+            </li>
+                  
+      <li>
+    
+                          <a href="../aql/filters.html" title="Filter-Based 
LSM Index Acceleration">
+          <i class="none"></i>
+        Filter-Based LSM Index Acceleration</a>
+            </li>
+                  
+      <li>
+    
+                          <a href="../aql/similarity.html" title="Support of 
Similarity Queries">
+          <i class="none"></i>
+        Support of Similarity Queries</a>
+            </li>
+            </ul>
+                
+                    
+                
+          <hr class="divider" />
+
+           <div id="poweredBy">
+                            <div class="clear"></div>
+                            <div class="clear"></div>
+                            <div class="clear"></div>
+                                                                               
                                          <a href=".././" title="AsterixDB" 
class="builtBy">
+        <img class="builtBy"  alt="AsterixDB" src="../images/asterixlogo.png"  
  />
+      </a>
+                      </div>
+          </div>
+        </div>
+        
+                
+        <div id="bodyColumn"  class="span9" >
+                                  
+            <!-- ! Licensed to the Apache Software Foundation (ASF) under one
+ ! or more contributor license agreements.  See the NOTICE file
+ ! distributed with this work for additional information
+ ! regarding copyright ownership.  The ASF licenses this file
+ ! to you under the Apache License, Version 2.0 (the
+ ! "License"); you may not use this file except in compliance
+ ! with the License.  You may obtain a copy of the License at
+ !
+ !   http://www.apache.org/licenses/LICENSE-2.0
+ !
+ ! Unless required by applicable law or agreed to in writing,
+ ! software distributed under the License is distributed on an
+ ! "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ ! KIND, either express or implied.  See the License for the
+ ! specific language governing permissions and limitations
+ ! under the License.
+ ! --><h1>The Asterix Query Language, Version 1.0</h1>
+<div class="section">
+<h2><a name="Table_of_Contents"></a><a name="toc" id="toc">Table of 
Contents</a></h2>
+
+<ul>
+  
+<li><a href="#Introduction">1. Introduction</a></li>
+  
+<li><a href="#Expressions">2. Expressions</a></li>
+  
+<li><a href="#Statements">3. Statements</a></li>
+</ul></div>
+<div class="section">
+<h2><a name="a1._Introduction_Back_to_TOC"></a><a name="Introduction" 
id="Introduction">1. Introduction</a><font size="4"> <a href="#toc">[Back to 
TOC]</a></font></h2>
+<p>This document is intended as a reference guide to the full syntax and 
semantics of the Asterix Query Language (AQL), the language for talking to 
AsterixDB. This guide covers both the data manipulation language (DML) aspects 
of AQL, including its support for queries and data modification, as well as its 
data definition language (DDL) aspects.  New AsterixDB users are encouraged to 
read and work through the (friendlier) guide &#x201c;AsterixDB 101: An ADM and 
AQL Primer&#x201d; before attempting to make use of this document. In addition, 
readers are advised to read and understand the Asterix Data Model (ADM) 
reference guide since a basic understanding of ADM concepts is a prerequisite 
to understanding AQL. In what follows, we detail the features of the AQL 
language in a grammar-guided manner: We list and briefly explain each of the 
productions in the AQL grammar, offering examples for clarity in cases where 
doing so seems needed or helpful.</p></div>
+<div class="section">
+<h2><a name="a2._Expressions_Back_to_TOC"></a><a name="Expressions" 
id="Expressions">2. Expressions</a> <font size="4"><a href="#toc">[Back to 
TOC]</a></font></h2>
+
+<div class="source">
+<div class="source">
+<pre>Query ::= Expression
+</pre></div></div>
+<p>An AQL query can be any legal AQL expression.</p>
+
+<div class="source">
+<div class="source">
+<pre>Expression ::= ( OperatorExpr | IfThenElse | FLWOR | QuantifiedExpression 
)
+</pre></div></div>
+<p>AQL is a fully composable expression language. Each AQL expression returns 
zero or more Asterix Data Model (ADM) instances. There are four major kinds of 
expressions in AQL. At the topmost level, an AQL expression can be an 
OperatorExpr (similar to a mathematical expression), an IfThenElse (to choose 
between two alternative values), a FLWOR expression (the heart of AQL, 
pronounced &#x201c;flower expression&#x201d;), or a QuantifiedExpression (which 
yields a boolean value). Each will be detailed as we explore the full AQL 
grammar.</p>
+<div class="section">
+<h3><a name="Primary_Expressions"></a>Primary Expressions</h3>
+
+<div class="source">
+<div class="source">
+<pre>PrimaryExpr ::= Literal
+              | VariableRef
+              | ParenthesizedExpression
+              | FunctionCallExpr
+              | DatasetAccessExpression
+              | ListConstructor
+              | ObjectConstructor
+</pre></div></div>
+<p>The most basic building block for any AQL expression is the PrimaryExpr. 
This can be a simple literal (constant) value, a reference to a query variable 
that is in scope, a parenthesized expression, a function call, an expression 
accessing the ADM contents of a dataset, a newly constructed list of ADM 
instances, or a newly constructed ADM object.</p>
+<div class="section">
+<h4><a name="Literals"></a>Literals</h4>
+
+<div class="source">
+<div class="source">
+<pre>Literal        ::= StringLiteral
+                 | IntegerLiteral
+                 | FloatLiteral
+                 | DoubleLiteral
+                 | &quot;null&quot;
+                 | &quot;true&quot;
+                 | &quot;false&quot;
+StringLiteral  ::= (&quot;\&quot;&quot; (&lt;ESCAPE_QUOT&gt; | 
~[&quot;\&quot;&quot;])* &quot;\&quot;&quot;)
+                 | (&quot;\'&quot; (&lt;ESCAPE_APOS&gt; | ~[&quot;\'&quot;])* 
&quot;\'&quot;)
+&lt;ESCAPE_QUOT&gt;  ::= &quot;\\\&quot;&quot;
+&lt;ESCAPE_APOS&gt;  ::= &quot;\\\'&quot;
+IntegerLiteral ::= &lt;DIGITS&gt;
+&lt;DIGITS&gt;       ::= [&quot;0&quot; - &quot;9&quot;]+
+FloatLiteral   ::= &lt;DIGITS&gt; ( &quot;f&quot; | &quot;F&quot; )
+                 | &lt;DIGITS&gt; ( &quot;.&quot; &lt;DIGITS&gt; ( 
&quot;f&quot; | &quot;F&quot; ) )?
+                 | &quot;.&quot; &lt;DIGITS&gt; ( &quot;f&quot; | 
&quot;F&quot; )
+DoubleLiteral  ::= &lt;DIGITS&gt;
+                 | &lt;DIGITS&gt; ( &quot;.&quot; &lt;DIGITS&gt; )?
+                 | &quot;.&quot; &lt;DIGITS&gt;
+</pre></div></div>
+<p>Literals (constants) in AQL can be strings, integers, floating point 
values, double values, boolean constants, or the constant value null. The null 
value in AQL has &#x201c;unknown&#x201d; or &#x201c;missing&#x201d; value 
semantics, similar to (though not identical to) nulls in the relational query 
language SQL.</p>
+<p>The following are some simple examples of AQL literals. Since AQL is an 
expression language, each example is also a complete, legal AQL query (!).</p>
+<div class="section">
+<h5><a name="Examples"></a>Examples</h5>
+
+<div class="source">
+<div class="source">
+<pre>&quot;a string&quot;
+42
+</pre></div></div></div></div>
+<div class="section">
+<h4><a name="Variable_References"></a>Variable References</h4>
+
+<div class="source">
+<div class="source">
+<pre>VariableRef ::= &lt;VARIABLE&gt;
+&lt;VARIABLE&gt;  ::= &quot;$&quot; &lt;LETTER&gt; (&lt;LETTER&gt; | 
&lt;DIGIT&gt; | &quot;_&quot;)*
+&lt;LETTER&gt;    ::= [&quot;A&quot; - &quot;Z&quot;, &quot;a&quot; - 
&quot;z&quot;]
+</pre></div></div>
+<p>A variable in AQL can be bound to any legal ADM value. A variable reference 
refers to the value to which an in-scope variable is bound. (E.g., a variable 
binding may originate from one of the for or let clauses of a FLWOR expression 
or from an input parameter in the context of an AQL function body.)</p>
+<div class="section">
+<h5><a name="Examples"></a>Examples</h5>
+
+<div class="source">
+<div class="source">
+<pre>$tweet
+$id
+</pre></div></div></div></div>
+<div class="section">
+<h4><a name="Parenthesized_Expressions"></a>Parenthesized Expressions</h4>
+
+<div class="source">
+<div class="source">
+<pre>ParenthesizedExpression ::= &quot;(&quot; Expression &quot;)&quot;
+</pre></div></div>
+<p>As in most languages, an expression may be parenthesized.</p>
+<p>Since AQL is an expression language, the following example expression is 
actually also a complete, legal AQL query whose result is the value 2. (As 
such, you can have Big Fun explaining to your boss how AsterixDB and AQL can 
turn your 1000-node shared-nothing Big Data cluster into a $5M calculator in 
its spare time.)</p>
+<div class="section">
+<h5><a name="Example"></a>Example</h5>
+
+<div class="source">
+<div class="source">
+<pre>( 1 + 1 )
+</pre></div></div></div></div>
+<div class="section">
+<h4><a name="Function_Calls"></a>Function Calls</h4>
+
+<div class="source">
+<div class="source">
+<pre>FunctionCallExpr ::= FunctionOrTypeName &quot;(&quot; ( Expression ( 
&quot;,&quot; Expression )* )? &quot;)&quot;
+</pre></div></div>
+<p>Functions are included in AQL, like most languages, as a way to package 
useful functionality or to componentize complicated or reusable AQL 
computations. A function call is a legal AQL query expression that represents 
the ADM value resulting from the evaluation of its body expression with the 
given parameter bindings; the parameter value bindings can themselves be any 
AQL expressions.</p>
+<p>The following example is a (built-in) function call expression whose value 
is 8.</p>
+<div class="section">
+<h5><a name="Example"></a>Example</h5>
+
+<div class="source">
+<div class="source">
+<pre>string-length(&quot;a string&quot;)
+</pre></div></div></div></div>
+<div class="section">
+<h4><a name="Dataset_Access"></a>Dataset Access</h4>
+
+<div class="source">
+<div class="source">
+<pre>DatasetAccessExpression ::= &quot;dataset&quot; ( ( Identifier ( 
&quot;.&quot; Identifier )? )
+                          | ( &quot;(&quot; Expression &quot;)&quot; ) )
+Identifier              ::= &lt;IDENTIFIER&gt; | StringLiteral
+&lt;IDENTIFIER&gt;            ::= &lt;LETTER&gt; (&lt;LETTER&gt; | 
&lt;DIGIT&gt; | &lt;SPECIALCHARS&gt;)*
+&lt;SPECIALCHARS&gt;          ::= [&quot;$&quot;, &quot;_&quot;, &quot;-&quot;]
+</pre></div></div>
+<p>Querying Big Data is the main point of AsterixDB and AQL. Data in AsterixDB 
reside in datasets (collections of ADM objects), each of which in turn resides 
in some namespace known as a dataverse (data universe). Data access in a query 
expression is accomplished via a DatasetAccessExpression. Dataset access 
expressions are most commonly used in FLWOR expressions, where variables are 
bound to their contents.</p>
+<p>Note that the Identifier that identifies a dataset (or any other Identifier 
in AQL) can also be a StringLiteral. This is especially useful to avoid 
conficts with AQL keywords (e.g. &#x201c;dataset&#x201d;, &#x201c;null&#x201d;, 
or &#x201c;type&#x201d;).</p>
+<p>The following are three examples of legal dataset access expressions. The 
first one accesses a dataset called Customers in the dataverse called SalesDV. 
The second one accesses the Customers dataverse in whatever the current 
dataverse is. The third one does the same thing as the second but uses a 
slightly older AQL syntax.</p>
+<div class="section">
+<h5><a name="Examples"></a>Examples</h5>
+
+<div class="source">
+<div class="source">
+<pre>dataset SalesDV.Customers
+dataset Customers
+dataset(&quot;Customers&quot;)
+</pre></div></div></div></div>
+<div class="section">
+<h4><a name="Constructors"></a>Constructors</h4>
+
+<div class="source">
+<div class="source">
+<pre>ListConstructor          ::= ( OrderedListConstructor | 
UnorderedListConstructor )
+OrderedListConstructor   ::= &quot;[&quot; ( Expression ( &quot;,&quot; 
Expression )* )? &quot;]&quot;
+UnorderedListConstructor ::= &quot;{{&quot; ( Expression ( &quot;,&quot; 
Expression )* )? &quot;}}&quot;
+ObjectConstructor        ::= &quot;{&quot; ( FieldBinding ( &quot;,&quot; 
FieldBinding )* )? &quot;}&quot;
+FieldBinding             ::= Expression &quot;:&quot; Expression
+</pre></div></div>
+<p>A major feature of AQL is its ability to construct new ADM data instances. 
This is accomplished using its constructors for each of the major ADM complex 
object structures, namely lists (ordered or unordered) and objects. Ordered 
lists are like JSON arrays, while unordered lists have bag (multiset) 
semantics. Objects are built from attributes that are field-name/field-value 
pairs, again like JSON. (See the AsterixDB Data Model document for more details 
on each.)</p>
+<p>The following examples illustrate how to construct a new ordered list with 
3 items, a new unordered list with 4 items, and a new object with 2 fields, 
respectively. List elements can be homogeneous (as in the first example), which 
is the common case, or they may be heterogeneous (as in the second example). 
The data values and field name values used to construct lists and objects in 
constructors are all simply AQL expressions. Thus the list elements, field 
names, and field values used in constructors can be simple literals (as in 
these three examples) or they can come from query variable references or even 
arbitrarily complex AQL expressions.</p>
+<div class="section">
+<h5><a name="Examples"></a>Examples</h5>
+
+<div class="source">
+<div class="source">
+<pre>[ &quot;a&quot;, &quot;b&quot;, &quot;c&quot; ]
+
+{{ 42, &quot;forty-two&quot;, &quot;AsterixDB!&quot;, 3.14f }}
+
+{
+  &quot;project name&quot;: &quot;AsterixDB&quot;
+  &quot;project members&quot;: {{ &quot;vinayakb&quot;, &quot;dtabass&quot;, 
&quot;chenli&quot; }}
+}
+</pre></div></div></div>
+<div class="section">
+<h5><a name="Note"></a>Note</h5>
+<p>When constructing nested objects there needs to be a space between the 
closing braces to avoid confusion with the <tt>}}</tt> token that ends an 
unordered list constructor: <tt>{ &quot;a&quot; : { &quot;b&quot; : 
&quot;c&quot; }}</tt> will fail to parse while <tt>{ &quot;a&quot; : { 
&quot;b&quot; : &quot;c&quot; } }</tt> will work.</p></div></div></div>
+<div class="section">
+<h3><a name="Path_Expressions"></a>Path Expressions</h3>
+
+<div class="source">
+<div class="source">
+<pre>ValueExpr ::= PrimaryExpr ( Field | Index )*
+Field     ::= &quot;.&quot; Identifier
+Index     ::= &quot;[&quot; ( Expression | &quot;?&quot; ) &quot;]&quot;
+</pre></div></div>
+<p>Components of complex types in ADM are accessed via path expressions. Path 
access can be applied to the result of an AQL expression that yields an 
instance of such a type, e.g., a object or list instance. For objects, path 
access is based on field names. For ordered lists, path access is based on 
(zero-based) array-style indexing. AQL also supports an &#x201c;I&#x2019;m 
feeling lucky&#x201d; style index accessor, [?], for selecting an arbitrary 
element from an ordered list. Attempts to access non-existent fields or list 
elements produce a null (i.e., missing information) result as opposed to 
signaling a runtime error.</p>
+<p>The following examples illustrate field access for a object, index-based 
element access for an ordered list, and also a composition thereof.</p>
+<div class="section">
+<div class="section">
+<h5><a name="Examples"></a>Examples</h5>
+
+<div class="source">
+<div class="source">
+<pre>({&quot;list&quot;: [ &quot;a&quot;, &quot;b&quot;, &quot;c&quot;]}).list
+
+([&quot;a&quot;, &quot;b&quot;, &quot;c&quot;])[2]
+
+({ &quot;list&quot;: [ &quot;a&quot;, &quot;b&quot;, &quot;c&quot;]}).list[2]
+</pre></div></div></div></div></div>
+<div class="section">
+<h3><a name="Logical_Expressions"></a>Logical Expressions</h3>
+
+<div class="source">
+<div class="source">
+<pre>OperatorExpr ::= AndExpr ( &quot;or&quot; AndExpr )*
+AndExpr      ::= RelExpr ( &quot;and&quot; RelExpr )*
+</pre></div></div>
+<p>As in most languages, boolean expressions can be built up from smaller 
expressions by combining them with the logical connectives and/or. Legal 
boolean values in AQL are true, false, and null. (Nulls in AQL are treated much 
like SQL treats its unknown truth value in boolean expressions.)</p>
+<p>The following is an example of a conjuctive range predicate in AQL. It will 
yield true if $a is bound to 4, null if $a is bound to null, and false 
otherwise.</p>
+<div class="section">
+<div class="section">
+<h5><a name="Example"></a>Example</h5>
+
+<div class="source">
+<div class="source">
+<pre>$a &gt; 3 and $a &lt; 5
+</pre></div></div></div></div></div>
+<div class="section">
+<h3><a name="Comparison_Expressions"></a>Comparison Expressions</h3>
+
+<div class="source">
+<div class="source">
+<pre>RelExpr ::= AddExpr ( ( &quot;&lt;&quot; | &quot;&gt;&quot; | 
&quot;&lt;=&quot; | &quot;&gt;=&quot; | &quot;=&quot; | &quot;!=&quot; | 
&quot;~=&quot; ) AddExpr )?
+</pre></div></div>
+<p>AQL has the usual list of suspects, plus one, for comparing pairs of atomic 
values. The &#x201c;plus one&#x201d; is the last operator listed above, which 
is the &#x201c;roughly equal&#x201d; operator provided for similarity queries. 
(See the separate document on <a href="similarity.html">AsterixDB Similarity 
Queries</a> for more details on similarity matching.)</p>
+<p>An example comparison expression (which yields the boolean value true) is 
shown below.</p>
+<div class="section">
+<div class="section">
+<h5><a name="Example"></a>Example</h5>
+
+<div class="source">
+<div class="source">
+<pre>5 &gt; 3
+</pre></div></div></div></div></div>
+<div class="section">
+<h3><a name="Arithmetic_Expressions"></a>Arithmetic Expressions</h3>
+
+<div class="source">
+<div class="source">
+<pre>AddExpr  ::= MultExpr ( ( &quot;+&quot; | &quot;-&quot; ) MultExpr )*
+MultExpr ::= UnaryExpr ( ( &quot;*&quot; | &quot;/&quot; | &quot;%&quot; | 
&quot;^&quot;| &quot;idiv&quot; ) UnaryExpr )*
+UnaryExpr ::= ( ( &quot;+&quot; | &quot;-&quot; ) )? ValueExpr
+</pre></div></div>
+<p>AQL also supports the usual cast of characters for arithmetic expressions. 
The example below evaluates to 25.</p>
+<div class="section">
+<div class="section">
+<h5><a name="Example"></a>Example</h5>
+
+<div class="source">
+<div class="source">
+<pre>3 ^ 2 + 4 ^ 2
+</pre></div></div></div></div></div>
+<div class="section">
+<h3><a name="FLWOR_Expression"></a>FLWOR Expression</h3>
+
+<div class="source">
+<div class="source">
+<pre>FLWOR         ::= ( ForClause | LetClause ) ( Clause )* 
(&quot;return&quot;|&quot;select&quot;) Expression
+Clause         ::= ForClause | LetClause | WhereClause | OrderbyClause
+                 | GroupClause | LimitClause | DistinctClause
+ForClause      ::= (&quot;for&quot;|&quot;from&quot;) Variable ( 
&quot;at&quot; Variable )? &quot;in&quot; ( Expression )
+LetClause      ::= (&quot;let&quot;|&quot;with&quot;) Variable &quot;:=&quot; 
Expression
+WhereClause    ::= &quot;where&quot; Expression
+OrderbyClause  ::= &quot;order&quot; &quot;by&quot; Expression ( ( 
&quot;asc&quot; ) | ( &quot;desc&quot; ) )?
+                   ( &quot;,&quot; Expression ( ( &quot;asc&quot; ) | ( 
&quot;desc&quot; ) )? )*
+GroupClause    ::= &quot;group&quot; &quot;by&quot; ( Variable &quot;:=&quot; 
)? Expression ( &quot;,&quot; ( Variable &quot;:=&quot; )? Expression )*
+                   (&quot;with&quot;|&quot;keeping&quot;) VariableRef ( 
&quot;,&quot; VariableRef )*
+LimitClause    ::= &quot;limit&quot; Expression ( &quot;offset&quot; 
Expression )?
+DistinctClause ::= &quot;distinct&quot; &quot;by&quot; Expression ( 
&quot;,&quot; Expression )*
+Variable       ::= &lt;VARIABLE&gt;
+</pre></div></div>
+<p>The heart of AQL is the FLWOR (for-let-where-orderby-return) expression. 
The roots of this expression were borrowed from the expression of the same name 
in XQuery. A FLWOR expression starts with one or more clauses that establish 
variable bindings. A <tt>for</tt> clause binds a variable incrementally to each 
element of its associated expression; it includes an optional positional 
variable for counting/numbering the bindings. By default no ordering is implied 
or assumed by a <tt>for</tt> clause. A <tt>let</tt> clause binds a variable to 
the collection of elements computed by its associated expression.</p>
+<p>Following the initial <tt>for</tt> or <tt>let</tt> clause(s), a FLWOR 
expression may contain an arbitrary sequence of other clauses. The 
<tt>where</tt> clause in a FLWOR expression filters the preceding bindings via 
a boolean expression, much like a <tt>where</tt> clause does in a SQL query. 
The <tt>order by</tt> clause in a FLWOR expression induces an ordering on the 
data. The <tt>group by</tt> clause, discussed further below, forms groups based 
on its group by expressions, optionally naming the expressions&#x2019; values 
(which together form the grouping key for the expression). The <tt>with</tt> 
subclause of a <tt>group by</tt> clause specifies the variable(s) whose values 
should be grouped based on the grouping key(s); following the grouping clause, 
only the grouping key(s) and the variables named in the with subclause remain 
in scope, and the named grouping variables now contain lists formed from their 
input values. The <tt>limit</tt> clause caps the number of values returne
 d, optionally starting its result count from a specified offset. (Web 
applications can use this feature for doing pagination.) The <tt>distinct</tt> 
clause is similar to the <tt>group-by</tt> clause, but it forms no groups; it 
serves only to eliminate duplicate values. As indicated by the grammar, the 
clauses in an AQL query can appear in any order. To interpret a query, one can 
think of data as flowing down through the query from the first clause to the 
<tt>return</tt> clause.</p>
+<p>The following example shows a FLWOR expression that selects and returns one 
user from the dataset FacebookUsers.</p>
+<div class="section">
+<div class="section">
+<h5><a name="Example"></a>Example</h5>
+
+<div class="source">
+<div class="source">
+<pre>for $user in dataset FacebookUsers
+where $user.id = 8
+return $user
+</pre></div></div>
+<p>The next example shows a FLWOR expression that joins two datasets, 
FacebookUsers and FacebookMessages, returning user/message pairs. The results 
contain one object per pair, with result objects containing the user&#x2019;s 
name and an entire message.</p></div>
+<div class="section">
+<h5><a name="Example"></a>Example</h5>
+
+<div class="source">
+<div class="source">
+<pre>for $user in dataset FacebookUsers
+for $message in dataset FacebookMessages
+where $message.author-id = $user.id
+return
+  {
+    &quot;uname&quot;: $user.name,
+    &quot;message&quot;: $message.message
+  };
+</pre></div></div>
+<p>In the next example, a <tt>let</tt> clause is used to bind a variable to 
all of a user&#x2019;s FacebookMessages. The query returns one object per user, 
with result objects containing the user&#x2019;s name and the set of all 
messages by that user.</p></div>
+<div class="section">
+<h5><a name="Example"></a>Example</h5>
+
+<div class="source">
+<div class="source">
+<pre>for $user in dataset FacebookUsers
+let $messages :=
+  for $message in dataset FacebookMessages
+  where $message.author-id = $user.id
+  return $message.message
+return
+  {
+    &quot;uname&quot;: $user.name,
+    &quot;messages&quot;: $messages
+  };
+</pre></div></div>
+<p>The following example returns all TwitterUsers ordered by their followers 
count (most followers first) and language. When ordering <tt>null</tt> is 
treated as being smaller than any other value if <tt>null</tt>s are encountered 
in the ordering key(s).</p></div>
+<div class="section">
+<h5><a name="Example"></a>Example</h5>
+
+<div class="source">
+<div class="source">
+<pre>  for $user in dataset TwitterUsers
+  order by $user.followers_count desc, $user.lang asc
+  return $user
+</pre></div></div>
+<p>The next example illustrates the use of the <tt>group by</tt> clause in 
AQL. After the <tt>group by</tt> clause in the query, only variables that are 
either in the <tt>group by</tt> list or in the <tt>with</tt> list are in scope. 
The variables in the clause&#x2019;s <tt>with</tt> list will each contain a 
collection of items following the <tt>group by</tt> clause; the collected items 
are the values that the source variable was bound to in the tuples that formed 
the group. For grouping <tt>null</tt> is handled as a single value.</p></div>
+<div class="section">
+<h5><a name="Example"></a>Example</h5>
+
+<div class="source">
+<div class="source">
+<pre>  for $x in dataset FacebookMessages
+  let $messages := $x.message
+  group by $loc := $x.sender-location with $messages
+  return
+    {
+      &quot;location&quot; : $loc,
+      &quot;message&quot; : $messages
+    }
+</pre></div></div>
+<p>The use of the <tt>limit</tt> clause is illustrated in the next 
example.</p></div>
+<div class="section">
+<h5><a name="Example"></a>Example</h5>
+
+<div class="source">
+<div class="source">
+<pre>  for $user in dataset TwitterUsers
+  order by $user.followers_count desc
+  limit 2
+  return $user
+</pre></div></div>
+<p>The final example shows how AQL&#x2019;s <tt>distinct by</tt> clause works. 
Each variable in scope before the distinct clause is also in scope after the 
<tt>distinct by</tt> clause. This clause works similarly to <tt>group by</tt>, 
but for each variable that contains more than one value after the <tt>distinct 
by</tt> clause, one value is picked nondeterministically. (If the variable is 
in the <tt>distinct by</tt> list, then its value will be deterministic.) Nulls 
are treated as a single value when they occur in a grouping field.</p></div>
+<div class="section">
+<h5><a name="Example"></a>Example</h5>
+
+<div class="source">
+<div class="source">
+<pre>  for $x in dataset FacebookMessages
+  distinct by $x.sender-location
+  return
+    {
+      &quot;location&quot; : $x.sender-location,
+      &quot;message&quot; : $x.message
+    }
+</pre></div></div>
+<p>In order to allow SQL fans to write queries in their favored ways, AQL 
provides synonyms: <i>from</i> for <i>for</i>, <i>select</i> for <i>return</i>, 
<i>with</i> for <i>let</i>, and <i>keeping</i> for <i>with</i> in the group by 
clause. The following query is such an example.</p></div>
+<div class="section">
+<h5><a name="Example"></a>Example</h5>
+
+<div class="source">
+<div class="source">
+<pre>  from $x in dataset FacebookMessages
+  with $messages := $x.message
+  group by $loc := $x.sender-location keeping $messages
+  select
+    {
+      &quot;location&quot; : $loc,
+      &quot;message&quot; : $messages
+    }
+</pre></div></div></div></div></div>
+<div class="section">
+<h3><a name="Conditional_Expression"></a>Conditional Expression</h3>
+
+<div class="source">
+<div class="source">
+<pre>IfThenElse ::= &quot;if&quot; &quot;(&quot; Expression &quot;)&quot; 
&quot;then&quot; Expression &quot;else&quot; Expression
+</pre></div></div>
+<p>A conditional expression is useful for choosing between two alternative 
values based on a boolean condition. If its first (<tt>if</tt>) expression is 
true, its second (<tt>then</tt>) expression&#x2019;s value is returned, and 
otherwise its third (<tt>else</tt>) expression is returned.</p>
+<p>The following example illustrates the form of a conditional expression.</p>
+<div class="section">
+<div class="section">
+<h5><a name="Example"></a>Example</h5>
+
+<div class="source">
+<div class="source">
+<pre>if (2 &lt; 3) then &quot;yes&quot; else &quot;no&quot;
+</pre></div></div></div></div></div>
+<div class="section">
+<h3><a name="Quantified_Expressions"></a>Quantified Expressions</h3>
+
+<div class="source">
+<div class="source">
+<pre>QuantifiedExpression ::= ( ( &quot;some&quot; ) | ( &quot;every&quot; ) ) 
Variable &quot;in&quot; Expression
+                         ( &quot;,&quot; Variable &quot;in&quot; Expression )* 
&quot;satisfies&quot; Expression
+</pre></div></div>
+<p>Quantified expressions are used for expressing existential or universal 
predicates involving the elements of a collection.</p>
+<p>The following pair of examples illustrate the use of a quantified 
expression to test that every (or some) element in the set [1, 2, 3] of 
integers is less than three. The first example yields <tt>false</tt> and second 
example yields <tt>true</tt>.</p>
+<p>It is useful to note that if the set were instead the empty set, the first 
expression would yield <tt>true</tt> (&#x201c;every&#x201d; value in an empty 
set satisfies the condition) while the second expression would yield 
<tt>false</tt> (since there isn&#x2019;t &#x201c;some&#x201d; value, as there 
are no values in the set, that satisfies the condition).</p>
+<div class="section">
+<div class="section">
+<h5><a name="Examples"></a>Examples</h5>
+
+<div class="source">
+<div class="source">
+<pre>every $x in [ 1, 2, 3 ] satisfies $x &lt; 3
+some $x in [ 1, 2, 3 ] satisfies $x &lt; 3
+</pre></div></div></div></div></div></div>
+<div class="section">
+<h2><a name="a3._Statements_Back_to_TOC"></a><a name="Statements" 
id="Statements">3. Statements</a> <font size="4"><a href="#toc">[Back to 
TOC]</a></font></h2>
+
+<div class="source">
+<div class="source">
+<pre>Statement ::= ( SingleStatement ( &quot;;&quot; )? )* &lt;EOF&gt;
+SingleStatement ::= DataverseDeclaration
+                  | FunctionDeclaration
+                  | CreateStatement
+                  | DropStatement
+                  | LoadStatement
+                  | SetStatement
+                  | InsertStatement
+                  | DeleteStatement
+                  | UpsertStatement
+                  | Query
+</pre></div></div>
+<p>In addition to expresssions for queries, AQL supports a variety of 
statements for data definition and manipulation purposes as well as controlling 
the context to be used in evaluating AQL expressions. AQL supports object-level 
ACID transactions that begin and terminate implicitly for each object inserted, 
deleted, upserted, or searched while a given AQL statement is being 
executed.</p>
+<p>This section details the statements supported in the AQL language.</p>
+<div class="section">
+<h3><a name="Declarations"></a>Declarations</h3>
+
+<div class="source">
+<div class="source">
+<pre>DataverseDeclaration ::= &quot;use&quot; &quot;dataverse&quot; Identifier
+</pre></div></div>
+<p>The world of data in an AsterixDB cluster is organized into data namespaces 
called dataverses. To set the default dataverse for a series of statements, the 
use dataverse statement is provided.</p>
+<p>As an example, the following statement sets the default dataverse to be 
TinySocial.</p>
+<div class="section">
+<div class="section">
+<h5><a name="Example"></a>Example</h5>
+
+<div class="source">
+<div class="source">
+<pre>use dataverse TinySocial;
+</pre></div></div>
+<p>The set statement in AQL is used to control aspects of the expression 
evalation context for queries.</p>
+
+<div class="source">
+<div class="source">
+<pre>SetStatement ::= &quot;set&quot; Identifier StringLiteral
+</pre></div></div>
+<p>As an example, the following set statements request that Jaccard similarity 
with a similarity threshold 0.6 be used for set similarity matching when the ~= 
operator is used in a query expression.</p></div>
+<div class="section">
+<h5><a name="Example"></a>Example</h5>
+
+<div class="source">
+<div class="source">
+<pre>set simfunction &quot;jaccard&quot;;
+set simthreshold &quot;0.6f&quot;;
+</pre></div></div>
+<p>When writing a complex AQL query, it can sometimes be helpful to define one 
or more auxilliary functions that each address a sub-piece of the overall 
query. The declare function statement supports the creation of such helper 
functions.</p>
+
+<div class="source">
+<div class="source">
+<pre>FunctionDeclaration  ::= &quot;declare&quot; &quot;function&quot; 
Identifier ParameterList &quot;{&quot; Expression &quot;}&quot;
+ParameterList        ::= &quot;(&quot; ( &lt;VARIABLE&gt; ( &quot;,&quot; 
&lt;VARIABLE&gt; )* )? &quot;)&quot;
+</pre></div></div>
+<p>The following is a very simple example of a temporary AQL function 
definition.</p></div>
+<div class="section">
+<h5><a name="Example"></a>Example</h5>
+
+<div class="source">
+<div class="source">
+<pre>declare function add($a, $b) {
+  $a + $b
+};
+</pre></div></div></div></div></div>
+<div class="section">
+<h3><a name="Lifecycle_Management_Statements"></a>Lifecycle Management 
Statements</h3>
+
+<div class="source">
+<div class="source">
+<pre>CreateStatement ::= &quot;create&quot; ( DataverseSpecification
+                             | TypeSpecification
+                             | DatasetSpecification
+                             | IndexSpecification
+                             | FunctionSpecification )
+
+QualifiedName       ::= Identifier ( &quot;.&quot; Identifier )?
+DoubleQualifiedName ::= Identifier &quot;.&quot; Identifier ( &quot;.&quot; 
Identifier )?
+</pre></div></div>
+<p>The create statement in AQL is used for creating persistent artifacts in 
the context of dataverses. It can be used to create new dataverses, datatypes, 
datasets, indexes, and user-defined AQL functions.</p>
+<div class="section">
+<h4><a name="Dataverses"></a>Dataverses</h4>
+
+<div class="source">
+<div class="source">
+<pre>DataverseSpecification ::= &quot;dataverse&quot; Identifier IfNotExists ( 
&quot;with format&quot; StringLiteral )?
+</pre></div></div>
+<p>The create dataverse statement is used to create new dataverses. To ease 
the authoring of reusable AQL scripts, its optional IfNotExists clause allows 
creation to be requested either unconditionally or only if the the dataverse 
does not already exist. If this clause is absent, an error will be returned if 
the specified dataverse already exists. The <tt>with format</tt> clause is a 
placeholder for future functionality that can safely be ignored.</p>
+<p>The following example creates a dataverse named TinySocial.</p>
+<div class="section">
+<h5><a name="Example"></a>Example</h5>
+
+<div class="source">
+<div class="source">
+<pre>create dataverse TinySocial;
+</pre></div></div></div></div>
+<div class="section">
+<h4><a name="Types"></a>Types</h4>
+
+<div class="source">
+<div class="source">
+<pre>TypeSpecification    ::= &quot;type&quot; FunctionOrTypeName IfNotExists 
&quot;as&quot; TypeExpr
+FunctionOrTypeName   ::= QualifiedName
+IfNotExists          ::= ( &quot;if not exists&quot; )?
+TypeExpr             ::= ObjectTypeDef | TypeReference | OrderedListTypeDef | 
UnorderedListTypeDef
+ObjectTypeDef        ::= ( &quot;closed&quot; | &quot;open&quot; )? 
&quot;{&quot; ( ObjectField ( &quot;,&quot; ObjectField )* )? &quot;}&quot;
+ObjectField          ::= Identifier &quot;:&quot; ( TypeExpr ) ( &quot;?&quot; 
)?
+NestedField          ::= Identifier ( &quot;.&quot; Identifier )*
+IndexField           ::= NestedField ( &quot;:&quot; TypeReference )?
+TypeReference        ::= Identifier
+OrderedListTypeDef   ::= &quot;[&quot; ( TypeExpr ) &quot;]&quot;
+UnorderedListTypeDef ::= &quot;{{&quot; ( TypeExpr ) &quot;}}&quot;
+</pre></div></div>
+<p>The create type statement is used to create a new named ADM datatype. This 
type can then be used to create datasets or utilized when defining one or more 
other ADM datatypes. Much more information about the Asterix Data Model (ADM) 
is available in the <a href="datamodel.html">data model reference guide</a> to 
ADM. A new type can be a object type, a renaming of another type, an ordered 
list type, or an unordered list type. A object type can be defined as being 
either open or closed. Instances of a closed object type are not permitted to 
contain fields other than those specified in the create type statement. 
Instances of an open object type may carry additional fields, and open is the 
default for a new type (if neither option is specified).</p>
+<p>The following example creates a new ADM object type called FacebookUser 
type. Since it is closed, its instances will contain only what is specified in 
the type definition. The first four fields are traditional typed name/value 
pairs. The friend-ids field is an unordered list of 32-bit integers. The 
employment field is an ordered list of instances of another named object type, 
EmploymentType.</p>
+<div class="section">
+<h5><a name="Example"></a>Example</h5>
+
+<div class="source">
+<div class="source">
+<pre>create type FacebookUserType as closed {
+  &quot;id&quot; :         int32,
+  &quot;alias&quot; :      string,
+  &quot;name&quot; :       string,
+  &quot;user-since&quot; : datetime,
+  &quot;friend-ids&quot; : {{ int32 }},
+  &quot;employment&quot; : [ EmploymentType ]
+}
+</pre></div></div>
+<p>The next example creates a new ADM object type called FbUserType. Note that 
the type of the id field is UUID. You need to use this field type if you want 
to have this field be an autogenerated-PK field. Refer to the Datasets section 
later for more details.</p></div>
+<div class="section">
+<h5><a name="Example"></a>Example</h5>
+
+<div class="source">
+<div class="source">
+<pre>create type FbUserType as closed {
+  &quot;id&quot; :         uuid,
+  &quot;alias&quot; :      string,
+  &quot;name&quot; :       string
+}
+</pre></div></div></div></div>
+<div class="section">
+<h4><a name="Datasets"></a>Datasets</h4>
+
+<div class="source">
+<div class="source">
+<pre>DatasetSpecification ::= &quot;internal&quot;? &quot;dataset&quot; 
QualifiedName &quot;(&quot; QualifiedName &quot;)&quot; IfNotExists
+                         PrimaryKey ( &quot;on&quot; Identifier )? ( 
&quot;hints&quot; Properties )?
+                         ( &quot;using&quot; &quot;compaction&quot; 
&quot;policy&quot; CompactionPolicy ( Configuration )? )?
+                         ( &quot;with filter on&quot; Identifier )?
+                       | &quot;external&quot; &quot;dataset&quot; 
QualifiedName &quot;(&quot; QualifiedName &quot;)&quot; IfNotExists
+                         &quot;using&quot; AdapterName Configuration ( 
&quot;hints&quot; Properties )?
+                         ( &quot;using&quot; &quot;compaction&quot; 
&quot;policy&quot; CompactionPolicy ( Configuration )? )?
+AdapterName          ::= Identifier
+Configuration        ::= &quot;(&quot; ( KeyValuePair ( &quot;,&quot; 
KeyValuePair )* )? &quot;)&quot;
+KeyValuePair         ::= &quot;(&quot; StringLiteral &quot;=&quot; 
StringLiteral &quot;)&quot;
+Properties           ::= ( &quot;(&quot; Property ( &quot;,&quot; Property )* 
&quot;)&quot; )?
+Property             ::= Identifier &quot;=&quot; ( StringLiteral | 
IntegerLiteral )
+FunctionSignature    ::= FunctionOrTypeName &quot;@&quot; IntegerLiteral
+PrimaryKey           ::= &quot;primary&quot; &quot;key&quot; NestedField ( 
&quot;,&quot; NestedField )* ( &quot;autogenerated &quot;)?
+CompactionPolicy     ::= Identifier
+PrimaryKey           ::= &quot;primary&quot; &quot;key&quot; Identifier ( 
&quot;,&quot; Identifier )* ( &quot;autogenerated &quot;)?
+</pre></div></div>
+<p>The create dataset statement is used to create a new dataset. Datasets are 
named, unordered collections of ADM object instances; they are where data lives 
persistently and are the targets for queries in AsterixDB. Datasets are typed, 
and AsterixDB will ensure that their contents conform to their type 
definitions. An Internal dataset (the default) is a dataset that is stored in 
and managed by AsterixDB. It must have a specified unique primary key that can 
be used to partition data across nodes of an AsterixDB cluster. The primary key 
is also used in secondary indexes to uniquely identify the indexed primary data 
objects. Random primary key (UUID) values can be auto-generated by declaring 
the field to be UUID and putting &#x201c;autogenerated&#x201d; after the 
&#x201c;primary key&#x201d; identifier. In this case, values for the 
auto-generated PK field should not be provided by the user since it will be 
auto-generated by AsterixDB. Optionally, a filter can be created on a field to f
 urther optimize range queries with predicates on the filter&#x2019;s field. 
(Refer to <a href="filters.html">Filter-Based LSM Index Acceleration</a> for 
more information about filters.)</p>
+<p>An External dataset is stored outside of AsterixDB (currently datasets in 
HDFS or on the local filesystem(s) of the cluster&#x2019;s nodes are 
supported). External dataset support allows AQL queries to treat external data 
as though it were stored in AsterixDB, making it possible to query 
&#x201c;legacy&#x201d; file data (e.g., Hive data) without having to physically 
import it into AsterixDB. For an external dataset, an appropriate adapter must 
be selected to handle the nature of the desired external data. (See the <a 
href="externaldata.html">guide to external data</a> for more information on the 
available adapters.)</p>
+<p>When creating a dataset, it is possible to choose a merge policy that 
controls which of the underlaying LSM storage components to be merged. 
Currently, AsterixDB provides four different merge policies that can be 
configured per dataset: no-merge, constant, prefix, and correlated-prefix. The 
no-merge policy simply never merges disk components. While the constant policy 
merges disk components when the number of components reaches some constant 
number k, which can be configured by the user. The prefix policy relies on 
component sizes and the number of components to decide which components to 
merge. Specifically, it works by first trying to identify the smallest ordered 
(oldest to newest) sequence of components such that the sequence does not 
contain a single component that exceeds some threshold size M and that either 
the sum of the component&#x2019;s sizes exceeds M or the number of components 
in the sequence exceeds another threshold C. If such a sequence of components 
exists, the
 n each of the components in the sequence are merged together to form a single 
component. Finally, the correlated-prefix is similar to the prefix policy but 
it delegates the decision of merging the disk components of all the indexes in 
a dataset to the primary index. When the policy decides that the primary index 
needs to be merged (using the same decision criteria as for the prefix policy), 
then it will issue successive merge requests on behalf of all other indexes 
associated with the same dataset. The default policy for AsterixDB is the 
prefix policy except when there is a filter on a dataset, where the preferred 
policy for filters is the correlated-prefix.</p>
+<p>The following example creates an internal dataset for storing 
FacefookUserType objects. It specifies that their id field is their primary 
key.</p>
+<div class="section">
+<h5><a name="Example"></a>Example</h5>
+
+<div class="source">
+<div class="source">
+<pre>create internal dataset FacebookUsers(FacebookUserType) primary key id;
+</pre></div></div>
+<p>The following example creates an internal dataset for storing FbUserType 
objects. It specifies that their id field is their primary key. It also 
specifies that the id field is an auto-generated field, meaning that a randomly 
generated UUID value will be assigned to each object by the system. (A user 
should therefore not proivde a value for this field.) Note that the id field 
should be UUID.</p></div>
+<div class="section">
+<h5><a name="Example"></a>Example</h5>
+
+<div class="source">
+<div class="source">
+<pre>create internal dataset FbMsgs(FbUserType) primary key id autogenerated;
+</pre></div></div>
+<p>The next example creates an external dataset for storing LineitemType 
objects. The choice of the <tt>hdfs</tt> adapter means that its data will 
reside in HDFS. The create statement provides parameters used by the hdfs 
adapter: the URL and path needed to locate the data in HDFS and a description 
of the data format.</p></div>
+<div class="section">
+<h5><a name="Example"></a>Example</h5>
+
+<div class="source">
+<div class="source">
+<pre>create external dataset Lineitem('LineitemType) using hdfs (
+  (&quot;hdfs&quot;=&quot;hdfs://HOST:PORT&quot;),
+  (&quot;path&quot;=&quot;HDFS_PATH&quot;),
+  (&quot;input-format&quot;=&quot;text-input-format&quot;),
+  (&quot;format&quot;=&quot;delimited-text&quot;),
+  (&quot;delimiter&quot;=&quot;|&quot;));
+</pre></div></div></div></div>
+<div class="section">
+<h4><a name="Indices"></a>Indices</h4>
+
+<div class="source">
+<div class="source">
+<pre>IndexSpecification ::= &quot;index&quot; Identifier IfNotExists 
&quot;on&quot; QualifiedName
+                       &quot;(&quot; ( IndexField ) ( &quot;,&quot; IndexField 
)* &quot;)&quot; ( &quot;type&quot; IndexType )? ( &quot;enforced&quot; )?
+IndexType          ::= &quot;btree&quot;
+                     | &quot;rtree&quot;
+                     | &quot;keyword&quot;
+                     | &quot;ngram&quot; &quot;(&quot; IntegerLiteral 
&quot;)&quot;
+                     | &quot;fulltext&quot;
+</pre></div></div>
+<p>The create index statement creates a secondary index on one or more fields 
of a specified dataset. Supported index types include <tt>btree</tt> for 
totally ordered datatypes, <tt>rtree</tt> for spatial data, and 
<tt>keyword</tt>, <tt>ngram</tt>, and <tt>fulltext</tt> for textual (string) 
data. An index can be created on a nested field (or fields) by providing a 
valid path expression as an index field identifier. An index field is not 
required to be part of the datatype associated with a dataset if that datatype 
is declared as open and the field&#x2019;s type is provided along with its type 
and the <tt>enforced</tt> keyword is specified in the end of index definition. 
<tt>Enforcing</tt> an open field will introduce a check that will make sure 
that the actual type of an indexed field (if the field exists in the object) 
always matches this specified (open) field type.</p>
+<p>The following example creates a btree index called fbAuthorIdx on the 
author-id field of the FacebookMessages dataset. This index can be useful for 
accelerating exact-match queries, range search queries, and joins involving the 
author-id field.</p>
+<div class="section">
+<h5><a name="Example"></a>Example</h5>
+
+<div class="source">
+<div class="source">
+<pre>create index fbAuthorIdx on FacebookMessages(author-id) type btree;
+</pre></div></div>
+<p>The following example creates an open btree index called fbSendTimeIdx on 
the open send-time field of the FacebookMessages dataset having datetime type. 
This index can be useful for accelerating exact-match queries, range search 
queries, and joins involving the send-time field.</p></div>
+<div class="section">
+<h5><a name="Example"></a>Example</h5>
+
+<div class="source">
+<div class="source">
+<pre>create index fbSendTimeIdx on FacebookMessages(send-time:datetime) type 
btree enforced;
+</pre></div></div>
+<p>The following example creates a btree index called twUserScrNameIdx on the 
screen-name field, which is a nested field of the user field in the 
TweetMessages dataset. This index can be useful for accelerating exact-match 
queries, range search queries, and joins involving the screen-name 
field.</p></div>
+<div class="section">
+<h5><a name="Example"></a>Example</h5>
+
+<div class="source">
+<div class="source">
+<pre>create index twUserScrNameIdx on TweetMessages(user.screen-name) type 
btree;
+</pre></div></div>
+<p>The following example creates an rtree index called fbSenderLocIdx on the 
sender-location field of the FacebookMessages dataset. This index can be useful 
for accelerating queries that use the <a 
href="functions.html#spatial-intersect"><tt>spatial-intersect</tt> function</a> 
in a predicate involving the sender-location field.</p></div>
+<div class="section">
+<h5><a name="Example"></a>Example</h5>
+
+<div class="source">
+<div class="source">
+<pre>create index fbSenderLocIndex on FacebookMessages(sender-location) type 
rtree;
+</pre></div></div>
+<p>The following example creates a 3-gram index called fbUserIdx on the name 
field of the FacebookUsers dataset. This index can be used to accelerate some 
similarity or substring maching queries on the name field. For details refer to 
the <a href="similarity.html#NGram_Index">document on similarity 
queries</a>.</p></div>
+<div class="section">
+<h5><a name="Example"></a>Example</h5>
+
+<div class="source">
+<div class="source">
+<pre>create index fbUserIdx on FacebookUsers(name) type ngram(3);
+</pre></div></div>
+<p>The following example creates a keyword index called fbMessageIdx on the 
message field of the FacebookMessages dataset. This keyword index can be used 
to optimize queries with token-based similarity predicates on the message 
field. For details refer to the <a 
href="similarity.html#Keyword_Index">document on similarity 
queries</a>.</p></div>
+<div class="section">
+<h5><a name="Example"></a>Example</h5>
+
+<div class="source">
+<div class="source">
+<pre>create index fbMessageIdx on FacebookMessages(message) type keyword;
+</pre></div></div>
+<p>The following example creates a full-text index called fbMessageIdx on the 
message field of the FacebookMessages dataset. This full-text index can be used 
to optimize queries with full-text search predicates on the message field. For 
details refer to the <a href="fulltext.html#toc">document on full-text 
queries</a>.</p></div>
+<div class="section">
+<h5><a name="Example"></a>Example</h5>
+
+<div class="source">
+<div class="source">
+<pre>create index fbMessageIdx on FacebookMessages(message) type fulltext;
+</pre></div></div></div></div>
+<div class="section">
+<h4><a name="Functions"></a>Functions</h4>
+<p>The create function statement creates a named function that can then be 
used and reused in AQL queries. The body of a function can be any AQL 
expression involving the function&#x2019;s parameters.</p>
+
+<div class="source">
+<div class="source">
+<pre>FunctionSpecification ::= &quot;function&quot; FunctionOrTypeName 
IfNotExists ParameterList &quot;{&quot; Expression &quot;}&quot;
+</pre></div></div>
+<p>The following is a very simple example of a create function statement. It 
differs from the declare function example shown previously in that it results 
in a function that is persistently registered by name in the specified 
dataverse.</p>
+<div class="section">
+<h5><a name="Example"></a>Example</h5>
+
+<div class="source">
+<div class="source">
+<pre>create function add($a, $b) {
+  $a + $b
+};
+</pre></div></div></div></div>
+<div class="section">
+<h4><a name="Removal"></a>Removal</h4>
+
+<div class="source">
+<div class="source">
+<pre>DropStatement       ::= &quot;drop&quot; ( &quot;dataverse&quot; 
Identifier IfExists
+                               | &quot;type&quot; FunctionOrTypeName IfExists
+                               | &quot;dataset&quot; QualifiedName IfExists
+                               | &quot;index&quot; DoubleQualifiedName IfExists
+                               | &quot;function&quot; FunctionSignature 
IfExists )
+IfExists            ::= ( &quot;if&quot; &quot;exists&quot; )?
+</pre></div></div>
+<p>The drop statement in AQL is the inverse of the create statement. It can be 
used to drop dataverses, datatypes, datasets, indexes, and functions.</p>
+<p>The following examples illustrate uses of the drop statement.</p>
+<div class="section">
+<h5><a name="Example"></a>Example</h5>
+
+<div class="source">
+<div class="source">
+<pre>drop dataset FacebookUsers if exists;
+
+drop index FacebookUsers.fbSenderLocIndex;
+
+drop type FacebookUserType;
+
+drop dataverse TinySocial;
+
+drop function add;
+</pre></div></div></div></div></div>
+<div class="section">
+<h3><a name="ImportExport_Statements"></a>Import/Export Statements</h3>
+
+<div class="source">
+<div class="source">
+<pre>LoadStatement  ::= &quot;load&quot; &quot;dataset&quot; QualifiedName 
&quot;using&quot; AdapterName Configuration ( &quot;pre-sorted&quot; )?
+</pre></div></div>
+<p>The load statement is used to initially populate a dataset via bulk loading 
of data from an external file. An appropriate adapter must be selected to 
handle the nature of the desired external data. The load statement accepts the 
same adapters and the same parameters as external datasets. (See the <a 
href="externaldata.html">guide to external data</a> for more information on the 
available adapters.) If a dataset has an auto-generated primary key field, a 
file to be imported should not include that field in it.</p>
+<p>The following example shows how to bulk load the FacebookUsers dataset from 
an external file containing data that has been prepared in ADM format.</p>
+<div class="section">
+<div class="section">
+<h5><a name="Example"></a>Example</h5>
+
+<div class="source">
+<div class="source">
+<pre>load dataset FacebookUsers using localfs
+((&quot;path&quot;=&quot;localhost:///Users/zuck/AsterixDB/load/fbu.adm&quot;),(&quot;format&quot;=&quot;adm&quot;));
+</pre></div></div></div></div></div>
+<div class="section">
+<h3><a name="Modification_Statements"></a>Modification Statements</h3>
+<div class="section">
+<h4><a name="Insert"></a>Insert</h4>
+
+<div class="source">
+<div class="source">
+<pre>InsertStatement ::= &quot;insert&quot; &quot;into&quot; 
&quot;dataset&quot; QualifiedName ( &quot;as&quot; Variable )? Query ( 
&quot;returning&quot; Query )?
+</pre></div></div>
+<p>The AQL insert statement is used to insert data into a dataset. The data to 
be inserted comes from an AQL query expression. The expression can be as simple 
as a constant expression, or in general it can be any legal AQL query. Inserts 
in AsterixDB are processed transactionally, with the scope of each insert 
transaction being the insertion of a single object plus its affiliated 
secondary index entries (if any). If the query part of an insert returns a 
single object, then the insert statement itself will be a single, atomic 
transaction. If the query part returns multiple objects, then each object 
inserted will be handled independently as a tranaction. If a dataset has an 
auto-generated primary key field, an insert statement should not include a 
value for that field in it. (The system will automatically extend the provided 
object with this additional field and a corresponding value.). The optional 
&#x201c;as Variable&#x201d; provides a variable binding for the inserted 
objects, whic
 h can be used in the &#x201c;returning&#x201d; clause. The optional 
&#x201c;returning Query&#x201d; allows users to run simple queries/functions on 
the objects returned by the insert. This query cannot refer to any datasets.</p>
+<p>The following example illustrates a query-based insertion.</p>
+<div class="section">
+<h5><a name="Example"></a>Example</h5>
+
+<div class="source">
+<div class="source">
+<pre>insert into dataset UsersCopy as $inserted (for $user in dataset 
FacebookUsers return $user ) returning $inserted.screen-name
+</pre></div></div></div></div>
+<div class="section">
+<h4><a name="Delete"></a>Delete</h4>
+
+<div class="source">
+<div class="source">
+<pre>DeleteStatement ::= &quot;delete&quot; Variable &quot;from&quot; 
&quot;dataset&quot; QualifiedName ( &quot;where&quot; Expression )?
+</pre></div></div>
+<p>The AQL delete statement is used to delete data from a target dataset. The 
data to be deleted is identified by a boolean expression involving the variable 
bound to the target dataset in the delete statement. Deletes in AsterixDB are 
processed transactionally, with the scope of each delete transaction being the 
deletion of a single object plus its affiliated secondary index entries (if 
any). If the boolean expression for a delete identifies a single object, then 
the delete statement itself will be a single, atomic transaction. If the 
expression identifies multiple objects, then each object deleted will be 
handled independently as a transaction.</p>
+<p>The following example illustrates a single-object deletion.</p>
+<div class="section">
+<h5><a name="Example"></a>Example</h5>
+
+<div class="source">
+<div class="source">
+<pre>delete $user from dataset FacebookUsers where $user.id = 8;
+</pre></div></div></div></div>
+<div class="section">
+<h4><a name="Upsert"></a>Upsert</h4>
+
+<div class="source">
+<div class="source">
+<pre>UpsertStatement ::= &quot;upsert&quot; &quot;into&quot; 
&quot;dataset&quot; QualifiedName Query
+</pre></div></div>
+<p>The AQL upsert statement is used to couple delete (if found) with insert 
data into a dataset. The data to be upserted comes from an AQL query 
expression. The expression can be as simple as a constant expression, or in 
general it can be any legal AQL query. Upserts in AsterixDB are processed 
transactionally, with the scope of each upsert transaction being the upsertion 
(deletion if found + insertion) of a single object plus its affiliated 
secondary index entries (if any). If the query part of an upsert returns a 
single object, then the upsert statement itself will be a single, atomic 
transaction. If the query part returns multiple objects, then each object 
upserted will be handled independently as a tranaction.</p>
+<p>The following example illustrates a query-based upsertion.</p>
+<div class="section">
+<h5><a name="Example"></a>Example</h5>
+
+<div class="source">
+<div class="source">
+<pre>upsert into dataset Users (for $user in dataset FacebookUsers return 
$user)
+</pre></div></div>
+<p>We close this guide to AQL with one final example of a query 
expression.</p></div>
+<div class="section">
+<h5><a name="Example"></a>Example</h5>
+
+<div class="source">
+<div class="source">
+<pre>for $praise in {{ &quot;great&quot;, &quot;brilliant&quot;, 
&quot;awesome&quot; }}
+return
+   string-concat([&quot;AsterixDB is &quot;, $praise])
+</pre></div></div></div></div></div></div>
+                  </div>
+            </div>
+          </div>
+
+    <hr/>
+
+    <footer>
+            <div class="container-fluid">
+              <div class="row span12">Copyright &copy;                    2017
+                        <a href="https://www.apache.org/";>The Apache Software 
Foundation</a>.
+            All Rights Reserved.      
+                    
+      </div>
+
+                                                                  <?xml 
version="1.0" encoding="UTF-8"?>
+<div class="row-fluid">Apache AsterixDB, AsterixDB, Apache, the Apache
+        feather logo, and the Apache AsterixDB project logo are either
+        registered trademarks or trademarks of The Apache Software
+        Foundation in the United States and other countries.
+        All other marks mentioned may be trademarks or registered
+        trademarks of their respective owners.</div>
+                  
+        
+                </div>
+    </footer>
+  </body>
+</html>

Reply via email to