diff --git a/aql/functions.html b/aql/functions.html
new file mode 100644
index 0000000..62df709
--- /dev/null
+++ b/aql/functions.html
@@ -0,0 +1,4740 @@
+<!DOCTYPE html>
+<!--
+ | Generated by Apache Maven Doxia at 2015-05-29
+ | 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="20150529" />
+    <meta http-equiv="Content-Language" content="en" />
+    <title>AsterixDB - </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>
+
+    
+            </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">                  <a href="http://incubator.apache.org/" id="bannerRight">
+                                                                                                <img src="../images/egg-logo.png"  alt="Apache Software Foundation Incubator"/>
+                </a>
+      </div>
+        <div class="clear"><hr/></div>
+      </div>
+
+      <div id="breadcrumbs">
+        <ul class="breadcrumb">
+                
+                    
+                  <li id="publishDate">Last Published: 2015-05-29</li>
+                      
+                
+                    
+                 <li id="projectVersion" class="pull-right">Version: 0.8.7-SNAPSHOT</li>
+      
+                                            <li class="divider pull-right">|</li>
+                        
+    <li class="pull-right">              <a href="../index.html" title="Home">
+        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">Apache Software Foundation</li>
+                                
+      <li>
+    
+                          <a href="http://www.apache.org/" class="externalLink" title="Home">
+          <i class="none"></i>
+        Home</a>
+            </li>
+                  
+      <li>
+    
+                          <a href="http://www.apache.org/foundation/sponsorship.html" class="externalLink" title="Donate">
+          <i class="none"></i>
+        Donate</a>
+            </li>
+                  
+      <li>
+    
+                          <a href="http://www.apache.org/foundation/thanks.html" class="externalLink" title="Thanks">
+          <i class="none"></i>
+        Thanks</a>
+            </li>
+                  
+      <li>
+    
+                          <a href="http://www.apache.org/security/" class="externalLink" title="Security">
+          <i class="none"></i>
+        Security</a>
+            </li>
+                              <li class="nav-header">User Documentation</li>
+                                
+      <li>
+    
+                          <a href="../install.html" title="Installing and Managing AsterixDB using Managix">
+          <i class="none"></i>
+        Installing and Managing AsterixDB using Managix</a>
+            </li>
+                  
+      <li>
+    
+                          <a href="../aql/primer.html" title="AsterixDB 101: An ADM and AQL Primer">
+          <i class="none"></i>
+        AsterixDB 101: An ADM and AQL Primer</a>
+            </li>
+                  
+      <li>
+    
+                          <a href="../aql/primer-sql-like.html" title="AsterixDB 101: An ADM and AQL Primer (For SQL Fans)">
+          <i class="none"></i>
+        AsterixDB 101: An ADM and AQL Primer (For SQL Fans)</a>
+            </li>
+                  
+      <li>
+    
+                          <a href="../aql/js-sdk.html" title="AsterixDB Javascript SDK">
+          <i class="none"></i>
+        AsterixDB Javascript SDK</a>
+            </li>
+                  
+      <li>
+    
+                          <a href="../aql/datamodel.html" title="Asterix Data Model (ADM)">
+          <i class="none"></i>
+        Asterix Data Model (ADM)</a>
+            </li>
+                  
+      <li>
+    
+                          <a href="../aql/manual.html" title="Asterix Query Language (AQL)">
+          <i class="none"></i>
+        Asterix Query Language (AQL)</a>
+            </li>
+                  
+      <li class="active">
+    
+            <a href="#"><i class="none"></i>AQL Functions</a>
+          </li>
+                  
+      <li>
+    
+                          <a href="../aql/allens.html" title="AQL Allen's Relations Functions">
+          <i class="none"></i>
+        AQL Allen's Relations Functions</a>
+            </li>
+                  
+      <li>
+    
+                          <a href="../aql/similarity.html" title="AQL Support of Similarity Queries">
+          <i class="none"></i>
+        AQL Support of Similarity 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="../aql/filters.html" title="Filter-Based LSM Index Acceleration">
+          <i class="none"></i>
+        Filter-Based LSM Index Acceleration</a>
+            </li>
+                  
+      <li>
+    
+                          <a href="../api.html" title="REST API to AsterixDB">
+          <i class="none"></i>
+        REST API to AsterixDB</a>
+            </li>
+            </ul>
+                
+                    
+                
+          <hr class="divider" />
+
+           <div id="poweredBy">
+                            <div class="clear"></div>
+                            <div class="clear"></div>
+                            <div class="clear"></div>
+                                                                                                                         <a href=".././" title="Hyracks" class="builtBy">
+        <img class="builtBy"  alt="Hyracks" src="../images/hyrax_ts.png"    />
+      </a>
+                      </div>
+          </div>
+        </div>
+        
+                
+        <div id="bodyColumn"  class="span9" >
+                                  
+            <h1>Asterix: Using Functions</h1>
+<div class="section">
+<h2><a name="toc" id="toc">Table of Contents</a><a name="Table_of_Contents"></a></h2>
+
+<ul>
+  
+<li><a href="#NumericFunctions">Numeric Functions</a></li>
+  
+<li><a href="#StringFunctions">String Functions</a></li>
+  
+<li><a href="#AggregateFunctions">Aggregate Functions</a></li>
+  
+<li><a href="#SpatialFunctions">Spatial Functions</a></li>
+  
+<li><a href="#SimilarityFunctions">Similarity Functions</a></li>
+  
+<li><a href="#TokenizingFunctions">Tokenizing Functions</a></li>
+  
+<li><a href="#TemporalFunctions">Temporal Functions</a></li>
+  
+<li><a href="#OtherFunctions">Other Functions</a></li>
+</ul>
+<p>Asterix provides various classes of functions to support operations on numeric, string, spatial, and temporal data. This document explains how to use these functions.</p></div>
+<div class="section">
+<h2><a name="NumericFunctions" id="NumericFunctions">Numeric Functions</a> <font size="4"><a href="#toc">[Back to TOC]</a></font><a name="Numeric_Functions_Back_to_TOC"></a></h2>
+<div class="section">
+<h3>abs<a name="abs"></a></h3>
+
+<ul>
+  
+<li>
+<p>Syntax:</p>
+  
+<div class="source">
+<pre>abs(numeric_expression)
+</pre></div></li>
+  
+<li>
+<p>Computes the absolute value of the argument.</p></li>
+  
+<li>Arguments:
+  
+<ul>
+    
+<li><tt>numeric_expression</tt>: A <tt>int8</tt>/<tt>int16</tt>/<tt>int32</tt>/<tt>int64</tt>/<tt>float</tt>/<tt>double</tt> value.</li>
+  </ul></li>
+  
+<li>Return Value:
+  
+<ul>
+    
+<li>The absolute value of the argument with the same type as the input argument, or <tt>null</tt> if the argument is a <tt>null</tt> value.</li>
+  </ul></li>
+  
+<li>
+<p>Example:</p>
+  
+<div class="source">
+<pre>let $v1 := abs(2013)
+let $v2 := abs(-4036)
+let $v3 := abs(0)
+let $v4 := abs(float(&quot;-2013.5&quot;))
+let $v5 := abs(double(&quot;-2013.593823748327284&quot;))
+return { &quot;v1&quot;: $v1, &quot;v2&quot;: $v2, &quot;v3&quot;: $v3, &quot;v4&quot;: $v4, &quot;v5&quot;: $v5 }
+</pre></div></li>
+</ul>
+
+<ul>
+  
+<li>
+<p>The expected result is:</p>
+  
+<div class="source">
+<pre>{ &quot;v1&quot;: 2013, &quot;v2&quot;: 4036, &quot;v3&quot;: 0, &quot;v4&quot;: 2013.5f, &quot;v5&quot;: 2013.5938237483274d }
+</pre></div></li>
+</ul></div>
+<div class="section">
+<h3>ceiling<a name="ceiling"></a></h3>
+
+<ul>
+  
+<li>
+<p>Syntax:</p>
+  
+<div class="source">
+<pre>ceiling(numeric_expression)
+</pre></div></li>
+  
+<li>
+<p>Computes the smallest (closest to negative infinity) number with no fractional part that is not less than the value of the argument. If the argument is already equal to mathematical integer, then the result is the same as the argument.</p></li>
+  
+<li>Arguments:
+  
+<ul>
+    
+<li><tt>numeric_expression</tt>: A <tt>int8</tt>/<tt>int16</tt>/<tt>int32</tt>/<tt>int64</tt>/<tt>float</tt>/<tt>double</tt> value.</li>
+  </ul></li>
+  
+<li>Return Value:
+  
+<ul>
+    
+<li>The ceiling value for the given number in the same type as the input argument, or <tt>null</tt> if the input is <tt>null</tt>.</li>
+  </ul></li>
+  
+<li>
+<p>Example:</p>
+  
+<div class="source">
+<pre>let $v1 := ceiling(2013)
+let $v2 := ceiling(-4036)
+let $v3 := ceiling(0.3)
+let $v4 := ceiling(float(&quot;-2013.2&quot;))
+let $v5 := ceiling(double(&quot;-2013.893823748327284&quot;))
+return { &quot;v1&quot;: $v1, &quot;v2&quot;: $v2, &quot;v3&quot;: $v3, &quot;v4&quot;: $v4, &quot;v5&quot;: $v5 }
+</pre></div></li>
+</ul>
+
+<ul>
+  
+<li>
+<p>The expected result is:</p>
+  
+<div class="source">
+<pre>{ &quot;v1&quot;: 2013, &quot;v2&quot;: -4036, &quot;v3&quot;: 1.0d, &quot;v4&quot;: -2013.0f, &quot;v5&quot;: -2013.0d }
+</pre></div></li>
+</ul></div>
+<div class="section">
+<h3>floor<a name="floor"></a></h3>
+
+<ul>
+  
+<li>
+<p>Syntax:</p>
+  
+<div class="source">
+<pre>floor(numeric_expression)
+</pre></div></li>
+  
+<li>
+<p>Computes the largest (closest to positive infinity) number with no fractional part that is not greater than the value. If the argument is already equal to mathematical integer, then the result is the same as the argument.</p></li>
+  
+<li>Arguments:
+  
+<ul>
+    
+<li><tt>numeric_expression</tt>: A <tt>int8</tt>/<tt>int16</tt>/<tt>int32</tt>/<tt>int64</tt>/<tt>float</tt>/<tt>double</tt> value.</li>
+  </ul></li>
+  
+<li>Return Value:
+  
+<ul>
+    
+<li>The floor value for the given number in the same type as the input argument, or <tt>null</tt> if the input is <tt>null</tt>.</li>
+  </ul></li>
+  
+<li>
+<p>Example:</p>
+  
+<div class="source">
+<pre>let $v1 := floor(2013)
+let $v2 := floor(-4036)
+let $v3 := floor(0.8)
+let $v4 := floor(float(&quot;-2013.2&quot;))
+let $v5 := floor(double(&quot;-2013.893823748327284&quot;))
+return { &quot;v1&quot;: $v1, &quot;v2&quot;: $v2, &quot;v3&quot;: $v3, &quot;v4&quot;: $v4, &quot;v5&quot;: $v5 }
+</pre></div></li>
+</ul>
+
+<ul>
+  
+<li>
+<p>The expected result is:</p>
+  
+<div class="source">
+<pre>{ &quot;v1&quot;: 2013, &quot;v2&quot;: -4036, &quot;v3&quot;: 0.0d, &quot;v4&quot;: -2014.0f, &quot;v5&quot;: -2014.0d }
+</pre></div></li>
+</ul></div>
+<div class="section">
+<h3>round<a name="round"></a></h3>
+
+<ul>
+  
+<li>
+<p>Syntax:</p>
+  
+<div class="source">
+<pre>round(numeric_expression)
+</pre></div></li>
+  
+<li>
+<p>Computes the number with no fractional part that is closest (and also closest to positive infinity) to the argument.</p></li>
+  
+<li>Arguments:
+  
+<ul>
+    
+<li><tt>numeric_expression</tt>: A <tt>int8</tt>/<tt>int16</tt>/<tt>int32</tt>/<tt>int64</tt>/<tt>float</tt>/<tt>double</tt> value.</li>
+  </ul></li>
+  
+<li>Return Value:
+  
+<ul>
+    
+<li>The rounded value for the given number in the same type as the input argument, or <tt>null</tt> if the input is <tt>null</tt>.</li>
+  </ul></li>
+  
+<li>
+<p>Example:</p>
+  
+<div class="source">
+<pre>let $v1 := round(2013)
+let $v2 := round(-4036)
+let $v3 := round(0.8)
+let $v4 := round(float(&quot;-2013.256&quot;))
+let $v5 := round(double(&quot;-2013.893823748327284&quot;))
+return { &quot;v1&quot;: $v1, &quot;v2&quot;: $v2, &quot;v3&quot;: $v3, &quot;v4&quot;: $v4, &quot;v5&quot;: $v5 }
+</pre></div></li>
+</ul>
+
+<ul>
+  
+<li>
+<p>The expected result is:</p>
+  
+<div class="source">
+<pre>{ &quot;v1&quot;: 2013, &quot;v2&quot;: -4036, &quot;v3&quot;: 1.0d, &quot;v4&quot;: -2013.0f, &quot;v5&quot;: -2014.0d }
+</pre></div></li>
+</ul></div>
+<div class="section">
+<h3>round-half-to-even<a name="round-half-to-even"></a></h3>
+
+<ul>
+  
+<li>
+<p>Syntax:</p>
+  
+<div class="source">
+<pre>round-half-to-even(numeric_expression, [precision])
+</pre></div></li>
+  
+<li>
+<p>Computes the closest numeric value to <tt>numeric_expression</tt> that is a multiple of ten to the power of minus <tt>precision</tt>. <tt>precision</tt> is optional and by default value <tt>0</tt> is used.</p></li>
+  
+<li>Arguments:
+  
+<ul>
+    
+<li><tt>numeric_expression</tt>: A <tt>int8</tt>/<tt>int16</tt>/<tt>int32</tt>/<tt>int64</tt>/<tt>float</tt>/<tt>double</tt> value.</li>
+    
+<li><tt>precision</tt>: An optional integer field representing the number of digits in the fraction of the the result</li>
+  </ul></li>
+  
+<li>Return Value:
+  
+<ul>
+    
+<li>The rounded value for the given number in the same type as the input argument, or <tt>null</tt> if the input is <tt>null</tt>.</li>
+  </ul></li>
+  
+<li>
+<p>Example:</p>
+  
+<div class="source">
+<pre>let $v1 := round-half-to-even(2013)
+let $v2 := round-half-to-even(-4036)
+let $v3 := round-half-to-even(0.8)
+let $v4 := round-half-to-even(float(&quot;-2013.256&quot;))
+let $v5 := round-half-to-even(double(&quot;-2013.893823748327284&quot;))
+let $v6 := round-half-to-even(double(&quot;-2013.893823748327284&quot;), 2)
+let $v7 := round-half-to-even(2013, 4)
+let $v8 := round-half-to-even(float(&quot;-2013.256&quot;), 5)
+return { &quot;v1&quot;: $v1, &quot;v2&quot;: $v2, &quot;v3&quot;: $v3, &quot;v4&quot;: $v4, &quot;v5&quot;: $v5, &quot;v6&quot;: $v6, &quot;v7&quot;: $v7, &quot;v8&quot;: $v8 }
+</pre></div></li>
+</ul>
+
+<ul>
+  
+<li>
+<p>The expected result is:</p>
+  
+<div class="source">
+<pre>{ &quot;v1&quot;: 2013, &quot;v2&quot;: -4036, &quot;v3&quot;: 1.0d, &quot;v4&quot;: -2013.0f, &quot;v5&quot;: -2014.0d, &quot;v6&quot;: -2013.89d, &quot;v7&quot;: 2013, &quot;v8&quot;: -2013.256f }
+</pre></div></li>
+</ul></div></div>
+<div class="section">
+<h2><a name="StringFunctions" id="StringFunctions">String Functions</a> <font size="4"><a href="#toc">[Back to TOC]</a></font><a name="String_Functions_Back_to_TOC"></a></h2>
+<div class="section">
+<h3>string-to-codepoint<a name="string-to-codepoint"></a></h3>
+
+<ul>
+  
+<li>
+<p>Syntax:</p>
+  
+<div class="source">
+<pre>string-to-codepoint(string_expression)
+</pre></div></li>
+  
+<li>
+<p>Converts the string <tt>string_expression</tt> to its code-based representation.</p></li>
+  
+<li>Arguments:
+  
+<ul>
+    
+<li><tt>string_expression</tt> : A <tt>string</tt> that will be converted.</li>
+  </ul></li>
+  
+<li>Return Value:
+  
+<ul>
+    
+<li>An <tt>OrderedList</tt> of the code points for the string <tt>string_expression</tt>.</li>
+  </ul></li>
+</ul></div>
+<div class="section">
+<h3>codepoint-to-string<a name="codepoint-to-string"></a></h3>
+
+<ul>
+  
+<li>
+<p>Syntax:</p>
+  
+<div class="source">
+<pre>codepoint-to-string(list_expression)
+</pre></div></li>
+  
+<li>
+<p>Converts the ordered code-based representation <tt>list_expression</tt> to the corresponding string.</p></li>
+  
+<li>Arguments:
+  
+<ul>
+    
+<li><tt>list_expression</tt> : An <tt>OrderedList</tt> of code-points.</li>
+  </ul></li>
+  
+<li>Return Value:
+  
+<ul>
+    
+<li>A <tt>string</tt> representation of <tt>list_expression</tt>.</li>
+  </ul></li>
+  
+<li>
+<p>Example:</p>
+  
+<div class="source">
+<pre>use dataverse TinySocial;
+
+let $s := &quot;Hello ASTERIX!&quot;
+let $l := string-to-codepoint($s)
+let $ss := codepoint-to-string($l)
+return {&quot;codes&quot;: $l, &quot;string&quot;: $ss}
+</pre></div></li>
+</ul>
+
+<ul>
+  
+<li>
+<p>The expected result is:</p>
+  
+<div class="source">
+<pre>{ &quot;codes&quot;: [ 72, 101, 108, 108, 111, 32, 65, 83, 84, 69, 82, 73, 88, 33 ], &quot;string&quot;: &quot;Hello ASTERIX!&quot; }
+</pre></div></li>
+</ul></div>
+<div class="section">
+<h3>contains<a name="contains"></a></h3>
+
+<ul>
+  
+<li>
+<p>Syntax:</p>
+  
+<div class="source">
+<pre>contains(string_expression, substring_to_contain)
+</pre></div></li>
+  
+<li>
+<p>Checks whether the string <tt>string_expression</tt> contains the string <tt>substring_to_contain</tt></p></li>
+  
+<li>Arguments:
+  
+<ul>
+    
+<li><tt>string_expression</tt> : A <tt>string</tt> that might contain the given substring.</li>
+    
+<li><tt>substring_to_contain</tt> : A target <tt>string</tt> that might be contained.</li>
+  </ul></li>
+  
+<li>Return Value:
+  
+<ul>
+    
+<li>A <tt>boolean</tt> value, <tt>true</tt> if <tt>string_expression</tt> contains <tt>substring_to_contain</tt>, and <tt>false</tt> otherwise.</li>
+  </ul></li>
+  
+<li>Note: An n-gram index can be utilized for this function.</li>
+  
+<li>
+<p>Example:</p>
+  
+<div class="source">
+<pre>use dataverse TinySocial;
+
+for $i in dataset('FacebookMessages')
+where contains($i.message, &quot;phone&quot;)
+return {&quot;mid&quot;: $i.message-id, &quot;message&quot;: $i.message}
+</pre></div></li>
+</ul>
+
+<ul>
+  
+<li>
+<p>The expected result is:</p>
+  
+<div class="source">
+<pre>{ &quot;mid&quot;: 2, &quot;message&quot;: &quot; dislike iphone its touch-screen is horrible&quot; }
+{ &quot;mid&quot;: 13, &quot;message&quot;: &quot; dislike iphone the voice-command is bad:(&quot; }
+{ &quot;mid&quot;: 15, &quot;message&quot;: &quot; like iphone the voicemail-service is awesome&quot; }
+</pre></div></li>
+</ul></div>
+<div class="section">
+<h3>like<a name="like"></a></h3>
+
+<ul>
+  
+<li>
+<p>Syntax:</p>
+  
+<div class="source">
+<pre>like(string_expression, string_pattern)
+</pre></div></li>
+  
+<li>
+<p>Checks whether the string <tt>string_expression</tt> contains the string pattern <tt>string_pattern</tt>. Compared to the <tt>contains</tt> function, the <tt>like</tt> function also supports regular expressions.</p></li>
+  
+<li>Arguments:
+  
+<ul>
+    
+<li><tt>string_expression</tt> : A <tt>string</tt> that might contain the pattern or <tt>null</tt>.</li>
+    
+<li><tt>string_pattern</tt> : A pattern <tt>string</tt> that might be contained or <tt>null</tt>.</li>
+  </ul></li>
+  
+<li>Return Value:
+  
+<ul>
+    
+<li>A <tt>boolean</tt> value, <tt>true</tt> if <tt>string_expression</tt> contains the pattern <tt>string_pattern</tt>, and <tt>false</tt> otherwise.</li>
+  </ul></li>
+  
+<li>
+<p>Example:</p>
+  
+<div class="source">
+<pre>use dataverse TinySocial;
+
+for $i in dataset('FacebookMessages')
+where like($i.message, &quot;%at&amp;t%&quot;)
+return $i.message
+</pre></div></li>
+</ul>
+
+<ul>
+  
+<li>
+<p>The expected result is:</p>
+  
+<div class="source">
+<pre>&quot; can't stand at&amp;t the network is horrible:(&quot;
+&quot; can't stand at&amp;t its plan is terrible&quot;
+&quot; love at&amp;t its 3G is good:)&quot;
+</pre></div></li>
+</ul></div>
+<div class="section">
+<h3>starts-with<a name="starts-with"></a></h3>
+
+<ul>
+  
+<li>
+<p>Syntax:</p>
+  
+<div class="source">
+<pre>starts-with(string_expression, substring_to_start_with)
+</pre></div></li>
+  
+<li>
+<p>Checks whether the string <tt>string_expression</tt> starts with the string <tt>substring_to_start_with</tt>.</p></li>
+  
+<li>Arguments:
+  
+<ul>
+    
+<li><tt>string_expression</tt> : A <tt>string</tt> that might start with the given string.</li>
+    
+<li><tt>substring_to_start_with</tt> : A <tt>string</tt> that might be contained as the starting substring.</li>
+  </ul></li>
+  
+<li>Return Value:
+  
+<ul>
+    
+<li>A <tt>boolean</tt>, returns <tt>true</tt> if <tt>string_expression</tt> starts with the string <tt>substring_to_start_with</tt>, and <tt>false</tt> otherwise.</li>
+  </ul></li>
+  
+<li>
+<p>Example:</p>
+  
+<div class="source">
+<pre>use dataverse TinySocial;
+
+for $i in dataset('FacebookMessages')
+where starts-with($i.message, &quot; like&quot;)
+return $i.message
+</pre></div></li>
+</ul>
+
+<ul>
+  
+<li>
+<p>The expected result is:</p>
+  
+<div class="source">
+<pre>&quot; like samsung the plan is amazing&quot;
+&quot; like t-mobile its platform is mind-blowing&quot;
+&quot; like verizon the 3G is awesome:)&quot;
+&quot; like iphone the voicemail-service is awesome&quot;
+</pre></div></li>
+</ul></div>
+<div class="section">
+<h3>ends-with<a name="ends-with"></a></h3>
+
+<ul>
+  
+<li>
+<p>Syntax:</p>
+  
+<div class="source">
+<pre>ends-with(string_expression, substring_to_end_with)
+</pre></div></li>
+  
+<li>
+<p>Checks whether the string <tt>string_expression</tt> ends with the string <tt>substring_to_end_with</tt>.</p></li>
+  
+<li>Arguments:
+  
+<ul>
+    
+<li><tt>string_expression</tt> : A <tt>string</tt> that might end with the given string.</li>
+    
+<li><tt>substring_to_end_with</tt> : A <tt>string</tt> that might be contained as the ending substring.</li>
+  </ul></li>
+  
+<li>Return Value:
+  
+<ul>
+    
+<li>A <tt>boolean</tt>, returns <tt>true</tt> if <tt>string_expression</tt> ends with the string <tt>substring_to_end_with</tt>, and <tt>false</tt> otherwise.</li>
+  </ul></li>
+  
+<li>
+<p>Example:</p>
+  
+<div class="source">
+<pre>use dataverse TinySocial;
+
+for $i in dataset('FacebookMessages')
+where ends-with($i.message, &quot;:)&quot;)
+return $i.message
+</pre></div></li>
+</ul>
+
+<ul>
+  
+<li>
+<p>The expected result is:</p>
+  
+<div class="source">
+<pre>&quot; love sprint its shortcut-menu is awesome:)&quot;
+&quot; like verizon the 3G is awesome:)&quot;
+&quot; love at&amp;t its 3G is good:)&quot;
+</pre></div></li>
+</ul></div>
+<div class="section">
+<h3>string-concat<a name="string-concat"></a></h3>
+
+<ul>
+  
+<li>
+<p>Syntax:</p>
+  
+<div class="source">
+<pre>string-concat(list_expression)
+</pre></div></li>
+  
+<li>
+<p>Concatenates a list of strings <tt>list_expression</tt> into a single string.</p></li>
+  
+<li>Arguments:
+  
+<ul>
+    
+<li><tt>list_expression</tt> : An <tt>OrderedList</tt> or <tt>UnorderedList</tt> of <tt>string</tt>s (could be <tt>null</tt>) to be concatenated.</li>
+  </ul></li>
+  
+<li>Return Value:
+  
+<ul>
+    
+<li>Returns the concatenated <tt>string</tt> value.</li>
+  </ul></li>
+  
+<li>
+<p>Example:</p>
+  
+<div class="source">
+<pre>let $i := &quot;ASTERIX&quot;
+let $j := &quot; &quot;
+let $k := &quot;ROCKS!&quot;
+return string-concat([$i, $j, $k])
+</pre></div></li>
+</ul>
+
+<ul>
+  
+<li>
+<p>The expected result is:</p>
+  
+<div class="source">
+<pre>&quot;ASTERIX ROCKS!&quot;
+</pre></div></li>
+</ul></div>
+<div class="section">
+<h3>string-join<a name="string-join"></a></h3>
+
+<ul>
+  
+<li>
+<p>Syntax:</p>
+  
+<div class="source">
+<pre>string-join(list_expression, string_expression)
+</pre></div></li>
+  
+<li>
+<p>Joins a list of strings <tt>list_expression</tt> with the given separator <tt>string_expression</tt> into a single string.</p></li>
+  
+<li>Arguments:
+  
+<ul>
+    
+<li><tt>list_expression</tt> : An <tt>OrderedList</tt> or <tt>UnorderedList</tt> of strings (could be <tt>null</tt>) to be joined.</li>
+    
+<li><tt>string_expression</tt> : A <tt>string</tt> as the separator.</li>
+  </ul></li>
+  
+<li>Return Value:
+  
+<ul>
+    
+<li>Returns the joined <tt>String</tt>.</li>
+  </ul></li>
+  
+<li>
+<p>Example:</p>
+  
+<div class="source">
+<pre>use dataverse TinySocial;
+
+let $i := [&quot;ASTERIX&quot;, &quot;ROCKS~&quot;]
+return string-join($i, &quot;!! &quot;)
+</pre></div></li>
+</ul>
+
+<ul>
+  
+<li>
+<p>The expected result is:</p>
+  
+<div class="source">
+<pre>&quot;ASTERIX!! ROCKS~&quot;
+</pre></div></li>
+</ul></div>
+<div class="section">
+<h3>lowercase<a name="lowercase"></a></h3>
+
+<ul>
+  
+<li>
+<p>Syntax:</p>
+  
+<div class="source">
+<pre>lowercase(string_expression)
+</pre></div></li>
+  
+<li>
+<p>Converts a given string <tt>string_expression</tt> to its lowercase form.</p></li>
+  
+<li>Arguments:
+  
+<ul>
+    
+<li><tt>string_expression</tt> : A <tt>string</tt> to be converted.</li>
+  </ul></li>
+  
+<li>Return Value:
+  
+<ul>
+    
+<li>Returns a <tt>string</tt> as the lowercase form of the given <tt>string_expression</tt>.</li>
+  </ul></li>
+  
+<li>
+<p>Example:</p>
+  
+<div class="source">
+<pre>use dataverse TinySocial;
+
+let $i := &quot;ASTERIX&quot;
+return lowercase($i)
+</pre></div></li>
+</ul>
+
+<ul>
+  
+<li>
+<p>The expected result is:</p>
+  
+<div class="source">
+<pre>asterix
+</pre></div></li>
+</ul></div>
+<div class="section">
+<h3>uppercase<a name="uppercase"></a></h3>
+
+<ul>
+  
+<li>Syntax:</li>
+</ul>
+<p>uppercase(string_expression)</p>
+
+<ul>
+  
+<li>Converts a given string <tt>string_expression</tt> to its uppercase form.</li>
+  
+<li>Arguments:
+  
+<ul>
+    
+<li><tt>string_expression</tt> : A <tt>string</tt> to be converted.</li>
+  </ul></li>
+  
+<li>Return Value:
+  
+<ul>
+    
+<li>Returns a <tt>string</tt> as the uppercase form of the given <tt>string_expression</tt>.</li>
+  </ul></li>
+  
+<li>
+<p>Example:</p>
+  
+<div class="source">
+<pre>use dataverse TinySocial;
+
+let $i := &quot;asterix&quot;
+return uppercase($i)
+</pre></div></li>
+</ul>
+
+<ul>
+  
+<li>
+<p>The expected result is:</p>
+  
+<div class="source">
+<pre>ASTERIX
+</pre></div></li>
+</ul></div>
+<div class="section">
+<h3>uppercase<a name="uppercase"></a></h3>
+
+<ul>
+  
+<li>
+<p>Syntax:</p>
+  
+<div class="source">
+<pre>uppercase(string_expression)
+</pre></div></li>
+  
+<li>
+<p>Converts a given string <tt>string_expression</tt> to its uppercase form.</p></li>
+  
+<li>Arguments:
+  
+<ul>
+    
+<li><tt>string_expression</tt> : A <tt>string</tt> to be converted.</li>
+  </ul></li>
+  
+<li>Return Value:
+  
+<ul>
+    
+<li>Returns a <tt>string</tt> as the uppercase form of the given <tt>string_expression</tt>.</li>
+  </ul></li>
+  
+<li>
+<p>Example:</p>
+  
+<div class="source">
+<pre>use dataverse TinySocial;
+
+let $i := &quot;asterix&quot;
+return uppercase($i)
+</pre></div></li>
+</ul>
+
+<ul>
+  
+<li>
+<p>The expected result is:</p>
+  
+<div class="source">
+<pre>ASTERIX
+</pre></div></li>
+</ul></div>
+<div class="section">
+<h3>matches<a name="matches"></a></h3>
+
+<ul>
+  
+<li>
+<p>Syntax:</p>
+  
+<div class="source">
+<pre>matches(string_expression, string_pattern)
+</pre></div></li>
+  
+<li>
+<p>Checks whether the strings <tt>string_expression</tt> matches the given pattern <tt>string_pattern</tt> (A Java regular expression pattern).</p></li>
+  
+<li>Arguments:
+  
+<ul>
+    
+<li><tt>string_expression</tt> : A <tt>string</tt> that might contain the pattern.</li>
+    
+<li><tt>string_pattern</tt> : A pattern <tt>string</tt> to be matched.</li>
+  </ul></li>
+  
+<li>Return Value:
+  
+<ul>
+    
+<li>A <tt>boolean</tt>, returns <tt>true</tt> if <tt>string_expression</tt> matches the pattern <tt>string_pattern</tt>, and <tt>false</tt> otherwise.</li>
+  </ul></li>
+  
+<li>
+<p>Example:</p>
+  
+<div class="source">
+<pre>use dataverse TinySocial;
+
+for $i in dataset('FacebookMessages')
+where matches($i.message, &quot;dislike iphone&quot;)
+return $i.message
+</pre></div></li>
+</ul>
+
+<ul>
+  
+<li>
+<p>The expected result is:</p>
+  
+<div class="source">
+<pre>&quot; dislike iphone its touch-screen is horrible&quot;
+&quot; dislike iphone the voice-command is bad:(&quot;
+</pre></div></li>
+</ul></div>
+<div class="section">
+<h3>replace<a name="replace"></a></h3>
+
+<ul>
+  
+<li>
+<p>Syntax:</p>
+  
+<div class="source">
+<pre>replace(string_expression, string_pattern, string_replacement[, string_flags])
+</pre></div></li>
+  
+<li>
+<p>Checks whether the string <tt>string_expression</tt> matches the given pattern <tt>string_pattern</tt>, and replace the matched pattern <tt>string_pattern</tt> with the new pattern <tt>string_replacement</tt>.</p></li>
+  
+<li>Arguments:
+  
+<ul>
+    
+<li><tt>string_expression</tt> : A <tt>string</tt> that might contain the pattern.</li>
+    
+<li><tt>string_pattern</tt> : A pattern <tt>string</tt> to be matched.</li>
+    
+<li><tt>string_replacement</tt> : A pattern <tt>string</tt> to be used as the replacement.</li>
+    
+<li><tt>string_flag</tt> : (Optional) A <tt>string</tt> with flags to be used during replace.</li>
+    
+<li>The following modes are enabled with these flags: dotall (s), multiline (m), case-insenitive (i), and comments and whitespace (x).</li>
+  </ul></li>
+  
+<li>Return Value:
+  
+<ul>
+    
+<li>Returns a <tt>string</tt> that is obtained after the replacements.</li>
+  </ul></li>
+  
+<li>
+<p>Example:</p>
+  
+<div class="source">
+<pre>use dataverse TinySocial;
+
+for $i in dataset('FacebookMessages')
+where matches($i.message, &quot; like iphone&quot;)
+return replace($i.message, &quot; like iphone&quot;, &quot;like android&quot;)
+</pre></div></li>
+</ul>
+
+<ul>
+  
+<li>
+<p>The expected result is:</p>
+  
+<div class="source">
+<pre>&quot;like android the voicemail-service is awesome&quot;
+</pre></div></li>
+</ul></div>
+<div class="section">
+<h3>string-length<a name="string-length"></a></h3>
+
+<ul>
+  
+<li>
+<p>Syntax:</p>
+  
+<div class="source">
+<pre>string-length(string_expression)
+</pre></div></li>
+  
+<li>
+<p>Returns the length of the string <tt>string_expression</tt>.</p></li>
+  
+<li>Arguments:
+  
+<ul>
+    
+<li><tt>string_expression</tt> : A <tt>string</tt> or <tt>null</tt> that represents the string to be checked.</li>
+  </ul></li>
+  
+<li>Return Value:
+  
+<ul>
+    
+<li>An <tt>int64</tt> that represents the length of <tt>string_expression</tt>.</li>
+  </ul></li>
+  
+<li>
+<p>Example:</p>
+  
+<div class="source">
+<pre>use dataverse TinySocial;
+
+for $i in dataset('FacebookMessages')
+return {&quot;mid&quot;: $i.message-id, &quot;message-len&quot;: string-length($i.message)}
+</pre></div></li>
+</ul>
+
+<ul>
+  
+<li>
+<p>The expected result is:</p>
+  
+<div class="source">
+<pre>{ &quot;mid&quot;: 1, &quot;message-len&quot;: 43 }
+{ &quot;mid&quot;: 2, &quot;message-len&quot;: 44 }
+{ &quot;mid&quot;: 3, &quot;message-len&quot;: 33 }
+{ &quot;mid&quot;: 4, &quot;message-len&quot;: 43 }
+{ &quot;mid&quot;: 5, &quot;message-len&quot;: 46 }
+{ &quot;mid&quot;: 6, &quot;message-len&quot;: 43 }
+{ &quot;mid&quot;: 7, &quot;message-len&quot;: 37 }
+{ &quot;mid&quot;: 8, &quot;message-len&quot;: 33 }
+{ &quot;mid&quot;: 9, &quot;message-len&quot;: 34 }
+{ &quot;mid&quot;: 10, &quot;message-len&quot;: 50 }
+{ &quot;mid&quot;: 11, &quot;message-len&quot;: 38 }
+{ &quot;mid&quot;: 12, &quot;message-len&quot;: 52 }
+{ &quot;mid&quot;: 13, &quot;message-len&quot;: 42 }
+{ &quot;mid&quot;: 14, &quot;message-len&quot;: 27 }
+{ &quot;mid&quot;: 15, &quot;message-len&quot;: 45 }
+</pre></div></li>
+</ul></div>
+<div class="section">
+<h3>substring<a name="substring"></a></h3>
+
+<ul>
+  
+<li>
+<p>Syntax:</p>
+  
+<div class="source">
+<pre>substring(string_expression, offset[, length])
+</pre></div></li>
+  
+<li>
+<p>Returns the substring from the given string <tt>string_expression</tt> based on the given start offset <tt>offset</tt> with the optional <tt>length</tt>.</p></li>
+  
+<li>Arguments:
+  
+<ul>
+    
+<li><tt>string_expression</tt> : A <tt>string</tt> to be extracted.</li>
+    
+<li><tt>offset</tt> : An <tt>int64</tt> as the starting offset of the substring in <tt>string_expression</tt>.</li>
+    
+<li><tt>length</tt> : (Optional) An <tt>int64</tt> as the length of the substring.</li>
+  </ul></li>
+  
+<li>Return Value:
+  
+<ul>
+    
+<li>A <tt>string</tt> that represents the substring.</li>
+  </ul></li>
+  
+<li>
+<p>Example:</p>
+  
+<div class="source">
+<pre>use dataverse TinySocial;
+
+for $i in dataset('FacebookMessages')
+where string-length($i.message) &gt; 50
+return substring($i.message, 50)
+</pre></div></li>
+</ul>
+
+<ul>
+  
+<li>
+<p>The expected result is:</p>
+  
+<div class="source">
+<pre>&quot;G:(&quot;
+</pre></div></li>
+</ul></div>
+<div class="section">
+<h3>substring-before<a name="substring-before"></a></h3>
+
+<ul>
+  
+<li>
+<p>Syntax:</p>
+  
+<div class="source">
+<pre>substring-before(string_expression, string_pattern)
+</pre></div></li>
+  
+<li>
+<p>Returns the substring from the given string <tt>string_expression</tt> before the given pattern <tt>string_pattern</tt>.</p></li>
+  
+<li>Arguments:
+  
+<ul>
+    
+<li><tt>string_expression</tt> : A <tt>string</tt> to be extracted.</li>
+    
+<li><tt>string_pattern</tt> : A <tt>string</tt> pattern to be searched.</li>
+  </ul></li>
+  
+<li>Return Value:
+  
+<ul>
+    
+<li>A <tt>string</tt> that represents the substring.</li>
+  </ul></li>
+  
+<li>
+<p>Example:</p>
+  
+<div class="source">
+<pre>use dataverse TinySocial;
+
+for $i in dataset('FacebookMessages')
+where contains($i.message, &quot;iphone&quot;)
+return substring-before($i.message, &quot;iphone&quot;)
+</pre></div></li>
+</ul>
+
+<ul>
+  
+<li>
+<p>The expected result is:</p>
+  
+<div class="source">
+<pre>&quot; dislike &quot;
+&quot; dislike &quot;
+&quot; like &quot;
+</pre></div></li>
+</ul></div>
+<div class="section">
+<h3>substring-after<a name="substring-after"></a></h3>
+
+<ul>
+  
+<li>
+<p>Syntax:</p>
+  
+<div class="source">
+<pre>substring-after(string_expression, string_pattern)
+</pre></div></li>
+  
+<li>
+<p>Returns the substring from the given string <tt>string_expression</tt> after the given pattern <tt>string_pattern</tt>.</p></li>
+  
+<li>Arguments:
+  
+<ul>
+    
+<li><tt>string_expression</tt> : A <tt>string</tt> to be extracted.</li>
+    
+<li><tt>string_pattern</tt> : A <tt>string</tt> pattern to be searched.</li>
+  </ul></li>
+  
+<li>Return Value:
+  
+<ul>
+    
+<li>A <tt>string</tt> that represents the substring.</li>
+  </ul></li>
+  
+<li>
+<p>Example:</p>
+  
+<div class="source">
+<pre>use dataverse TinySocial;
+
+for $i in dataset('FacebookMessages')
+where contains($i.message, &quot;iphone&quot;)
+return substring-after($i.message, &quot;iphone&quot;)
+</pre></div></li>
+</ul>
+
+<ul>
+  
+<li>
+<p>The expected result is:</p>
+  
+<div class="source">
+<pre>&quot; its touch-screen is horrible&quot;
+&quot; the voice-command is bad:(&quot;
+&quot; the voicemail-service is awesome&quot;
+</pre></div></li>
+</ul></div></div>
+<div class="section">
+<h2><a name="AggregateFunctions" id="AggregateFunctions">Aggregate Functions</a> <font size="4"><a href="#toc">[Back to TOC]</a></font><a name="Aggregate_Functions_Back_to_TOC"></a></h2>
+<div class="section">
+<h3>count<a name="count"></a></h3>
+
+<ul>
+  
+<li>
+<p>Syntax:</p>
+  
+<div class="source">
+<pre>count(list)
+</pre></div></li>
+  
+<li>
+<p>Gets the number of items in the given list.</p></li>
+  
+<li>Arguments:
+  
+<ul>
+    
+<li><tt>list</tt>: An <tt>orderedList</tt> or <tt>unorderedList</tt> containing the items to be counted, or a <tt>null</tt> value.</li>
+  </ul></li>
+  
+<li>Return Value:
+  
+<ul>
+    
+<li>An <tt>int64</tt> value representing the number of items in the given list. <tt>0i64</tt> is returned if the input is <tt>null</tt>.</li>
+  </ul></li>
+  
+<li>
+<p>Example:</p>
+  
+<div class="source">
+<pre>use dataverse TinySocial;
+
+let $l1 := ['hello', 'world', 1, 2, 3]
+let $l2 := for $i in dataset TwitterUsers return $i
+return {&quot;count1&quot;: count($l1), &quot;count2&quot;: count($l2)}
+</pre></div></li>
+  
+<li>
+<p>The expected result is:</p>
+  
+<div class="source">
+<pre>{ &quot;count1&quot;: 5i64, &quot;count2&quot;: 4i64 }
+</pre></div></li>
+</ul></div>
+<div class="section">
+<h3>avg<a name="avg"></a></h3>
+
+<ul>
+  
+<li>
+<p>Syntax:</p>
+  
+<div class="source">
+<pre>avg(num_list)
+</pre></div></li>
+  
+<li>
+<p>Gets the average value of the items in the given list.</p></li>
+  
+<li>Arguments:
+  
+<ul>
+    
+<li><tt>num_list</tt>: An <tt>orderedList</tt> or <tt>unorderedList</tt> containing numeric or null values, or a <tt>null</tt> value.</li>
+  </ul></li>
+  
+<li>Return Value:
+  
+<ul>
+    
+<li>An <tt>double</tt> value representing the average of the numbers in the given list. <tt>null</tt> is returned if the input is <tt>null</tt>, or the input list contains <tt>null</tt>. Non-numeric types in the input list will cause an error.</li>
+  </ul></li>
+  
+<li>
+<p>Example:</p>
+  
+<div class="source">
+<pre>use dataverse TinySocial;
+
+let $l := for $i in dataset TwitterUsers return $i.friends_count
+return {&quot;avg_friend_count&quot;: avg($l)}
+</pre></div></li>
+  
+<li>
+<p>The expected result is:</p>
+  
+<div class="source">
+<pre>{ &quot;avg_friend_count&quot;: 191.5d }
+</pre></div></li>
+</ul></div>
+<div class="section">
+<h3>sum<a name="sum"></a></h3>
+
+<ul>
+  
+<li>
+<p>Syntax:</p>
+  
+<div class="source">
+<pre>sum(num_list)
+</pre></div></li>
+  
+<li>
+<p>Gets the sum of the items in the given list.</p></li>
+  
+<li>Arguments:
+  
+<ul>
+    
+<li><tt>num_list</tt>: An <tt>orderedList</tt> or <tt>unorderedList</tt> containing numeric or null values, or a <tt>null</tt> value.</li>
+  </ul></li>
+  
+<li>Return Value:
+  
+<ul>
+    
+<li>The sum of the numbers in the given list. The returning type is decided by the item type with the highest order in the numeric type promotion order (<tt>int8</tt>-&gt; <tt>int16</tt>-&gt;<tt>int32</tt>-&gt;<tt>int64</tt>-&gt;<tt>float</tt>-&gt;<tt>double</tt>) among items. <tt>null</tt> is returned if the input is <tt>null</tt>, or the input list contains <tt>null</tt>. Non-numeric types in the input list will cause an error.</li>
+  </ul></li>
+  
+<li>
+<p>Example:</p>
+  
+<div class="source">
+<pre>use dataverse TinySocial;
+
+let $l := for $i in dataset TwitterUsers return $i.friends_count
+return {&quot;sum_friend_count&quot;: sum($l)}
+</pre></div></li>
+  
+<li>
+<p>The expected result is:</p>
+  
+<div class="source">
+<pre>{ &quot;sum_friend_count&quot;: 766 }
+</pre></div></li>
+</ul></div>
+<div class="section">
+<h3>min/max<a name="minmax"></a></h3>
+
+<ul>
+  
+<li>
+<p>Syntax:</p>
+  
+<div class="source">
+<pre>min(num_list), max(num_list)
+</pre></div></li>
+  
+<li>
+<p>Gets the min/max value of numeric items in the given list.</p></li>
+  
+<li>Arguments:
+  
+<ul>
+    
+<li><tt>num_list</tt>: An <tt>orderedList</tt> or <tt>unorderedList</tt> containing the items to be compared, or a <tt>null</tt> value.</li>
+  </ul></li>
+  
+<li>Return Value:
+  
+<ul>
+    
+<li>The min/max value of the given list. The returning type is decided by the item type with the highest order in the numeric type promotion order (<tt>int8</tt>-&gt; <tt>int16</tt>-&gt;<tt>int32</tt>-&gt;<tt>int64</tt>-&gt;<tt>float</tt>-&gt;<tt>double</tt>) among items. <tt>null</tt> is returned if the input is <tt>null</tt>, or the input list contains <tt>null</tt>. Non-numeric types in the input list will cause an error.</li>
+  </ul></li>
+  
+<li>
+<p>Example:</p>
+  
+<div class="source">
+<pre>use dataverse TinySocial;
+
+let $l := for $i in dataset TwitterUsers return $i. friends_count
+return {&quot;min_friend_count&quot;: min($l), &quot;max_friend_count&quot;: max($l)}
+</pre></div></li>
+  
+<li>
+<p>The expected result is:</p>
+  
+<div class="source">
+<pre>{ &quot;min_friend_count&quot;: 18, &quot;max_friend_count&quot;: 445 }
+</pre></div></li>
+</ul></div>
+<div class="section">
+<h3>sql-count<a name="sql-count"></a></h3>
+
+<ul>
+  
+<li>
+<p>Syntax:</p>
+  
+<div class="source">
+<pre>sql-count(list)
+</pre></div></li>
+  
+<li>
+<p>Gets the number of non-null items in the given list.</p></li>
+  
+<li>Arguments:
+  
+<ul>
+    
+<li><tt>list</tt>: An <tt>orderedList</tt> or <tt>unorderedList</tt> containing the items to be counted, or a <tt>null</tt> value.</li>
+  </ul></li>
+  
+<li>Return Value:
+  
+<ul>
+    
+<li>An <tt>int64</tt> value representing the number of non-null items in the given list. The value <tt>0i64</tt> is returned if the input is <tt>null</tt>.</li>
+  </ul></li>
+  
+<li>
+<p>Example:</p></li>
+</ul>
+
+<div class="source">
+<pre>    let $l1 := ['hello', 'world', 1, 2, 3, null]
+    return {&quot;count&quot;: sql-count($l1)}
+</pre></div>
+
+<ul>
+  
+<li>
+<p>The expected result is:</p>
+  
+<div class="source">
+<pre>{ &quot;count&quot;: 5i64 }
+</pre></div></li>
+</ul></div>
+<div class="section">
+<h3>sql-avg<a name="sql-avg"></a></h3>
+
+<ul>
+  
+<li>
+<p>Syntax:</p>
+  
+<div class="source">
+<pre>sql-avg(num_list)
+</pre></div></li>
+  
+<li>
+<p>Gets the average value of the non-null items in the given list.</p></li>
+  
+<li>Arguments:
+  
+<ul>
+    
+<li><tt>num_list</tt>: An <tt>orderedList</tt> or <tt>unorderedList</tt> containing numeric or null values, or a <tt>null</tt> value.</li>
+  </ul></li>
+  
+<li>Return Value:
+  
+<ul>
+    
+<li>A <tt>double</tt> value representing the average of the non-null numbers in the given list. The <tt>null</tt> value is returned if the input is <tt>null</tt>. Non-numeric types in the input list will cause an error.</li>
+  </ul></li>
+  
+<li>
+<p>Example:</p>
+  
+<div class="source">
+<pre>let $l := [1.2, 2.3, 3.4, 0, null]
+return {&quot;avg&quot;: sql-avg($l)}
+</pre></div></li>
+  
+<li>
+<p>The expected result is:</p>
+  
+<div class="source">
+<pre>{ &quot;avg&quot;: 1.725d }
+</pre></div></li>
+</ul></div>
+<div class="section">
+<h3>sql-sum<a name="sql-sum"></a></h3>
+
+<ul>
+  
+<li>
+<p>Syntax:</p>
+  
+<div class="source">
+<pre>sql-sum(num_list)
+</pre></div></li>
+  
+<li>
+<p>Gets the sum of the non-null items in the given list.</p></li>
+  
+<li>Arguments:
+  
+<ul>
+    
+<li><tt>num_list</tt>: An <tt>orderedList</tt> or <tt>unorderedList</tt> containing numeric or null values, or a <tt>null</tt> value.</li>
+  </ul></li>
+  
+<li>Return Value:
+  
+<ul>
+    
+<li>The sum of the non-null numbers in the given list. The returning type is decided by the item type with the highest order in the numeric type promotion order (<tt>int8</tt>-&gt; <tt>int16</tt>-&gt;<tt>int32</tt>-&gt;<tt>int64</tt>-&gt;<tt>float</tt>-&gt;<tt>double</tt>) among items. The value <tt>null</tt> is returned if the input is <tt>null</tt>. Non-numeric types in the input list will cause an error.</li>
+  </ul></li>
+  
+<li>
+<p>Example:</p>
+  
+<div class="source">
+<pre>let $l := [1.2, 2.3, 3.4, 0, null]
+return {&quot;sum&quot;: sql-sum($l)}
+</pre></div></li>
+  
+<li>
+<p>The expected result is:</p>
+  
+<div class="source">
+<pre>{ &quot;sum&quot;: 6.9d }
+</pre></div></li>
+</ul></div>
+<div class="section">
+<h3>sql-min/max<a name="sql-minmax"></a></h3>
+
+<ul>
+  
+<li>
+<p>Syntax:</p>
+  
+<div class="source">
+<pre>sql-min(num_list), sql-max(num_list)
+</pre></div></li>
+  
+<li>
+<p>Gets the min/max value of the non-null numeric items in the given list.</p></li>
+  
+<li>Arguments:
+  
+<ul>
+    
+<li><tt>num_list</tt>: An <tt>orderedList</tt> or <tt>unorderedList</tt> containing the items to be compared, or a <tt>null</tt> value.</li>
+  </ul></li>
+  
+<li>Return Value:
+  
+<ul>
+    
+<li>The min/max value of the given list. The returning type is decided by the item type with the highest order in the numeric type promotion order (<tt>int8</tt>-&gt; <tt>int16</tt>-&gt;<tt>int32</tt>-&gt;<tt>int64</tt>-&gt;<tt>float</tt>-&gt;<tt>double</tt>) among items. The value <tt>null</tt> is returned if the input is <tt>null</tt>. Non-numeric types in the input list will cause an error.</li>
+  </ul></li>
+  
+<li>
+<p>Example:</p>
+  
+<div class="source">
+<pre>let $l := [1.2, 2.3, 3.4, 0, null]
+return {&quot;min&quot;: sql-min($l), &quot;max&quot;: sql-max($l)}
+</pre></div></li>
+  
+<li>
+<p>The expected result is:</p>
+  
+<div class="source">
+<pre>{ &quot;min&quot;: 0.0d, &quot;max&quot;: 3.4d }
+</pre></div></li>
+</ul></div></div>
+<div class="section">
+<h2><a name="SpatialFunctions" id="SpatialFunctions">Spatial Functions</a> <font size="4"><a href="#toc">[Back to TOC]</a></font><a name="Spatial_Functions_Back_to_TOC"></a></h2>
+<div class="section">
+<h3>create-point<a name="create-point"></a></h3>
+
+<ul>
+  
+<li>
+<p>Syntax:</p>
+  
+<div class="source">
+<pre>create-point(x, y)
+</pre></div></li>
+  
+<li>
+<p>Creates the primitive type <tt>point</tt> using an <tt>x</tt> and <tt>y</tt> value.</p></li>
+  
+<li>Arguments:</li>
+  
+<li><tt>x</tt> : A <tt>double</tt> that represents the x-coordinate.</li>
+  
+<li><tt>y</tt> : A <tt>double</tt> that represents the y-coordinate.</li>
+  
+<li>Return Value:</li>
+  
+<li>A <tt>point</tt> representing the ordered pair (<tt>x</tt>, <tt>y</tt>).</li>
+  
+<li>
+<p>Example:</p>
+  
+<div class="source">
+<pre>use dataverse TinySocial;
+
+let $c :=  create-point(30.0,70.0)
+return {&quot;point&quot;: $c}
+</pre></div></li>
+</ul>
+
+<ul>
+  
+<li>
+<p>The expected result is:</p>
+  
+<div class="source">
+<pre>{ &quot;point&quot;: point(&quot;30.0,70.0&quot;) }
+</pre></div></li>
+</ul></div>
+<div class="section">
+<h3>create-line<a name="create-line"></a></h3>
+
+<ul>
+  
+<li>
+<p>Syntax:</p>
+  
+<div class="source">
+<pre>create-line(point_expression1, point_expression2)
+</pre></div></li>
+  
+<li>
+<p>Creates the primitive type <tt>line</tt> using <tt>point_expression1</tt> and <tt>point_expression2</tt>.</p></li>
+  
+<li>Arguments:
+  
+<ul>
+    
+<li><tt>point_expression1</tt> : A <tt>point</tt> that represents the start point of the line.</li>
+    
+<li><tt>point_expression2</tt> : A <tt>point</tt> that represents the end point of the line.</li>
+  </ul></li>
+  
+<li>Return Value:
+  
+<ul>
+    
+<li>A spatial <tt>line</tt> created using the points provided in <tt>point_expression1</tt> and <tt>point_expression2</tt>.</li>
+  </ul></li>
+  
+<li>
+<p>Example:</p>
+  
+<div class="source">
+<pre>use dataverse TinySocial;
+
+let $c :=  create-line(create-point(30.0,70.0), create-point(50.0,90.0))
+return {&quot;line&quot;: $c}
+</pre></div></li>
+</ul>
+
+<ul>
+  
+<li>
+<p>The expected result is:</p>
+  
+<div class="source">
+<pre>{ &quot;line&quot;: line(&quot;30.0,70.0 50.0,90.0&quot;) }
+</pre></div></li>
+</ul></div>
+<div class="section">
+<h3>create-rectangle<a name="create-rectangle"></a></h3>
+
+<ul>
+  
+<li>
+<p>Syntax:</p>
+  
+<div class="source">
+<pre>create-rectangle(point_expression1, point_expression2)
+</pre></div></li>
+  
+<li>
+<p>Creates the primitive type <tt>rectangle</tt> using <tt>point_expression1</tt> and <tt>point_expression2</tt>.</p></li>
+  
+<li>Arguments:
+  
+<ul>
+    
+<li><tt>point_expression1</tt> : A <tt>point</tt> that represents the lower-left point of the rectangle.</li>
+    
+<li><tt>point_expression2</tt> : A <tt>point</tt> that represents the upper-right point of the rectangle.</li>
+  </ul></li>
+  
+<li>Return Value:
+  
+<ul>
+    
+<li>A spatial <tt>rectangle</tt> created using the points provided in <tt>point_expression1</tt> and <tt>point_expression2</tt>.</li>
+  </ul></li>
+  
+<li>
+<p>Example:</p>
+  
+<div class="source">
+<pre>use dataverse TinySocial;
+
+let $c :=  create-rectangle(create-point(30.0,70.0), create-point(50.0,90.0))
+return {&quot;rectangle&quot;: $c}
+</pre></div></li>
+</ul>
+
+<ul>
+  
+<li>
+<p>The expected result is:</p>
+  
+<div class="source">
+<pre>{ &quot;rectangle&quot;: rectangle(&quot;30.0,70.0 50.0,90.0&quot;) }
+</pre></div></li>
+</ul></div>
+<div class="section">
+<h3>create-circle<a name="create-circle"></a></h3>
+
+<ul>
+  
+<li>
+<p>Syntax:</p>
+  
+<div class="source">
+<pre>create-circle(point_expression, radius)
+</pre></div></li>
+  
+<li>
+<p>Creates the primitive type <tt>circle</tt> using <tt>point_expression</tt> and <tt>radius</tt>.</p></li>
+  
+<li>Arguments:
+  
+<ul>
+    
+<li><tt>point_expression</tt> : A <tt>point</tt> that represents the center of the circle.</li>
+    
+<li><tt>radius</tt> : A <tt>double</tt> that represents the radius of the circle.</li>
+  </ul></li>
+  
+<li>Return Value:
+  
+<ul>
+    
+<li>A spatial <tt>circle</tt> created using the center point and the radius provided in <tt>point_expression</tt> and <tt>radius</tt>.</li>
+  </ul></li>
+  
+<li>
+<p>Example:</p>
+  
+<div class="source">
+<pre>use dataverse TinySocial;
+
+let $c :=  create-circle(create-point(30.0,70.0), 5.0)
+return {&quot;circle&quot;: $c}
+</pre></div></li>
+</ul>
+
+<ul>
+  
+<li>
+<p>The expected result is:</p>
+  
+<div class="source">
+<pre>{ &quot;circle&quot;: circle(&quot;30.0,70.0 5.0&quot;) }
+</pre></div></li>
+</ul></div>
+<div class="section">
+<h3>create-polygon<a name="create-polygon"></a></h3>
+
+<ul>
+  
+<li>
+<p>Syntax:</p>
+  
+<div class="source">
+<pre>create-polygon(list_expression)
+</pre></div></li>
+  
+<li>
+<p>Creates the primitive type <tt>polygon</tt> using the double values provided in the argument <tt>list_expression</tt>. Each two consecutive double values represent a point starting from the first double value in the list. Note that at least six double values should be specified, meaning a total of three points.</p></li>
+  
+<li>Arguments:</li>
+  
+<li><tt>list_expression</tt> : An OrderedList of doubles representing the points of the polygon.</li>
+  
+<li>Return Value:</li>
+  
+<li>A <tt>polygon</tt>, represents a spatial simple polygon created using the points provided in <tt>list_expression</tt>.</li>
+  
+<li>
+<p>Example:</p>
+  
+<div class="source">
+<pre>use dataverse TinySocial;
+
+let $c :=  create-polygon([1.0,1.0,2.0,2.0,3.0,3.0,4.0,4.0])
+return {&quot;polygon&quot;: $c}
+</pre></div></li>
+</ul>
+
+<ul>
+  
+<li>
+<p>The expected result is:</p>
+  
+<div class="source">
+<pre>{ &quot;polygon&quot;: polygon(&quot;1.0,1.0 2.0,2.0 3.0,3.0 4.0,4.0&quot;) }
+</pre></div></li>
+</ul></div>
+<div class="section">
+<h3>get-x/get-y<a name="get-xget-y"></a></h3>
+
+<ul>
+  
+<li>
+<p>Syntax:</p>
+  
+<div class="source">
+<pre>get-x(point_expression) or get-y(point_expression)
+</pre></div></li>
+  
+<li>
+<p>Returns the x or y coordinates of a point <tt>point_expression</tt>.</p></li>
+  
+<li>Arguments:
+  
+<ul>
+    
+<li><tt>point_expression</tt> : A <tt>point</tt>.</li>
+  </ul></li>
+  
+<li>Return Value:
+  
+<ul>
+    
+<li>A <tt>double</tt> representing the x or y coordinates of the point <tt>point_expression</tt>.</li>
+  </ul></li>
+  
+<li>
+<p>Example:</p>
+  
+<div class="source">
+<pre>use dataverse TinySocial;
+
+let $point := create-point(2.3,5.0)
+return {&quot;x-coordinate&quot;: get-x($point), &quot;y-coordinate&quot;: get-y($point)}
+</pre></div></li>
+</ul>
+
+<ul>
+  
+<li>
+<p>The expected result is:</p>
+  
+<div class="source">
+<pre>{ &quot;x-coordinate&quot;: 2.3d, &quot;y-coordinate&quot;: 5.0d }
+</pre></div></li>
+</ul></div>
+<div class="section">
+<h3>get-points<a name="get-points"></a></h3>
+
+<ul>
+  
+<li>
+<p>Syntax:</p>
+  
+<div class="source">
+<pre>get-points(spatial_expression)
+</pre></div></li>
+  
+<li>
+<p>Returns an ordered list of the points forming the spatial object <tt>spatial_expression</tt>.</p></li>
+  
+<li>Arguments:
+  
+<ul>
+    
+<li><tt>spatial_expression</tt> : A <tt>point</tt>, <tt>line</tt>, <tt>rectangle</tt>, <tt>circle</tt>, or <tt>polygon</tt>.</li>
+  </ul></li>
+  
+<li>Return Value:
+  
+<ul>
+    
+<li>An <tt>OrderedList</tt> of the points forming the spatial object <tt>spatial_expression</tt>.</li>
+  </ul></li>
+  
+<li>
+<p>Example:</p>
+  
+<div class="source">
+<pre>use dataverse TinySocial;
+
+let $line := create-line(create-point(100.6,99.4), create-point(-72.0,-76.9))
+let $rectangle := create-rectangle(create-point(9.2,49.0), create-point(77.8,111.1))
+let $polygon := create-polygon([1.0,1.0,2.0,2.0,3.0,3.0,4.0,4.0])
+let $line_list := get-points($line)
+let $rectangle_list := get-points($rectangle)
+let $polygon_list := get-points($polygon)
+return {&quot;line-first-point&quot;: $line_list[0], &quot;line-second-point&quot;: $line_list[1], &quot;rectangle-left-bottom-point&quot;: $rectangle_list[0], &quot;rectangle-top-upper-point&quot;: $rectangle_list[1], &quot;polygon-first-point&quot;: $polygon_list[0], &quot;polygon-second-point&quot;: $polygon_list[1], &quot;polygon-third-point&quot;: $polygon_list[2], &quot;polygon-forth-point&quot;: $polygon_list[3]}
+</pre></div></li>
+</ul>
+
+<ul>
+  
+<li>
+<p>The expected result is:</p>
+  
+<div class="source">
+<pre>{ &quot;line-first-point&quot;: point(&quot;100.6,99.4&quot;), &quot;line-second-point&quot;: point(&quot;-72.0,-76.9&quot;), &quot;rectangle-left-bottom-point&quot;: point(&quot;9.2,49.0&quot;), &quot;rectangle-top-upper-point&quot;: point(&quot;77.8,111.1&quot;), &quot;polygon-first-point&quot;: point(&quot;1.0,1.0&quot;), &quot;polygon-second-point&quot;: point(&quot;2.0,2.0&quot;), &quot;polygon-third-point&quot;: point(&quot;3.0,3.0&quot;), &quot;polygon-forth-point&quot;: point(&quot;4.0,4.0&quot;) }
+</pre></div></li>
+</ul></div>
+<div class="section">
+<h3>get-center/get-radius<a name="get-centerget-radius"></a></h3>
+
+<ul>
+  
+<li>
+<p>Syntax:</p>
+  
+<div class="source">
+<pre>get-center(circle_expression) or get-radius(circle_expression)
+</pre></div></li>
+  
+<li>
+<p>Returns the center and the radius of a circle <tt>circle_expression</tt>, respectively.</p></li>
+  
+<li>Arguments:
+  
+<ul>
+    
+<li><tt>circle_expression</tt> : A <tt>circle</tt>.</li>
+  </ul></li>
+  
+<li>Return Value:
+  
+<ul>
+    
+<li>A <tt>point</tt> or <tt>double</tt>, represent the center or radius of the circle <tt>circle_expression</tt>.</li>
+  </ul></li>
+  
+<li>
+<p>Example:</p>
+  
+<div class="source">
+<pre>use dataverse TinySocial;
+
+let $circle := create-circle(create-point(6.0,3.0), 1.0)
+return {&quot;circle-radius&quot;: get-radius($circle), &quot;circle-center&quot;: get-center($circle)}
+</pre></div></li>
+</ul>
+
+<ul>
+  
+<li>
+<p>The expected result is:</p>
+  
+<div class="source">
+<pre>{ &quot;circle-radius&quot;: 1.0d, &quot;circle-center&quot;: point(&quot;6.0,3.0&quot;) }
+</pre></div></li>
+</ul></div>
+<div class="section">
+<h3>spatial-distance<a name="spatial-distance"></a></h3>
+
+<ul>
+  
+<li>
+<p>Syntax:</p>
+  
+<div class="source">
+<pre>spatial-distance(point_expression1, point_expression2)
+</pre></div></li>
+  
+<li>
+<p>Returns the Euclidean distance between <tt>point_expression1</tt> and <tt>point_expression2</tt>.</p></li>
+  
+<li>Arguments:
+  
+<ul>
+    
+<li><tt>point_expression1</tt> : A <tt>point</tt>.</li>
+    
+<li><tt>point_expression2</tt> : A <tt>point</tt>.</li>
+  </ul></li>
+  
+<li>Return Value:
+  
+<ul>
+    
+<li>A <tt>double</tt> as the Euclidean distance between <tt>point_expression1</tt> and <tt>point_expression2</tt>.</li>
+  </ul></li>
+  
+<li>
+<p>Example:</p>
+  
+<div class="source">
+<pre>use dataverse TinySocial;
+
+for $t in dataset('TweetMessages')
+let $d :=  spatial-distance($t.sender-location, create-point(30.0,70.0))
+return {&quot;point&quot;: $t.sender-location, &quot;distance&quot;: $d}
+</pre></div></li>
+</ul>
+
+<ul>
+  
+<li>
+<p>The expected result is:</p>
+  
+<div class="source">
+<pre>{ &quot;point&quot;: point(&quot;47.44,80.65&quot;), &quot;distance&quot;: 20.434678857275934d }
+{ &quot;point&quot;: point(&quot;29.15,76.53&quot;), &quot;distance&quot;: 6.585089217315132d }
+{ &quot;point&quot;: point(&quot;37.59,68.42&quot;), &quot;distance&quot;: 7.752709203884797d }
+{ &quot;point&quot;: point(&quot;24.82,94.63&quot;), &quot;distance&quot;: 25.168816023007512d }
+{ &quot;point&quot;: point(&quot;32.84,67.14&quot;), &quot;distance&quot;: 4.030533463451212d }
+{ &quot;point&quot;: point(&quot;29.72,75.8&quot;), &quot;distance&quot;: 5.806754687430835d }
+{ &quot;point&quot;: point(&quot;39.28,70.48&quot;), &quot;distance&quot;: 9.292405501268227d }
+{ &quot;point&quot;: point(&quot;40.09,92.69&quot;), &quot;distance&quot;: 24.832321679617472d }
+{ &quot;point&quot;: point(&quot;47.51,83.99&quot;), &quot;distance&quot;: 22.41250097601782d }
+{ &quot;point&quot;: point(&quot;36.21,72.6&quot;), &quot;distance&quot;: 6.73231758015024d }
+{ &quot;point&quot;: point(&quot;46.05,93.34&quot;), &quot;distance&quot;: 28.325926286707734d }
+{ &quot;point&quot;: point(&quot;36.86,74.62&quot;), &quot;distance&quot;: 8.270671073135482d }
+</pre></div></li>
+</ul></div>
+<div class="section">
+<h3>spatial-area<a name="spatial-area"></a></h3>
+
+<ul>
+  
+<li>
+<p>Syntax:</p>
+  
+<div class="source">
+<pre>spatial-area(spatial_2d_expression)
+</pre></div></li>
+  
+<li>
+<p>Returns the spatial area of <tt>spatial_2d_expression</tt>.</p></li>
+  
+<li>Arguments:
+  
+<ul>
+    
+<li><tt>spatial_2d_expression</tt> : A <tt>rectangle</tt>, <tt>circle</tt>, or <tt>polygon</tt>.</li>
+  </ul></li>
+  
+<li>Return Value:
+  
+<ul>
+    
+<li>A <tt>double</tt> representing the area of <tt>spatial_2d_expression</tt>.</li>
+  </ul></li>
+  
+<li>
+<p>Example:</p>
+  
+<div class="source">
+<pre>use dataverse TinySocial;
+
+let $circleArea := spatial-area(create-circle(create-point(0.0,0.0), 5.0))
+return {&quot;Area&quot;:$circleArea}
+</pre></div></li>
+</ul>
+
+<ul>
+  
+<li>
+<p>The expected result is:</p>
+  
+<div class="source">
+<pre>{ &quot;Area&quot;: 78.53981625d }
+</pre></div></li>
+</ul></div>
+<div class="section">
+<h3>spatial-intersect<a name="spatial-intersect"></a></h3>
+
+<ul>
+  
+<li>
+<p>Syntax:</p>
+  
+<div class="source">
+<pre>spatial-intersect(spatial_expression1, spatial_expression2)
+</pre></div></li>
+  
+<li>
+<p>Checks whether <tt>@arg1</tt> and <tt>@arg2</tt> spatially intersect each other.</p></li>
+  
+<li>Arguments:
+  
+<ul>
+    
+<li><tt>spatial_expression1</tt> : A <tt>point</tt>, <tt>line</tt>, <tt>rectangle</tt>, <tt>circle</tt>, or <tt>polygon</tt>.</li>
+    
+<li><tt>spatial_expression2</tt> : A <tt>point</tt>, <tt>line</tt>, <tt>rectangle</tt>, <tt>circle</tt>, or <tt>polygon</tt>.</li>
+  </ul></li>
+  
+<li>Return Value:
+  
+<ul>
+    
+<li>A <tt>boolean</tt> representing whether <tt>spatial_expression1</tt> and <tt>spatial_expression2</tt> spatially overlap with each other.</li>
+  </ul></li>
+  
+<li>
+<p>Example:</p>
+  
+<div class="source">
+<pre>use dataverse TinySocial;
+
+for $t in dataset('TweetMessages')
+where spatial-intersect($t.sender-location, create-rectangle(create-point(30.0,70.0), create-point(40.0,80.0)))
+return $t
+</pre></div></li>
+</ul>
+
+<ul>
+  
+<li>
+<p>The expected result is:</p>
+  
+<div class="source">
+<pre>{ &quot;tweetid&quot;: &quot;4&quot;, &quot;user&quot;: { &quot;screen-name&quot;: &quot;NathanGiesen@211&quot;, &quot;lang&quot;: &quot;en&quot;, &quot;friends_count&quot;: 39339, &quot;statuses_count&quot;: 473, &quot;name&quot;: &quot;Nathan Giesen&quot;, &quot;followers_count&quot;: 49416 }, &quot;sender-location&quot;: point(&quot;39.28,70.48&quot;), &quot;send-time&quot;: datetime(&quot;2011-12-26T10:10:00.000Z&quot;), &quot;referred-topics&quot;: {{ &quot;sprint&quot;, &quot;voice-command&quot; }}, &quot;message-text&quot;: &quot; like sprint the voice-command is mind-blowing:)&quot; }
+{ &quot;tweetid&quot;: &quot;7&quot;, &quot;user&quot;: { &quot;screen-name&quot;: &quot;ChangEwing_573&quot;, &quot;lang&quot;: &quot;en&quot;, &quot;friends_count&quot;: 182, &quot;statuses_count&quot;: 394, &quot;name&quot;: &quot;Chang Ewing&quot;, &quot;followers_count&quot;: 32136 }, &quot;sender-location&quot;: point(&quot;36.21,72.6&quot;), &quot;send-time&quot;: datetime(&quot;2011-08-25T10:10:00.000Z&quot;), &quot;referred-topics&quot;: {{ &quot;samsung&quot;, &quot;platform&quot; }}, &quot;message-text&quot;: &quot; like samsung the platform is good&quot; }
+{ &quot;tweetid&quot;: &quot;9&quot;, &quot;user&quot;: { &quot;screen-name&quot;: &quot;NathanGiesen@211&quot;, &quot;lang&quot;: &quot;en&quot;, &quot;friends_count&quot;: 39339, &quot;statuses_count&quot;: 473, &quot;name&quot;: &quot;Nathan Giesen&quot;, &quot;followers_count&quot;: 49416 }, &quot;sender-location&quot;: point(&quot;36.86,74.62&quot;), &quot;send-time&quot;: datetime(&quot;2012-07-21T10:10:00.000Z&quot;), &quot;referred-topics&quot;: {{ &quot;verizon&quot;, &quot;voicemail-service&quot; }}, &quot;message-text&quot;: &quot; love verizon its voicemail-service is awesome&quot; }
+</pre></div></li>
+</ul></div>
+<div class="section">
+<h3>spatial-cell<a name="spatial-cell"></a></h3>
+
+<ul>
+  
+<li>
+<p>Syntax:</p>
+  
+<div class="source">
+<pre>spatial-cell(point_expression1, point_expression2, x_increment, y_increment)
+</pre></div></li>
+  
+<li>
+<p>Returns the grid cell that <tt>point_expression1</tt> belongs to.</p></li>
+  
+<li>Arguments:
+  
+<ul>
+    
+<li><tt>point_expression1</tt> : A <tt>point</tt> representing the point of interest that its grid cell will be returned.</li>
+    
+<li><tt>point_expression2</tt> : A <tt>point</tt> representing the origin of the grid.</li>
+    
+<li><tt>x_increment</tt> : A <tt>double</tt>, represents X increments.</li>
+    
+<li><tt>y_increment</tt> : A <tt>double</tt>, represents Y increments.</li>
+  </ul></li>
+  
+<li>Return Value:
+  
+<ul>
+    
+<li>A <tt>rectangle</tt> representing the grid cell that <tt>point_expression1</tt> belongs to.</li>
+  </ul></li>
+  
+<li>
+<p>Example:</p>
+  
+<div class="source">
+<pre>use dataverse TinySocial;
+
+for $t in dataset('TweetMessages')
+group by $c :=  spatial-cell($t.sender-location, create-point(20.0,50.0), 5.5, 6.0) with $t
+let $num :=  count($t)
+return { &quot;cell&quot;: $c, &quot;count&quot;: $num}
+</pre></div></li>
+</ul>
+
+<ul>
+  
+<li>
+<p>The expected result is:</p>
+  
+<div class="source">
+<pre>{ &quot;cell&quot;: rectangle(&quot;20.0,92.0 25.5,98.0&quot;), &quot;count&quot;: 1i64 }
+{ &quot;cell&quot;: rectangle(&quot;25.5,74.0 31.0,80.0&quot;), &quot;count&quot;: 2i64 }
+{ &quot;cell&quot;: rectangle(&quot;31.0,62.0 36.5,68.0&quot;), &quot;count&quot;: 1i64 }
+{ &quot;cell&quot;: rectangle(&quot;31.0,68.0 36.5,74.0&quot;), &quot;count&quot;: 1i64 }
+{ &quot;cell&quot;: rectangle(&quot;36.5,68.0 42.0,74.0&quot;), &quot;count&quot;: 2i64 }
+{ &quot;cell&quot;: rectangle(&quot;36.5,74.0 42.0,80.0&quot;), &quot;count&quot;: 1i64 }
+{ &quot;cell&quot;: rectangle(&quot;36.5,92.0 42.0,98.0&quot;), &quot;count&quot;: 1i64 }
+{ &quot;cell&quot;: rectangle(&quot;42.0,80.0 47.5,86.0&quot;), &quot;count&quot;: 1i64 }
+{ &quot;cell&quot;: rectangle(&quot;42.0,92.0 47.5,98.0&quot;), &quot;count&quot;: 1i64 }
+{ &quot;cell&quot;: rectangle(&quot;47.5,80.0 53.0,86.0&quot;), &quot;count&quot;: 1i64 }
+</pre></div></li>
+</ul></div></div>
+<div class="section">
+<h2><a name="SimilarityFunctions" id="SimilarityFunctions">Similarity Functions</a> <font size="4"><a href="#toc">[Back to TOC]</a></font><a name="Similarity_Functions_Back_to_TOC"></a></h2>
+<p>AsterixDB supports queries with different similarity functions, including edit distance and Jaccard.</p>
+<div class="section">
+<h3>edit-distance<a name="edit-distance"></a></h3>
+
+<ul>
+  
+<li>
+<p>Syntax:</p>
+  
+<div class="source">
+<pre>edit-distance(expression1, expression2)
+</pre></div></li>
+  
+<li>
+<p>Returns the <a class="externalLink" href="http://en.wikipedia.org/wiki/Levenshtein_distance">edit distance</a> of <tt>expression1</tt> and <tt>expression2</tt>.</p></li>
+  
+<li>Arguments:
+  
+<ul>
+    
+<li><tt>expression1</tt> : A <tt>string</tt> or a homogeneous <tt>OrderedList</tt> of a comparable item type.</li>
+    
+<li><tt>expression2</tt> : The same type as <tt>expression1</tt>.</li>
+  </ul></li>
+  
+<li>Return Value:
+  
+<ul>
+    
+<li>An <tt>int64</tt> that represents the edit distance between <tt>expression1</tt> and <tt>expression2</tt>.</li>
+  </ul></li>
+  
+<li>Note: An n-gram index can be utilized for this function.</li>
+  
+<li>
+<p>Example:</p>
+  
+<div class="source">
+<pre>use dataverse TinySocial;
+
+for $user in dataset('FacebookUsers')
+let $ed := edit-distance($user.name, &quot;Suzanna Tilson&quot;)
+where $ed &lt;= 2
+return $user
+</pre></div></li>
+</ul>
+
+<ul>
+  
+<li>
+<p>The expected result is:</p>
+  
+<div class="source">
+<pre>{
+&quot;id&quot;: 7, &quot;alias&quot;: &quot;Suzanna&quot;, &quot;name&quot;: &quot;SuzannaTillson&quot;, &quot;user-since&quot;: datetime(&quot;2012-08-07T10:10:00.000Z&quot;), &quot;friend-ids&quot;: {{ 6 }},
+&quot;employment&quot;: [ { &quot;organization-name&quot;: &quot;Labzatron&quot;, &quot;start-date&quot;: date(&quot;2011-04-19&quot;), &quot;end-date&quot;: null } ]
+}
+</pre></div></li>
+</ul></div>
+<div class="section">
+<h3>edit-distance-check<a name="edit-distance-check"></a></h3>
+
+<ul>
+  
+<li>
+<p>Syntax:</p>
+  
+<div class="source">
+<pre>edit-distance-check(expression1, expression2, threshold)
+</pre></div></li>
+  
+<li>
+<p>Checks whether <tt>expression1</tt> and <tt>expression2</tt> have an <a class="externalLink" href="http://en.wikipedia.org/wiki/Levenshtein_distance">edit distance</a> within a given threshold. The &#x201c;check&#x201d; version of edit distance is faster than the &#x201c;non-check&#x201d; version because the former can detect whether two items satisfy a given threshold using early-termination techniques, as opposed to computing their real distance. Although possible, it is not necessary for the user to write queries using the &#x201c;check&#x201d; versions explicitly, since a rewrite rule can perform an appropriate transformation from a &#x201c;non-check&#x201d; version to a &#x201c;check&#x201d; version.</p></li>
+  
+<li>
+<p>Arguments:</p>
+  
+<ul>
+    
+<li><tt>expression1</tt> : A <tt>string</tt> or a homogeneous <tt>OrderedList</tt> of a comparable item type.</li>
+    
+<li><tt>expression2</tt> : The same type as <tt>expression1</tt>.</li>
+    
+<li><tt>threshold</tt> : An <tt>int64</tt> that represents the distance threshold.</li>
+  </ul></li>
+  
+<li>Return Value:
+  
+<ul>
+    
+<li>An <tt>OrderedList</tt> with two items:
+    
+<ul>
+      
+<li>The first item contains a <tt>boolean</tt> value representing whether <tt>expression1</tt> and <tt>expression2</tt> are similar.</li>
+      
+<li>The second item contains an <tt>int64</tt> that represents the edit distance of <tt>expression1</tt> and <tt>expression2</tt> if it is within the threshold, or 0 otherwise.</li>
+    </ul></li>
+  </ul></li>
+  
+<li>Note: An n-gram index can be utilized for this function.</li>
+  
+<li>
+<p>Example:</p>
+  
+<div class="source">
+<pre>use dataverse TinySocial;
+
+for $user in dataset('FacebookUsers')
+let $ed := edit-distance-check($user.name, &quot;Suzanna Tilson&quot;, 2)
+where $ed[0]
+return $ed[1]
+</pre></div></li>
+</ul>
+
+<ul>
+  
+<li>
+<p>The expected result is:</p>
+  
+<div class="source">
+<pre>2
+</pre></div></li>
+</ul></div>
+<div class="section">
+<h3>edit-distance-contains<a name="edit-distance-contains"></a></h3>
+
+<ul>
+  
+<li>Syntax:</li>
+</ul>
+<p>edit-distance-contains(expression1, expression2, threshold)</p>
+
+<ul>
+  
+<li>
+<p>Checks whether <tt>expression1</tt> contains <tt>expression2</tt> with an <a class="externalLink" href="http://en.wikipedia.org/wiki/Levenshtein_distance">edit distance</a> within a given threshold.</p></li>
+  
+<li>
+<p>Arguments:</p>
+  
+<ul>
+    
+<li><tt>expression1</tt> : A <tt>string</tt> or a homogeneous <tt>OrderedList</tt> of a comparable item type.</li>
+    
+<li><tt>expression2</tt> : The same type as <tt>expression1</tt>.</li>
+    
+<li><tt>threshold</tt> : An <tt>int32</tt> that represents the distance threshold.</li>
+  </ul></li>
+  
+<li>Return Value:
+  
+<ul>
+    
+<li>An <tt>OrderedList</tt> with two items:
+    
+<ul>
+      
+<li>The first item contains a <tt>boolean</tt> value representing whether <tt>expression1</tt> can contain <tt>expression2</tt>.</li>
+      
+<li>The second item contains an <tt>int32</tt> that represents the required edit distance for <tt>expression1</tt> to contain <tt>expression2</tt> if the first item is true.</li>
+    </ul></li>
+  </ul></li>
+  
+<li>Note: An n-gram index can be utilized for this function.</li>
+  
+<li>Example:  let $i := edit-distance-contains(&#x201c;happy&#x201d;,&#x201c;hapr&#x201d;,2)  return $i;</li>
+</ul>
+
+<ul>
+  
+<li>
+<p>The expected result is:</p>
+  
+<div class="source">
+<pre>[ true, 1 ]
+</pre></div></li>
+</ul></div>
+<div class="section">
+<h3>similarity-jaccard<a name="similarity-jaccard"></a></h3>
+
+<ul>
+  
+<li>
+<p>Syntax:</p>
+  
+<div class="source">
+<pre>similarity-jaccard(list_expression1, list_expression2)
+</pre></div></li>
+  
+<li>
+<p>Returns the <a class="externalLink" href="http://en.wikipedia.org/wiki/Jaccard_index">Jaccard similarity</a> of <tt>list_expression1</tt> and <tt>list_expression2</tt>.</p></li>
+  
+<li>Arguments:
+  
+<ul>
+    
+<li><tt>list_expression1</tt> : An <tt>UnorderedList</tt> or <tt>OrderedList</tt>.</li>
+    
+<li><tt>list_expression2</tt> : An <tt>UnorderedList</tt> or <tt>OrderedList</tt>.</li>
+  </ul></li>
+  
+<li>Return Value:
+  
+<ul>
+    
+<li>A <tt>float</tt> that represents the Jaccard similarity of <tt>list_expression1</tt> and <tt>list_expression2</tt>.</li>
+  </ul></li>
+  
+<li>Note: A keyword index can be utilized for this function.</li>
+  
+<li>
+<p>Example:</p>
+  
+<div class="source">
+<pre>use dataverse TinySocial;
+
+for $user in dataset('FacebookUsers')
+let $sim := similarity-jaccard($user.friend-ids, [1,5,9])
+where $sim &gt;= 0.6f
+return $user
+</pre></div></li>
+</ul>
+
+<ul>
+  
+<li>
+<p>The expected result is:</p>
+  
+<div class="source">
+<pre>{
+&quot;id&quot;: 3, &quot;alias&quot;: &quot;Emory&quot;, &quot;name&quot;: &quot;EmoryUnk&quot;, &quot;user-since&quot;: datetime(&quot;2012-07-10T10:10:00.000Z&quot;), &quot;friend-ids&quot;: {{ 1, 5, 8, 9 }},
+&quot;employment&quot;: [ { &quot;organization-name&quot;: &quot;geomedia&quot;, &quot;start-date&quot;: date(&quot;2010-06-17&quot;), &quot;end-date&quot;: date(&quot;2010-01-26&quot;) } ]
+}
+{
+&quot;id&quot;: 10, &quot;alias&quot;: &quot;Bram&quot;, &quot;name&quot;: &quot;BramHatch&quot;, &quot;user-since&quot;: datetime(&quot;2010-10-16T10:10:00.000Z&quot;), &quot;friend-ids&quot;: {{ 1, 5, 9 }},
+&quot;employment&quot;: [ { &quot;organization-name&quot;: &quot;physcane&quot;, &quot;start-date&quot;: date(&quot;2007-06-05&quot;), &quot;end-date&quot;: date(&quot;2011-11-05&quot;) } ]
+}
+</pre></div></li>
+</ul></div>
+<div class="section">
+<h3>similarity-jaccard-check<a name="similarity-jaccard-check"></a></h3>
+
+<ul>
+  
+<li>
+<p>Syntax:</p>
+  
+<div class="source">
+<pre>similarity-jaccard-check(list_expression1, list_expression2, threshold)
+</pre></div></li>
+  
+<li>
+<p>Checks whether <tt>list_expression1</tt> and <tt>list_expression2</tt> have a <a class="externalLink" href="http://en.wikipedia.org/wiki/Jaccard_index">Jaccard similarity</a> greater than or equal to threshold. Again, the &#x201c;check&#x201d; version of Jaccard is faster than the &#x201c;non-check&#x201d; version.</p></li>
+  
+<li>
+<p>Arguments:</p>
+  
+<ul>
+    
+<li><tt>list_expression1</tt> : An <tt>UnorderedList</tt> or <tt>OrderedList</tt>.</li>
+    
+<li><tt>list_expression2</tt> : An <tt>UnorderedList</tt> or <tt>OrderedList</tt>.</li>
+    
+<li><tt>threshold</tt> : A <tt>float</tt> that represents the similarity threshold.</li>
+  </ul></li>
+  
+<li>Return Value:
+  
+<ul>
+    
+<li>An <tt>OrderedList</tt> with two items:</li>
+    
+<li>The first item contains a <tt>boolean</tt> value representing whether <tt>list_expression1</tt> and <tt>list_expression2</tt> are similar.</li>
+    
+<li>The second item contains a <tt>float</tt> that represents the Jaccard similarity of <tt>list_expression1</tt> and <tt>list_expression2</tt> if it is greater than or equal to the threshold, or 0 otherwise.</li>
+  </ul></li>
+  
+<li>Note: A keyword index can be utilized for this function.</li>
+  
+<li>
+<p>Example:</p>
+  
+<div class="source">
+<pre>use dataverse TinySocial;
+
+for $user in dataset('FacebookUsers')
+let $sim := similarity-jaccard-check($user.friend-ids, [1,5,9], 0.6f)
+where $sim[0]
+return $sim[1]
+</pre></div></li>
+</ul>
+
+<ul>
+  
+<li>
+<p>The expected result is:</p>
+  
+<div class="source">
+<pre>0.75f
+1.0f
+</pre></div></li>
+</ul></div>
+<div class="section">
+<h3>Similarity Operator ~#<a name="Similarity_Operator_"></a></h3>
+
+<ul>
+  
+<li>&#x201c;<tt>~=</tt>&#x201d; is syntactic sugar for expressing a similarity condition with a given similarity threshold.</li>
+  
+<li>The similarity function and threshold for &#x201c;<tt>~=</tt>&#x201d; are controlled via &#x201c;set&#x201d; directives.</li>
+  
+<li>The &#x201c;<tt>~=</tt>&#x201d; operator returns a <tt>boolean</tt> value that represents whether the operands are similar.</li>
+  
+<li>
+<p>Example for Jaccard similarity:</p>
+  
+<div class="source">
+<pre>use dataverse TinySocial;
+
+set simfunction &quot;jaccard&quot;;
+set simthreshold &quot;0.6f&quot;;
+
+for $user in dataset('FacebookUsers')
+where $user.friend-ids ~= [1,5,9]
+return $user
+</pre></div></li>
+</ul>
+
+<ul>
+  
+<li>
+<p>The expected result is:</p>
+  
+<div class="source">
+<pre>{
+&quot;id&quot;: 3, &quot;alias&quot;: &quot;Emory&quot;, &quot;name&quot;: &quot;EmoryUnk&quot;, &quot;user-since&quot;: datetime(&quot;2012-07-10T10:10:00.000Z&quot;), &quot;friend-ids&quot;: {{ 1, 5, 8, 9 }},
+&quot;employment&quot;: [ { &quot;organization-name&quot;: &quot;geomedia&quot;, &quot;start-date&quot;: date(&quot;2010-06-17&quot;), &quot;end-date&quot;: date(&quot;2010-01-26&quot;) } ]
+}
+{
+&quot;id&quot;: 10, &quot;alias&quot;: &quot;Bram&quot;, &quot;name&quot;: &quot;BramHatch&quot;, &quot;user-since&quot;: datetime(&quot;2010-10-16T10:10:00.000Z&quot;), &quot;friend-ids&quot;: {{ 1, 5, 9 }},
+&quot;employment&quot;: [ { &quot;organization-name&quot;: &quot;physcane&quot;, &quot;start-date&quot;: date(&quot;2007-06-05&quot;), &quot;end-date&quot;: date(&quot;2011-11-05&quot;) } ]
+}
+</pre></div></li>
+</ul>
+
+<ul>
+  
+<li>
+<p>Example for edit-distance similarity:</p>
+  
+<div class="source">
+<pre>use dataverse TinySocial;
+
+set simfunction &quot;edit-distance&quot;;
+set simthreshold &quot;2&quot;;
+
+for $user in dataset('FacebookUsers')
+where $user.name ~= &quot;Suzanna Tilson&quot;
+return $user
+</pre></div></li>
+</ul>
+
+<ul>
+  
+<li>
+<p>The expected output is:</p>
+  
+<div class="source">
+<pre>{
+&quot;id&quot;: 7, &quot;alias&quot;: &quot;Suzanna&quot;, &quot;name&quot;: &quot;SuzannaTillson&quot;, &quot;user-since&quot;: datetime(&quot;2012-08-07T10:10:00.000Z&quot;), &quot;friend-ids&quot;: {{ 6 }},
+&quot;employment&quot;: [ { &quot;organization-name&quot;: &quot;Labzatron&quot;, &quot;start-date&quot;: date(&quot;2011-04-19&quot;), &quot;end-date&quot;: null } ]
+}
+</pre></div></li>
+</ul></div></div>
+<div class="section">
+<h2><a name="TokenizingFunctions" id="TokenizingFunctions">Tokenizing Functions</a> <font size="4"><a href="#toc">[Back to TOC]</a></font><a name="Tokenizing_Functions_Back_to_TOC"></a></h2>
+<div class="section">
+<h3>word-tokens<a name="word-tokens"></a></h3>
+
+<ul>
+  
+<li>
+<p>Syntax:</p>
+  
+<div class="source">
+<pre>word-tokens(string_expression)
+</pre></div></li>
+  
+<li>
+<p>Returns a list of word tokens of <tt>string_expression</tt>.</p></li>
+  
+<li>Arguments:
+  
+<ul>
+    
+<li><tt>string_expression</tt> : A <tt>string</tt> that will be tokenized.</li>
+  </ul></li>
+  
+<li>Return Value:
+  
+<ul>
+    
+<li>An <tt>OrderedList</tt> of <tt>string</tt> word tokens.</li>
+  </ul></li>
+  
+<li>
+<p>Example:</p>
+  
+<div class="source">
+<pre>use dataverse TinySocial;
+
+for $t in dataset('TweetMessages')
+let $tokens := word-tokens($t.message-text)
+where $t.send-time &gt;= datetime('2012-01-01T00:00:00')
+return {
+&quot;tweetid&quot;: $t.tweetid,
+&quot;word-tokens&quot;: $tokens
+}
+</pre></div></li>
+</ul>
+
+<ul>
+  
+<li>
+<p>The expected result is:</p>
+  
+<div class="source">
+<pre>{ &quot;tweetid&quot;: &quot;9&quot;, &quot;word-tokens&quot;: [ &quot;love&quot;, &quot;verizon&quot;, &quot;its&quot;, &quot;voicemail&quot;, &quot;service&quot;, &quot;is&quot;, &quot;awesome&quot; ] }
+</pre></div></li>
+</ul>
+<!-- ### hashed-word-tokens ###
+ * Syntax:
+
+        hashed-word-tokens(string_expression)
+
+ * Returns a list of hashed word tokens of `string_expression`.
+ * Arguments:
+    * `string_expression` : A `string` that will be tokenized.
+ * Return Value:
+   * An `OrderedList` of `int32` hashed tokens.
+
+ * Example:
+
+        use dataverse TinySocial;
+
+        for $t in dataset('TweetMessages')
+        let $tokens := hashed-word-tokens($t.message-text)
+        where $t.send-time >= datetime('2012-01-01T00:00:00')
+        return {
+        "tweetid": $t.tweetid,
+        "hashed-word-tokens": $tokens
+        }
+
+
+ * The expected result is:
+
+        { "tweetid": "9", "hashed-word-tokens": [ -1217719622, -447857469, -1884722688, -325178649, 210976949, 285049676, 1916743959 ] }
+
+
+### counthashed-word-tokens ###
+ * Syntax:
+
+        counthashed-word-tokens(string_expression)
+
+ * Returns a list of hashed word tokens of `string_expression`. The hashing mechanism gives duplicate tokens different hash values, based on the occurrence count of that token.
+ * Arguments:
+    * `string_expression` : A `String` that will be tokenized.
+ * Return Value:
+    * An `OrderedList` of `Int32` hashed tokens.
+ * Example:
+
+        use dataverse TinySocial;
+
+        for $t in dataset('TweetMessages')
+        let $tokens := counthashed-word-tokens($t.message-text)
+        where $t.send-time >= datetime('2012-01-01T00:00:00')
+        return {
+        "tweetid": $t.tweetid,
+        "counthashed-word-tokens": $tokens
+        }
+
+
+ * The expected result is:
+
+        { "tweetid": "9", "counthashed-word-tokens": [ -1217719622, -447857469, -1884722688, -325178649, 210976949, 285049676, 1916743959 ] }
+
+
+### gram-tokens ###
+ * Syntax:
+
+        gram-tokens(string_expression, gram_length, boolean_expression)
+
+ * Returns a list of gram tokens of `string_expression`, which can be obtained by scanning the characters using a sliding window of a fixed length.
+ * Arguments:
+    * `string_expression` : A `String` that will be tokenized.
+    * `gram_length` : An `Int32` as the length of grams.
+   * `boolean_expression` : A `Boolean` value to indicate whether to generate additional grams by pre- and postfixing `string_expression` with special characters.
+ * Return Value:
+    * An `OrderedList` of String gram tokens.
+
+ * Example:
+
+        use dataverse TinySocial;
+
+        for $t in dataset('TweetMessages')
+        let $tokens := gram-tokens($t.message-text, 3, true)
+        where $t.send-time >= datetime('2012-01-01T00:00:00')
+        return {
+        "tweetid": $t.tweetid,
+        "gram-tokens": $tokens
+        }
+
+
+ * The expected result is:
+
+        {
+        "tweetid": "9",
+        "gram-tokens": [ "## ", "# l", " lo", "lov", "ove", "ve ", "e v", " ve", "ver", "eri", "riz", "izo", "zon", "on ", "n i", " it", "its", "ts ", "s v", " vo", "voi", "oic", "ice",
+        "cem", "ema", "mai", "ail", "il-", "l-s", "-se", "ser", "erv", "rvi", "vic", "ice", "ce ", "e i", " is", "is ", "s a", " aw", "awe", "wes", "eso", "som", "ome", "me$", "e$$" ]
+        }
+
+
+### hashed-gram-tokens ###
+ * Syntax:
+
+        hashed-gram-tokens(string_expression, gram_length, boolean_expression)
+
+ * Returns a list of hashed gram tokens of `string_expression`.
+ * Arguments:
+    * `string_expression` : A `String` that will be tokenized.
+    * `gram_length` : An `Int32` as the length of grams.
+    * `boolean_expression` : A `Boolean` to indicate whether to generate additional grams by pre- and postfixing `string_expression` with special characters.
+ * Return Value:
+    * An `OrderedList` of `Int32` hashed gram tokens.
+
+ * Example:
+
+        use dataverse TinySocial;
+
+        for $t in dataset('TweetMessages')
+        let $tokens := hashed-gram-tokens($t.message-text, 3, true)
+        where $t.send-time >= datetime('2012-01-01T00:00:00')
+        return {
+        "tweetid": $t.tweetid,
+        "hashed-gram-tokens": $tokens
+        }
+
+
+ * The expected result is:
+
+        {
+        "tweetid": "9",
+        "hashed-gram-tokens": [ 40557178, -2002241593, 161665899, -856104603, -500544946, 693410611, 395674299, -1015235909, 1115608337, 1187999872, -31006095, -219180466, -1676061637,
+        1040194153, -1339307841, -1527110163, -1884722688, -179148713, -431014627, -1789789823, -1209719926, 684519765, -486734513, 1734740619, -1971673751, -932421915, -2064668066,
+        -937135958, -790946468, -69070309, 1561601454, 26169001, -160734571, 1330043462, -486734513, -18796768, -470303314, 113421364, 1615760212, 1688217556, 1223719184, 536568131,
+        1682609873, 2935161, -414769471, -1027490137, 1602276102, 1050490461 ]
+        }
+
+
+### counthashed-gram-tokens ###
+ * Syntax:
+
+        counthashed-gram-tokens(string_expression, gram_length, boolean_expression)
+
+ * Returns a list of hashed gram tokens of `string_expression`. The hashing mechanism gives duplicate tokens different hash values, based on the occurrence count of that token.
+ * Arguments:
+    * `string_expression` : A `String` that will be tokenized.
+    * `gram_length` : An `Int32`, length of grams to generate.
+    * `boolean_expression` : A `Boolean`, whether to generate additional grams by pre- and postfixing `string_expression` with special characters.
+ * Return Value:
+    * An `OrderedList` of `Int32` hashed gram tokens.
+
+ * Example:
+
+        use dataverse TinySocial;
+
+        for $t in dataset('TweetMessages')
+        let $tokens := counthashed-gram-tokens($t.message-text, 3, true)
+        where $t.send-time >= datetime('2012-01-01T00:00:00')
+        return {
+        "tweetid": $t.tweetid,
+        "counthashed-gram-tokens": $tokens
+        }
+
+
+ * The expected result is:
+
+        {
+        "tweetid": "9",
+        "counthashed-gram-tokens": [ 40557178, -2002241593, 161665899, -856104603, -500544946, 693410611, 395674299, -1015235909, 1115608337, 1187999872, -31006095, -219180466, -1676061637,
+        1040194153, -1339307841, -1527110163, -1884722688, -179148713, -431014627, -1789789823, -1209719926, 684519765, -486734513, 1734740619, -1971673751, -932421915, -2064668066, -937135958,
+        -790946468, -69070309, 1561601454, 26169001, -160734571, 1330043462, -486734512, -18796768, -470303314, 113421364, 1615760212, 1688217556, 1223719184, 536568131, 1682609873, 2935161,
+        -414769471, -1027490137, 1602276102, 1050490461 ]
+        } --></div></div>
+<div class="section">
+<h2><a name="TemporalFunctions" id="TemporalFunctions">Temporal Functions</a> <font size="4"><a href="#toc">[Back to TOC]</a></font><a name="Temporal_Functions_Back_to_TOC"></a></h2>
+<div class="section">
+<h3>get-year/get-month/get-day/get-hour/get-minute/get-second/get-millisecond<a name="get-yearget-monthget-dayget-hourget-minuteget-secondget-millisecond"></a></h3>
+
+<ul>
+  
+<li>
+<p>Syntax:</p>
+  
+<div class="source">
+<pre>get-year/get-month/get-day/get-hour/get-minute/get-second/get-millisecond(temporal_expression)
+</pre></div></li>
+  
+<li>
+<p>Accessors for accessing fields in a temporal value</p></li>
+  
+<li>Arguments:
+  
+<ul>
+    
+<li><tt>temporal_expression</tt> : a temporal value represented as one of the following types: <tt>date</tt>, <tt>datetime</tt>, <tt>time</tt>, and <tt>duration</tt>.</li>
+  </ul></li>
+  
+<li>Return Value:
+  
+<ul>
+    
+<li>An <tt>int64</tt> value representing the field to be extracted.</li>
+  </ul></li>
+  
+<li>
+<p>Example:</p>
+  
+<div class="source">
+<pre>let $c1 := date(&quot;2010-10-30&quot;)
+let $c2 := datetime(&quot;1987-11-19T23:49:23.938&quot;)
+let $c3 := time(&quot;12:23:34.930+07:00&quot;)
+let $c4 := duration(&quot;P3Y73M632DT49H743M3948.94S&quot;)
+
+return {&quot;year&quot;: get-year($c1), &quot;month&quot;: get-month($c2), &quot;day&quot;: get-day($c1), &quot;hour&quot;: get-hour($c3), &quot;min&quot;: get-minute($c4), &quot;second&quot;: get-second($c2), &quot;ms&quot;: get-millisecond($c4)}
+</pre></div></li>
+</ul>
+
+<ul>
+  
+<li>
+<p>The expected result is:</p>
+  
+<div class="source">
+<pre>{ &quot;year&quot;: 2010, &quot;month&quot;: 11, &quot;day&quot;: 30, &quot;hour&quot;: 5, &quot;min&quot;: 28, &quot;second&quot;: 23, &quot;ms&quot;: 94 }
+</pre></div></li>
+</ul></div>
+<div class="section">
+<h3>adjust-datetime-for-timezone<a name="adjust-datetime-for-timezone"></a></h3>
+
+<ul>
+  
+<li>
+<p>Syntax:</p>
+  
+<div class="source">
+<pre>adjust-datetime-for-timezone(datetime_expression, string_expression)
+</pre></div></li>
+  
+<li>
+<p>Adjusts the given datetime <tt>datetime_expression</tt> by applying the timezone information <tt>string_expression</tt>.</p></li>
+  
+<li>Arguments:
+  
+<ul>
+    
+<li><tt>datetime_expression</tt> : A <tt>datetime</tt> value to be adjusted.</li>
+    
+<li><tt>string_expression</tt> : A <tt>string</tt> representing the timezone information.</li>
+  </ul></li>
+  
+<li>Return Value:
+  
+<ul>
+    
+<li>A <tt>string</tt> value representing the new datetime after being adjusted by the timezone information.</li>
+  </ul></li>
+  
+<li>
+<p>Example:</p>
+  
+<div class="source">
+<pre>use dataverse TinySocial;
+
+for $i in dataset('TweetMessages')
+return {&quot;adjusted-send-time&quot;: adjust-datetime-for-timezone($i.send-time, &quot;+08:00&quot;), &quot;message&quot;: $i.message-text}
+</pre></div></li>
+</ul>
+
+<ul>
+  
+<li>
+<p>The expected result is:</p>
+  
+<div class="source">
+<pre>{ &quot;adjusted-send-time&quot;: &quot;2008-04-26T18:10:00.000+08:00&quot;, &quot;message&quot;: &quot; love t-mobile its customization is good:)&quot; }
+{ &quot;adjusted-send-time&quot;: &quot;2010-05-13T18:10:00.000+08:00&quot;, &quot;message&quot;: &quot; like verizon its shortcut-menu is awesome:)&quot; }
+{ &quot;adjusted-send-time&quot;: &quot;2006-11-04T18:10:00.000+08:00&quot;, &quot;message&quot;: &quot; like motorola the speed is good:)&quot; }
+{ &quot;adjusted-send-time&quot;: &quot;2011-12-26T18:10:00.000+08:00&quot;, &quot;message&quot;: &quot; like sprint the voice-command is mind-blowing:)&quot; }
+{ &quot;adjusted-send-time&quot;: &quot;2006-08-04T18:10:00.000+08:00&quot;, &quot;message&quot;: &quot; can't stand motorola its speed is terrible:(&quot; }
+{ &quot;adjusted-send-time&quot;: &quot;2010-05-07T18:10:00.000+08:00&quot;, &quot;message&quot;: &quot; like iphone the voice-clarity is good:)&quot; }
+{ &quot;adjusted-send-time&quot;: &quot;2011-08-25T18:10:00.000+08:00&quot;, &quot;message&quot;: &quot; like samsung the platform is good&quot; }
+{ &quot;adjusted-send-time&quot;: &quot;2005-10-14T18:10:00.000+08:00&quot;, &quot;message&quot;: &quot; like t-mobile the shortcut-menu is awesome:)&quot; }
+{ &quot;adjusted-send-time&quot;: &quot;2012-07-21T18:10:00.000+08:00&quot;, &quot;message&quot;: &quot; love verizon its voicemail-service is awesome&quot; }
+{ &quot;adjusted-send-time&quot;: &quot;2008-01-26T18:10:00.000+08:00&quot;, &quot;message&quot;: &quot; hate verizon its voice-clarity is OMG:(&quot; }
+{ &quot;adjusted-send-time&quot;: &quot;2008-03-09T18:10:00.000+08:00&quot;, &quot;message&quot;: &quot; can't stand iphone its platform is terrible&quot; }
+{ &quot;adjusted-send-time&quot;: &quot;2010-02-13T18:10:00.000+08:00&quot;, &quot;message&quot;: &quot; like samsung the voice-command is amazing:)&quot; }
+</pre></div></li>
+</ul></div>
+<div class="section">
+<h3>adjust-time-for-timezone<a name="adjust-time-for-timezone"></a></h3>
+
+<ul>
+  
+<li>
+<p>Syntax:</p>
+  
+<div class="source">
+<pre>adjust-time-for-timezone(time_expression, string_expression)
+</pre></div></li>
+  
+<li>
+<p>Adjusts the given time <tt>time_expression</tt> by applying the timezone information <tt>string_expression</tt>.</p></li>
+  
+<li>Arguments:
+  
+<ul>
+    
+<li><tt>time_expression</tt> : A <tt>time</tt> value to be adjusted.</li>
+    
+<li><tt>string_expression</tt> : A <tt>string</tt> representing the timezone information.</li>
+  </ul></li>
+  
+<li>Return Value:
+  
+<ul>
+    
+<li>A <tt>string</tt> value representing the new time after being adjusted by the timezone information.</li>
+  </ul></li>
+  
+<li>
+<p>Example:</p>
+  
+<div class="source">
+<pre>use dataverse TinySocial;
+
+for $i in dataset('TweetMessages')
+return {&quot;adjusted-send-time&quot;: adjust-time-for-timezone(time-from-datetime($i.send-time), &quot;+08:00&quot;), &quot;message&quot;: $i.message-text}
+</pre></div></li>
+</ul>
+
+<ul>
+  
+<li>
+<p>The expected result is:</p>
+  
+<div class="source">
+<pre>{ &quot;adjusted-send-time&quot;: &quot;18:10:00.000+08:00&quot;, &quot;message&quot;: &quot; love t-mobile its customization is good:)&quot; }
+{ &quot;adjusted-send-time&quot;: &quot;18:10:00.000+08:00&quot;, &quot;message&quot;: &quot; like verizon its shortcut-menu is awesome:)&quot; }
+{ &quot;adjusted-send-time&quot;: &quot;18:10:00.000+08:00&quot;, &quot;message&quot;: &quot; like motorola the speed is good:)&quot; }
+{ &quot;adjusted-send-time&quot;: &quot;18:10:00.000+08:00&quot;, &quot;message&quot;: &quot; like sprint the voice-command is mind-blowing:)&quot; }
+{ &quot;adjusted-send-time&quot;: &quot;18:10:00.000+08:00&quot;, &quot;message&quot;: &quot; can't stand motorola its speed is terrible:(&quot; }
+{ &quot;adjusted-send-time&quot;: &quot;18:10:00.000+08:00&quot;, &quot;message&quot;: &quot; like iphone the voice-clarity is good:)&quot; }
+{ &quot;adjusted-send-time&quot;: &quot;18:10:00.000+08:00&quot;, &quot;message&quot;: &quot; like samsung the platform is good&quot; }
+{ &quot;adjusted-send-time&quot;: &quot;18:10:00.000+08:00&quot;, &quot;message&quot;: &quot; like t-mobile the shortcut-menu is awesome:)&quot; }
+{ &quot;adjusted-send-time&quot;: &quot;18:10:00.000+08:00&quot;, &quot;message&quot;: &quot; love verizon its voicemail-service is awesome&quot; }
+{ &quot;adjusted-send-time&quot;: &quot;18:10:00.000+08:00&quot;, &quot;message&quot;: &quot; hate verizon its voice-clarity is OMG:(&quot; }
+{ &quot;adjusted-send-time&quot;: &quot;18:10:00.000+08:00&quot;, &quot;message&quot;: &quot; can't stand iphone its platform is terrible&quot; }
+{ &quot;adjusted-send-time&quot;: &quot;18:10:00.000+08:00&quot;, &quot;message&quot;: &quot; like samsung the voice-command is amazing:)&quot; }
+</pre></div></li>
+</ul></div>
+<div class="section">
+<h3>calendar-duration-from-datetime<a name="calendar-duration-from-datetime"></a></h3>
+
+<ul>
+  
+<li>
+<p>Syntax:</p>
+  
+<div class="source">
+<pre>calendar-duration-from-datetime(datetime_expression, duration_expression)
+</pre></div></li>
+  
+<li>
+<p>Gets a user-friendly representation of the duration <tt>duration_expression</tt> based on the given datetime <tt>datetime_expression</tt>.</p></li>
+  
+<li>Arguments:
+  
+<ul>
+    
+<li><tt>datetime_expression</tt> : A <tt>datetime</tt> value to be used as the reference time point.</li>
+    
+<li><tt>duration_expression</tt> : A <tt>duration</tt> value to be converted.</li>
+  </ul></li>
+  
+<li>Return Value:
+  
+<ul>
+    
+<li>A <tt>duration</tt> value with the duration as <tt>duration_expression</tt> but with a user-friendly representation.</li>
+  </ul></li>
+  
+<li>
+<p>Example:</p>
+  
+<div class="source">
+<pre>use dataverse TinySocial;
+
+for $i in dataset('TweetMessages')
+where $i.send-time &gt; datetime(&quot;2011-01-01T00:00:00&quot;)
+return {&quot;since-2011&quot;: subtract-datetime($i.send-time, datetime(&quot;2011-01-01T00:00:00&quot;)), &quot;since-2011-user-friendly&quot;: calendar-duration-from-datetime($i.send-time, subtract-datetime($i.send-time, datetime(&quot;2011-01-01T00:00:00&quot;)))}
+</pre></div></li>
+</ul>
+
+<ul>
+  
+<li>
+<p>The expected result is:</p>
+  
+<div class="source">
+<pre>{ &quot;since-2011&quot;: duration(&quot;P359DT10H10M&quot;), &quot;since-2011-user-friendly&quot;: duration(&quot;P11M23DT10H10M&quot;) }
+{ &quot;since-2011&quot;: duration(&quot;P236DT10H10M&quot;), &quot;since-2011-user-friendly&quot;: duration(&quot;P7M23DT10H10M&quot;) }
+{ &quot;since-2011&quot;: duration(&quot;P567DT10H10M&quot;), &quot;since-2011-user-friendly&quot;: duration(&quot;P1Y6M18DT10H10M&quot;) }
+</pre></div></li>
+</ul></div>
+<div class="section">
+<h3>get-year-month-duration/get-day-time-duration<a name="get-year-month-durationget-day-time-duration"></a></h3>
+
+<ul>
+  
+<li>
+<p>Syntax:</p>
+  
+<div class="source">
+<pre>get-year-month-duration/get-day-time-duration(duration_expression)
+</pre></div></li>
+  
+<li>
+<p>Extracts the correct <tt>duration</tt> subtype from <tt>duration_expression</tt>.</p></li>
+  
+<li>Arguments:
+  
+<ul>
+    
+<li><tt>duration_expression</tt> : A <tt>duration</tt> value to be converted.</li>
+  </ul></li>
+  
+<li>Return Value:
+  
+<ul>
+    
+<li>A <tt>year-month-duration</tt> value or a <tt>day-time-duration</tt> value.</li>
+  </ul></li>
+  
+<li>
+<p>Example:</p>
+  
+<div class="source">
+<pre>let $i := get-year-month-duration(duration(&quot;P12M50DT10H&quot;))
+return $i;
+</pre></div></li>
+</ul>
+
+<ul>
+  
+<li>
+<p>The expected result is:</p>
+  
+<div class="source">
+<pre>year-month-duration(&quot;P1Y&quot;)
+</pre></div></li>
+</ul></div>
+<div class="section">
+<h3>months-from-year-month-duration/milliseconds-from-day-time-duration<a name="months-from-year-month-durationmilliseconds-from-day-time-duration"></a></h3>
+
+<ul>
+  
+<li>
+<p>Syntax:</p>
+  
+<div class="source">
+<pre>months-from-year-month-duration/milliseconds-from-day-time-duration(duration_expression)
+</pre></div></li>
+  
+<li>
+<p>Extracts the number of months or the number of milliseconds from the <tt>duration</tt> subtype.</p></li>
+  
+<li>Arguments:
+  
+<ul>
+    
+<li><tt>duration_expression</tt> : A <tt>duration</tt> of the correct subtype.</li>
+  </ul></li>
+  
+<li>Return Value:
+  
+<ul>
+    
+<li>An <tt>int64</tt> representing the number or months/milliseconds.</li>
+  </ul></li>
+  
+<li>
+<p>Example:</p>
+  
+<div class="source">
+<pre>let $i := months-from-year-month-duration(get-year-month-duration(duration(&quot;P5Y7MT50M&quot;)))
+return $i;
+</pre></div></li>
+</ul>
+
+<ul>
+  
+<li>
+<p>The expected result is:</p>
+  
+<div class="source">
+<pre>67
+</pre></div></li>
+</ul></div>
+<div class="section">
+<h3>duration-from-months/duration-from-ms<a name="duration-from-monthsduration-from-ms"></a></h3>
+
+<ul>
+  
+<li>
+<p>Syntax:</p>
+  
+<div class="source">
+<pre>duration-from-months/duration-from-ms(number_expression)
+</pre></div></li>
+  
+<li>
+<p>Creates a <tt>duration</tt> from <tt>number_expression</tt>.</p></li>
+  
+<li>Arguments:
+  
+<ul>
+    
+<li><tt>number_expression</tt> : An <tt>int64</tt> representing the number of months/milliseconds</li>
+  </ul></li>
+  
+<li>Return Value:
+  
+<ul>
+    
+<li>A <tt>duration</tt> containing <tt>number_expression</tt> value for months/milliseconds</li>
+  </ul></li>
+  
+<li>
+<p>Example:</p>
+  
+<div class="source">
+<pre>let $i := duration-from-months(8)
+return $i;
+</pre></div></li>
+  
+<li>
+<p>The expected result is:</p>
+  
+<div class="source">
+<pre>duration(&quot;P8M&quot;)
+</pre></div></li>
+</ul></div>
+<div class="section">
+<h3>duration-from-interval<a name="duration-from-interval"></a></h3>
+
+<ul>
+  
+<li>
+<p>Syntax:</p>
+  
+<div class="source">
+<pre>duration-from-interval(interval_expression)
+</pre></div></li>
+  
+<li>
+<p>Creates a <tt>duration</tt> from <tt>interval_expression</tt>.</p></li>
+  
+<li>Arguments:
+  
+<ul>
+    
+<li><tt>interval_expression</tt> : An <tt>interval</tt> value</li>
+  </ul></li>
+  
+<li>Return Value:
+  
+<ul>
+    
+<li>A <tt>duration</tt> repesenting the time in the <tt>interval_expression</tt></li>
+  </ul></li>
+  
+<li>
+<p>Example:</p>
+  
+<div class="source">
+<pre>let $itv1 := interval-from-date(&quot;2010-10-30&quot;, &quot;2010-12-21&quot;)
+let $itv2 := interval-from-datetime(&quot;2012-06-26T01:01:01.111&quot;, &quot;2012-07-27T02:02:02.222&quot;)
+let $itv3 := interval-from-time(&quot;12:32:38&quot;, &quot;20:29:20&quot;)
+
+return { &quot;dr1&quot; : duration-from-interval($itv1),
+  &quot;dr2&quot; : duration-from-interval($itv2),
+  &quot;dr3&quot; : duration-from-interval($itv3),
+  &quot;dr4&quot; : duration-from-interval(null) }
+</pre></div></li>
+  
+<li>
+<p>The expected result is:</p>
+  
+<div class="source">
+<pre>{ &quot;dr1&quot;: day-time-duration(&quot;P52D&quot;),
+  &quot;dr2&quot;: day-time-duration(&quot;P31DT1H1M1.111S&quot;),
+  &quot;dr3&quot;: day-time-duration(&quot;PT7H56M42S&quot;),
+  &quot;dr4&quot;: null }
+</pre></div></li>
+</ul></div>
+<div class="section">
+<h3>current-date<a name="current-date"></a></h3>
+
+<ul>
+  
+<li>
+<p>Syntax:</p>
+  
+<div class="source">
+<pre>current-date()
+</pre></div></li>
+  
+<li>
+<p>Gets the current date.</p></li>
+  
+<li>Arguments: None</li>
+  
+<li>Return Value:
+  
+<ul>
+    
+<li>A <tt>date</tt> value of the date when the function is called.</li>
+  </ul></li>
+</ul></div>
+<div class="section">
+<h3>current-time<a name="current-time"></a></h3>
+
+<ul>
+  
+<li>
+<p>Syntax:</p>
+  
+<div class="source">
+<pre>current-time()
+</pre></div></li>
+  
+<li>
+<p>Get the current time</p></li>
+  
+<li>Arguments: None</li>
+  
+<li>Return Value:
+  
+<ul>
+    
+<li>A <tt>time</tt> value of the time when the function is called.</li>
+  </ul></li>
+</ul></div>
+<div class="section">
+<h3>current-datetime<a name="current-datetime"></a></h3>
+
+<ul>
+  
+<li>
+<p>Syntax:</p>
+  
+<div class="source">
+<pre>current-datetime()
+</pre></div></li>
+  
+<li>
+<p>Get the current datetime</p></li>
+  
+<li>Arguments: None</li>
+  
+<li>Return Value:
+  
+<ul>
+    
+<li>A <tt>datetime</tt> value of the datetime when the function is called.</li>
+  </ul></li>
+  
+<li>
+<p>Example:</p>
+  
+<div class="source">
+<pre>{&quot;current-date&quot;: current-date(),
+&quot;current-time&quot;: current-time(),
+&quot;current-datetime&quot;: current-datetime()}
+</pre></div></li>
+</ul>
+
+<ul>
+  
+<li>
+<p>The expected result is:</p>
+  
+<div class="source">
+<pre>{ &quot;current-date&quot;: date(&quot;2013-04-06&quot;),
+&quot;current-time&quot;: time(&quot;00:48:44.093Z&quot;),
+&quot;current-datetime&quot;: datetime(&quot;2013-04-06T00:48:44.093Z&quot;) }
+</pre></div></li>
+</ul></div>
+<div class="section">
+<h3>get-date-from-datetime<a name="get-date-from-datetime"></a></h3>
+
+<ul>
+  
+<li>
+<p>Syntax:</p>
+  
+<div class="source">
+<pre>get-date-from-datetime(datetime_expression)
+</pre></div></li>
+  
+<li>
+<p>Gets the date value from the given datetime value <tt>datetime_expression</tt>.</p></li>
+  
+<li>Arguments:
+  
+<ul>
+    
+<li><tt>datetime_expression</tt>: A <tt>datetime</tt> value to be extracted from.</li>
+  </ul></li>
+  
+<li>Return Value:
+  
+<ul>
+    
+<li>A <tt>date</tt> value from the datetime.</li>
+  </ul></li>
+</ul></div>
+<div class="section">
+<h3>get-time-from-datetime<a name="get-time-from-datetime"></a></h3>
+
+<ul>
+  
+<li>
+<p>Syntax:</p>
+  
+<div class="source">
+<pre>get-time-from-datetime(datetime_expression)
+</pre></div></li>
+  
+<li>
+<p>Get the time value from the given datetime value <tt>datetime_expression</tt></p></li>
+  
+<li>Arguments:
+  
+<ul>
+    
+<li><tt>datetime_expression</tt>: A <tt>datetime</tt> value to be extracted from</li>
+  </ul></li>
+  
+<li>Return Value:
+  
+<ul>
+    
+<li>A <tt>time</tt> value from the datetime.</li>
+  </ul></li>
+  
+<li>
+<p>Example:</p>
+  
+<div class="source">
+<pre>use dataverse TinySocial;
+
+for $i in dataset('TweetMessages')
+where $i.send-time &gt; datetime(&quot;2011-01-01T00:00:00&quot;)
+return {&quot;send-date&quot;: get-date-from-datetime($i.send-time), &quot;send-time&quot;: get-time-from-datetime($i.send-time)}
+</pre></div></li>
+</ul>
+
+<ul>
+  
+<li>
+<p>The expected result is:</p>
+  
+<div class="source">
+<pre>{ &quot;send-date&quot;: date(&quot;2011-12-26&quot;), &quot;send-time&quot;: time(&quot;10:10:00.000Z&quot;) }
+{ &quot;send-date&quot;: date(&quot;2011-08-25&quot;), &quot;send-time&quot;: time(&quot;10:10:00.000Z&quot;) }
+{ &quot;send-date&quot;: date(&quot;2012-07-21&quot;), &quot;send-time&quot;: time(&quot;10:10:00.000Z&quot;) }
+</pre></div></li>
+</ul></div>
+<div class="section">
+<h3>day-of-week<a name="day-of-week"></a></h3>
+
+<ul>
+  
+<li>
+<p>Syntax:</p>
+  
+<div class="source">
+<pre>day-of-week(date_expression)
+</pre></div></li>
+  
+<li>
+<p>Finds the day of the week for a given date (1-7)</p></li>
+  
+<li>Arguments:
+  
+<ul>
+    
+<li><tt>date_expression</tt>: A <tt>date</tt> value (Can also be a <tt>datetime</tt>)</li>
+  </ul></li>
+  
+<li>Return Value:
+  
+<ul>
+    
+<li>An <tt>int8</tt> representing the day of the week (1-7)</li>
+  </ul></li>
+  
+<li>
+<p>Example:</p>
+  
+<div class="source">
+<pre>let $i := day-of-week( datetime(&quot;2012-12-30T12:12:12.039Z&quot;))
+return $i;
+</pre></div></li>
+</ul>
+
+<ul>
+  
+<li>
+<p>The expected result is:</p>
+  
+<div class="source">
+<pre>7
+</pre></div></li>
+</ul></div>
+<div class="section">
+<h3>date-from-unix-time-in-days<a name="date-from-unix-time-in-days"></a></h3>
+
+<ul>
+  
+<li>
+<p>Syntax:</p>
+  
+<div class="source">
+<pre>date-from-unix-time-in-days(numeric_expression)
+</pre></div></li>
+  
+<li>
+<p>Gets a date representing the time after <tt>numeric_expression</tt> days since 1970-01-01.</p></li>
+  
+<li>Arguments:
+  
+<ul>
+    
+<li><tt>numeric_expression</tt>: A <tt>int8</tt>/<tt>int16</tt>/<tt>int32</tt>/<tt>int64</tt> value representing the number of days.</li>
+  </ul></li>
+  
+<li>Return Value:
+  
+<ul>
+    
+<li>A <tt>date</tt> value as the time after <tt>numeric_expression</tt> days since 1970-01-01.</li>
+  </ul></li>
+</ul></div>
+<div class="section">
+<h3>datetime-from-unix-time-in-ms<a name="datetime-from-unix-time-in-ms"></a></h3>
+
+<ul>
+  
+<li>
+<p>Syntax:</p>
+  
+<div class="source">
+<pre>datetime-from-unix-time-in-ms(numeric_expression)
+</pre></div></li>
+  
+<li>
+<p>Gets a datetime representing the time after <tt>numeric_expression</tt> milliseconds since 1970-01-01T00:00:00Z.</p></li>
+  
+<li>Arguments:
+  
+<ul>
+    
+<li><tt>numeric_expression</tt>: A <tt>int8</tt>/<tt>int16</tt>/<tt>int32</tt>/<tt>int64</tt> value representing the number of milliseconds.</li>
+  </ul></li>
+  
+<li>Return Value:
+  
+<ul>
+    
+<li>A <tt>datetime</tt> value as the time after <tt>numeric_expression</tt> milliseconds since 1970-01-01T00:00:00Z.</li>
+  </ul></li>
+</ul></div>
+<div class="section">
+<h3>datetime-from-unix-time-in-secs<a name="datetime-from-unix-time-in-secs"></a></h3>
+
+<ul>
+  
+<li>
+<p>Syntax:</p>
+  
+<div class="source">
+<pre>datetime-from-unix-time-in-secs(numeric_expression)
+</pre></div></li>
+  
+<li>
+<p>Gets a datetime representing the time after <tt>numeric_expression</tt> seconds since 1970-01-01T00:00:00Z.</p></li>
+  
+<li>Arguments:
+  
+<ul>
+    
+<li><tt>numeric_expression</tt>: A <tt>int8</tt>/<tt>int16</tt>/<tt>int32</tt>/<tt>int64</tt> value representing the number of seconds.</li>
+  </ul></li>
+  
+<li>Return Value:
+  
+<ul>
+    
+<li>A <tt>datetime</tt> value as the time after <tt>numeric_expression</tt> seconds since 1970-01-01T00:00:00Z.</li>
+  </ul></li>
+</ul></div>
+<div class="section">
+<h3>datetime-from-date-time<a name="datetime-from-date-time"></a></h3>
+
+<ul>
+  
+<li>Syntax:</li>
+</ul>
+<p>datetime-from-date-time(date_expression,time_expression)</p>
+
+<ul>
+  
+<li>Gets a datetime representing the combination of <tt>date_expression</tt> and <tt>time_expression</tt>
+  
+<ul>
+    
+<li>Arguments:</li>
+    
+<li><tt>date_expression</tt>: A <tt>date</tt> value</li>
+    
+<li><tt>time_expression</tt> A <tt>time</tt> value</li>
+  </ul></li>
+  
+<li>Return Value:
+  
+<ul>
+    
+<li>A <tt>datetime</tt> value by combining <tt>date_expression</tt> and <tt>time_expression</tt></li>
+  </ul></li>
+</ul></div>
+<div class="section">
+<h3>time-from-unix-time-in-ms<a name="time-from-unix-time-in-ms"></a></h3>
+
+<ul>
+  
+<li>
+<p>Syntax:</p>
+  
+<div class="source">
+<pre>time-from-unix-time-in-ms(numeric_expression)
+</pre></div></li>
+  
+<li>
+<p>Gets a time representing the time after <tt>numeric_expression</tt> milliseconds since 00:00:00.000Z.</p></li>
+  
+<li>Arguments:
+  
+<ul>
+    
+<li><tt>numeric_expression</tt>: A <tt>int8</tt>/<tt>int16</tt>/<tt>int32</tt>/<tt>int64</tt> value representing the number of milliseconds.</li>
+  </ul></li>
+  
+<li>Return Value:
+  
+<ul>
+    
+<li>A <tt>time</tt> value as the time after <tt>numeric_expression</tt> milliseconds since 00:00:00.000Z.</li>
+  </ul></li>
+  
+<li>
+<p>Example:</p>
+  
+<div class="source">
+<pre>use dataverse TinySocial;
+
+let $d := date-from-unix-time-in-days(15800)
+let $dt := datetime-from-unix-time-in-ms(1365139700000)
+let $t := time-from-unix-time-in-ms(3748)
+return {&quot;date&quot;: $d, &quot;datetime&quot;: $dt, &quot;time&quot;: $t}
+</pre></div></li>
+</ul>
+
+<ul>
+  
+<li>
+<p>The expected result is:</p>
+  
+<div class="source">
+<pre>{ &quot;date&quot;: date(&quot;2013-04-05&quot;), &quot;datetime&quot;: datetime(&quot;2013-04-05T05:28:20.000Z&quot;), &quot;time&quot;: time(&quot;00:00:03.748Z&quot;) }
+</pre></div></li>
+</ul></div>
+<div class="section">
+<h3>parse-date/parse-time/parse-datetime<a name="parse-dateparse-timeparse-datetime"></a></h3>
+
+<ul>
+  
+<li>Syntax:</li>
+</ul>
+<p>parse-date/parse-time/parse-datetime(date_expression,formatting_expression)</p>
+
+<ul>
+  
+<li>Creates a <tt>date/time/date-time</tt> value by treating <tt>date_expression</tt> with formatting <tt>formatting_expression</tt></li>
+  
+<li>Arguments:
+  
+<ul>
+    
+<li><tt>date_expression</tt>: A <tt>string</tt> value representing the <tt>date/time/datetime</tt>.</li>
+    
+<li><tt>formatting_expression</tt> A <tt>string</tt> value providing the formatting for <tt>date_expression</tt>.Characters used to create date expression:</li>
+    
+<li><tt>h</tt> hours</li>
+    
+<li><tt>m</tt> minutes</li>
+    
+<li><tt>s</tt> seconds</li>
+    
+<li><tt>n</tt> milliseconds</li>
+    
+<li><tt>a</tt> am/pm</li>
+    
+<li><tt>z</tt> timezone</li>
+    
+<li><tt>Y</tt> year</li>
+    
+<li><tt>M</tt> month</li>
+    
+<li><tt>D</tt> day</li>
+    
+<li><tt>W</tt> weekday</li>
+    
+<li><tt>-</tt>, <tt>'</tt>, <tt>/</tt>, <tt>.</tt>, <tt>,</tt>, <tt>T</tt> seperators for both time and date</li>
+  </ul></li>
+  
+<li>Return Value:
+  
+<ul>
+    
+<li>A <tt>date/time/date-time</tt> value corresponding to <tt>date_expression</tt></li>
+  </ul></li>
+  
+<li>
+<p>Example:</p>
+  
+<div class="source">
+<pre>let $i := parse-time(&quot;30:30&quot;,&quot;m:s&quot;)
+return $i;
+</pre></div></li>
+  
+<li>
+<p>The expected result is:</p>
+  
+<div class="source">
+<pre>time(&quot;00:30:30.000Z&quot;)
+</pre></div></li>
+</ul></div>
+<div class="section">
+<h3>print-date/print-time/print-datetime<a name="print-dateprint-timeprint-datetime"></a></h3>
+
+<ul>
+  
+<li>Syntax:</li>
+</ul>
+<p>print-date/print-time/print-datetime(date_expression,formatting_expression)</p>
+
+<ul>
+  
+<li>Creates a <tt>string</tt> representing a <tt>date/time/date-time</tt> value of the <tt>date_expression</tt> using the formatting <tt>formatting_expression</tt></li>
+  
+<li>Arguments:
+  
+<ul>
+    
+<li><tt>date_expression</tt>: A <tt>date/time/datetime</tt> value.</li>
+    
+<li><tt>formatting_expression</tt> A <tt>string</tt> value providing the formatting for <tt>date_expression</tt>. Characters used to create date expression:</li>
+    
+<li><tt>h</tt> hours</li>
+    
+<li><tt>m</tt> minutes</li>
+    
+<li><tt>s</tt> seconds</li>
+    
+<li><tt>n</tt> milliseconds</li>
+    
+<li><tt>a</tt> am/pm</li>
+    
+<li><tt>z</tt> timezone</li>
+    
+<li><tt>Y</tt> year</li>
+    
+<li><tt>M</tt> month</li>
+    
+<li><tt>D</tt> day</li>
+    
+<li><tt>W</tt> weekday</li>
+    
+<li><tt>-</tt>, <tt>'</tt>, <tt>/</tt>, <tt>.</tt>, <tt>,</tt>, <tt>T</tt> seperators for both time and date</li>
+  </ul></li>
+  
+<li>Return Value:
+  
+<ul>
+    
+<li>A <tt>string</tt> value corresponding to <tt>date_expression</tt></li>
+  </ul></li>
+  
+<li>
+<p>Example:</p>
+  
+<div class="source">
+<pre>let $i := print-time(time(&quot;00:30:30.000Z&quot;),&quot;m:s&quot;)
+return $i;
+</pre></div></li>
+  
+<li>
+<p>The expected result is:</p>
+  
+<div class="source">
+<pre>&quot;30:30&quot;
+</pre></div></li>
+</ul></div>
+<div class="section">
+<h3>get-interval-start, get-interval-end<a name="get-interval-start_get-interval-end"></a></h3>
+
+<ul>
+  
+<li>
+<p>Syntax:</p>
+  
+<div class="source">
+<pre>get-interval-start/get-interval-end(interval)
+</pre></div></li>
+  
+<li>
+<p>Gets the start/end of the given interval.</p></li>
+  
+<li>Arguments:
+  
+<ul>
+    
+<li><tt>interval</tt>: the interval to be accessed.</li>
+  </ul></li>
+  
+<li>Return Value:
+  
+<ul>
+    
+<li>A <tt>time</tt>, <tt>date</tt>, or <tt>datetime</tt> (depending on the time instances of the interval) representing the starting or ending time.</li>
+  </ul></li>
+  
+<li>
+<p>Example:</p>
+  
+<div class="source">
+<pre>let $itv := interval-start-from-date(&quot;1984-01-01&quot;, &quot;P1Y&quot;)
+return {&quot;start&quot;: get-interval-start($itv), &quot;end&quot;: get-interval-end($itv)}
+</pre></div></li>
+</ul>
+
+<ul>
+  
+<li>
+<p>The expected result is:</p>
+  
+<div class="source">
+<pre>{ &quot;start&quot;: date(&quot;1984-01-01&quot;), &quot;end&quot;: date(&quot;1985-01-01&quot;) }
+</pre></div></li>
+</ul></div>
+<div class="section">
+<h3>get-interval-start-date/get-interval-start-datetimeget-interval-start-time, get-interval-end-date/get-interval-end-datetime/get-interval-end-time<a name="get-interval-start-dateget-interval-start-datetimeget-interval-start-time_get-interval-end-dateget-interval-end-datetimeget-interval-end-time"></a></h3>
+
+<ul>
+  
+<li>
+<p>Syntax:</p>
+  
+<div class="source">
+<pre>get-interval-start-date/get-interval-start-datetime/get-interval-start-time/get-interval-end-date/get-interval-end-datetime/get-interval-end-time(interval)
+</pre></div></li>
+  
+<li>
+<p>Gets the start/end of the given interval for the specific date/datetime/time type.</p></li>
+  
+<li>Arguments:
+  
+<ul>
+    
+<li><tt>interval</tt>: the interval to be accessed.</li>
+  </ul></li>
+  
+<li>Return Value:
+  
+<ul>
+    
+<li>A <tt>time</tt>, <tt>date</tt>, or <tt>datetime</tt> (depending on the function) representing the starting or ending time.</li>
+  </ul></li>
+  
+<li>
+<p>Example:</p>
+  
+<div class="source">
+<pre>let $itv1 := interval-start-from-date(&quot;1984-01-01&quot;, &quot;P1Y&quot;)
+let $itv2 := interval-start-from-datetime(&quot;1984-01-01T08:30:00.000&quot;, &quot;P1Y1H&quot;)
+let $itv3 := interval-start-from-time(&quot;08:30:00.000&quot;, &quot;P1H&quot;)
+return {&quot;start&quot;: get-interval-start-date($itv1), &quot;end&quot;: get-interval-end-date($itv1), &quot;start&quot;: get-interval-start-datetime($itv2), &quot;end&quot;: get-interval-end-datetime($itv2), &quot;start&quot;: get-interval-start-time($itv3), &quot;end&quot;: get-interval-end-time($itv3)}
+</pre></div></li>
+</ul>
+
+<ul>
+  
+<li>
+<p>The expected result is:</p>
+  
+<div class="source">
+<pre>{ &quot;start&quot;: date(&quot;1984-01-01&quot;), &quot;end&quot;: date(&quot;1985-01-01&quot;), &quot;start&quot;: datetime(&quot;1984-01-01T08:30:00.000&quot;), &quot;end&quot;: datetime(&quot;1984-02-01T09:30:00.000&quot;), &quot;start&quot;: date(&quot;08:30:00.000&quot;), &quot;end&quot;: time(&quot;09:30:00.000&quot;)  }
+</pre></div></li>
+</ul></div>
+<div class="section">
+<h3>get-overlapping-interval<a name="get-overlapping-interval"></a></h3>
+
+<ul>
+  
+<li>
+<p>Syntax:</p>
+  
+<div class="source">
+<pre>get-overlapping-interval(interval_expression_1, interval_expression_2)
+</pre></div></li>
+  
+<li>
+<p>Gets the start/end of the given interval for the specific date/datetime/time type.</p></li>
+  
+<li>Arguments:
+  
+<ul>
+    
+<li><tt>interval_expression_1</tt>: an <tt>interval</tt> value</li>
+    
+<li><tt>interval_expression_2</tt>: an <tt>interval</tt> value</li>
+  </ul></li>
+  
+<li>Return Value:
+  
+<ul>
+    
+<li>Returns an <tt>interval</tt> that is overlapping <tt>interval_expression_1</tt> and <tt>interval_expression_2</tt>. If <tt>interval_expression_1</tt> and <tt>interval_expression_2</tt> do not overlap <tt>null</tt> is returned. Note each interval must be of the same type.</li>
+  </ul></li>
+  
+<li>
+<p>Example:</p>
+  
+<div class="source">
+<pre>{ &quot;overlap1&quot;: get-overlapping-interval(interval-from-time(time(&quot;11:23:39&quot;), time(&quot;18:27:19&quot;)), interval-from-time(time(&quot;12:23:39&quot;), time(&quot;23:18:00&quot;))), 
+  &quot;overlap2&quot;: get-overlapping-interval(interval-from-time(time(&quot;12:23:39&quot;), time(&quot;18:27:19&quot;)), interval-from-time(time(&quot;07:19:39&quot;), time(&quot;09:18:00&quot;))),
+  &quot;overlap3&quot;: get-overlapping-interval(interval-from-date(date(&quot;1980-11-30&quot;), date(&quot;1999-09-09&quot;)), interval-from-date(date(&quot;2013-01-01&quot;), date(&quot;2014-01-01&quot;))),
+  &quot;overlap4&quot;: get-overlapping-interval(interval-from-date(date(&quot;1980-11-30&quot;), date(&quot;2099-09-09&quot;)), interval-from-date(date(&quot;2013-01-01&quot;), date(&quot;2014-01-01&quot;))),
+  &quot;overlap5&quot;: get-overlapping-interval(interval-from-datetime(datetime(&quot;1844-03-03T11:19:39&quot;), datetime(&quot;2000-10-30T18:27:19&quot;)), interval-from-datetime(datetime(&quot;1989-03-04T12:23:39&quot;), datetime(&quot;2009-10-10T23:18:00&quot;))),
+  &quot;overlap6&quot;: get-overlapping-interval(interval-from-datetime(datetime(&quot;1989-03-04T12:23:39&quot;), datetime(&quot;2000-10-30T18:27:19&quot;)), interval-from-datetime(datetime(&quot;1844-03-03T11:19:39&quot;), datetime(&quot;1888-10-10T23:18:00&quot;)))  }
+</pre></div></li>
+  
+<li>
+<p>The expected result is:</p>
+  
+<div class="source">
+<pre>{ &quot;overlap1&quot;: interval-time(&quot;12:23:39.000Z, 18:27:19.000Z&quot;), 
+  &quot;overlap2&quot;: null, 
+  &quot;overlap3&quot;: null, 
+  &quot;overlap4&quot;: interval-date(&quot;2013-01-01, 2014-01-01&quot;), 
+  &quot;overlap5&quot;: interval-datetime(&quot;1989-03-04T12:23:39.000Z, 2000-10-30T18:27:19.000Z&quot;), 
+  &quot;overlap6&quot;: null }
+</pre></div></li>
+</ul></div>
+<div class="section">
+<h3>interval-before/interval-after/interval-meets/interval-met-by/interval-overlaps/interval-overlapped-by/interval-overlapping/interval-starts/interval-started-by/interval-covers/interval-covered-by/interval-ends/interval-ended-by<a name="interval-beforeinterval-afterinterval-meetsinterval-met-byinterval-overlapsinterval-overlapped-byinterval-overlappinginterval-startsinterval-started-byinterval-coversinterval-covered-byinterval-endsinterval-ended-by"></a></h3>
+<p>See the <a href="allens.html">Allen&#x2019;s Relations</a>.</p></div>
+<div class="section">
+<h3>interval-bin<a name="interval-bin"></a></h3>
+
+<ul>
+  
+<li>
+<p>Syntax:</p>
+  
+<div class="source">
+<pre>interval-bin(time-to-bin, time-bin-anchor, duration-bin-size)
+</pre></div></li>
+  
+<li>
+<p>Return the <tt>interval</tt> value representing the bin containing the <tt>time-to-bin</tt> value.</p></li>
+  
+<li>Arguments:
+  
+<ul>
+    
+<li><tt>time-to-bin</tt>: a date/time/datetime value representing the time to be binned.</li>
+    
+<li><tt>time-bin-anchor</tt>: a date/time/datetime value representing an anchor of a bin starts. The type of this argument should be the same as the first <tt>time-to-bin</tt> argument.</li>
+    
+<li><tt>duration-bin-size</tt>: the duration value representing the size of the bin, in the type of year-month-duration or day-time-duration. The type of this duration should be compatible with the type of <tt>time-to-bin</tt>, so that the arithmetic operation between <tt>time-to-bin</tt> and <tt>duration-bin-size</tt> is well-defined. Currently AsterixDB supports the following arithmetic operations:
+    
+<ul>
+      
+<li>datetime +|- year-month-duration</li>
+      
+<li>datetime +|- day-time-duration</li>
+      
+<li>date +|- year-month-duration</li>
+      
+<li>date +|- day-time-duration</li>
+      
+<li>time +|- day-time-duration</li>
+    </ul></li>
+  </ul></li>
+  
+<li>Return Value:
+  
+<ul>
+    
+<li>A <tt>interval</tt> value representing the bin containing the <tt>time-to-bin</tt> value. Note that the internal type of this interval value should be the same as the <tt>time-to-bin</tt> type.</li>
+  </ul></li>
+  
+<li>
+<p>Example:</p>
+  
+<div class="source">
+<pre>let $c1 := date(&quot;2010-10-30&quot;)
+let $c2 := datetime(&quot;-1987-11-19T23:49:23.938&quot;)
+let $c3 := time(&quot;12:23:34.930+07:00&quot;)
+
+return { &quot;bin1&quot;: interval-bin($c1, date(&quot;1990-01-01&quot;), year-month-duration(&quot;P1Y&quot;)),
+ &quot;bin2&quot;: interval-bin($c2, datetime(&quot;1990-01-01T00:00:00.000Z&quot;), year-month-duration(&quot;P6M&quot;)),
+ &quot;bin3&quot;: interval-bin($c3, time(&quot;00:00:00&quot;), day-time-duration(&quot;PD1M&quot;)),
+ &quot;bin4&quot;: interval-bin($c2, datetime(&quot;2013-01-01T00:00:00.000&quot;), day-time-duration(&quot;PT24H&quot;))
+</pre></div> }</li>
+  
+<li>
+<p>The expected result is:</p>
+  
+<div class="source">
+<pre>{ &quot;bin1&quot;: interval-date(&quot;2010-01-01, 2011-01-01&quot;),
+  &quot;bin2&quot;: interval-datetime(&quot;-1987-07-01T00:00:00.000Z, -1986-01-01T00:00:00.000Z&quot;),
+  &quot;bin3&quot;: interval-time(&quot;05:23:00.000Z, 05:24:00.000Z&quot;),
+  &quot;bin4&quot;: interval-datetime(&quot;-1987-11-19T00:00:00.000Z, -1987-11-20T00:00:00.000Z&quot;)}
+</pre></div></li>
+</ul></div>
+<div class="section">
+<h3>interval-from-date<a name="interval-from-date"></a></h3>
+
+<ul>
+  
+<li>
+<p>Syntax:</p>
+  
+<div class="source">
+<pre>interval-from-date(string_expression1, string_expression2)
+</pre></div></li>
+  
+<li>
+<p>Constructor function for the <tt>interval</tt> type by parsing two date strings.</p></li>
+  
+<li>Arguments:
+  
+<ul>
+    
+<li><tt>string_expression1</tt> : The <tt>string</tt> value representing the starting date.</li>
+    
+<li><tt>string_expression2</tt> : The <tt>string</tt> value representing the ending date.</li>
+  </ul></li>
+  
+<li>Return Value:
+  
+<ul>
+    
+<li>An <tt>interval</tt> value between the two dates.</li>
+  </ul></li>
+  
+<li>
+<p>Example:</p>
+  
+<div class="source">
+<pre>{&quot;date-interval&quot;: interval-from-date(&quot;2012-01-01&quot;, &quot;2013-04-01&quot;)}
+</pre></div></li>
+</ul>
+
+<ul>
+  
+<li>
+<p>The expected result is:</p>
+  
+<div class="source">
+<pre>{ &quot;date-interval&quot;: interval-date(&quot;2012-01-01, 2013-04-01&quot;) }
+</pre></div></li>
+</ul></div>
+<div class="section">
+<h3>interval-from-time<a name="interval-from-time"></a></h3>
+
+<ul>
+  
+<li>
+<p>Syntax:</p>
+  
+<div class="source">
+<pre>interval-from-time(string_expression1, string_expression2)
+</pre></div></li>
+  
+<li>
+<p>Constructor function for the <tt>interval</tt> type by parsing two time strings.</p></li>
+  
+<li>Arguments:
+  
+<ul>
+    
+<li><tt>string_expression1</tt> : The <tt>string</tt> value representing the starting time.</li>
+    
+<li><tt>string_expression2</tt> : The <tt>string</tt> value representing the ending time.</li>
+  </ul></li>
+  
+<li>Return Value:
+  
+<ul>
+    
+<li>An <tt>interval</tt> value between the two times.</li>
+  </ul></li>
+  
+<li>
+<p>Example:</p>
+  
+<div class="source">
+<pre>{&quot;time-interval&quot;: interval-from-time(&quot;12:23:34.456Z&quot;, &quot;233445567+0800&quot;)}
+</pre></div></li>
+</ul>
+
+<ul>
+  
+<li>
+<p>The expected result is:</p>
+  
+<div class="source">
+<pre>{ &quot;time-interval&quot;: interval-time(&quot;12:23:34.456Z, 15:34:45.567Z&quot;) }
+</pre></div></li>
+</ul></div>
+<div class="section">
+<h3>interval-from-datetime<a name="interval-from-datetime"></a></h3>
+
+<ul>
+  
+<li>
+<p>Syntax:</p>
+  
+<div class="source">
+<pre>interval-from-datetime(string_expression1, string_expression2)
+</pre></div></li>
+  
+<li>
+<p>Constructor function for <tt>interval</tt> type by parsing two datetime strings.</p></li>
+  
+<li>Arguments:
+  
+<ul>
+    
+<li><tt>string_expression1</tt> : The <tt>string</tt> value representing the starting datetime.</li>
+    
+<li><tt>string_expression2</tt> : The <tt>string</tt> value representing the ending datetime.</li>
+  </ul></li>
+  
+<li>Return Value:
+  
+<ul>
+    
+<li>An <tt>interval</tt> value between the two datetimes.</li>
+  </ul></li>
+  
+<li>
+<p>Example:</p>
+  
+<div class="source">
+<pre>{&quot;datetime-interval&quot;: interval-from-datetime(&quot;2012-01-01T12:23:34.456+08:00&quot;, &quot;20130401T153445567Z&quot;)}
+</pre></div></li>
+</ul>
+
+<ul>
+  
+<li>
+<p>The expected result is:</p>
+  
+<div class="source">
+<pre>{ &quot;datetime-interval&quot;: interval-datetime(&quot;2012-01-01T04:23:34.456Z, 2013-04-01T15:34:45.567Z&quot;) }
+</pre></div></li>
+</ul></div>
+<div class="section">
+<h3>interval-start-from-date/time/datetime<a name="interval-start-from-datetimedatetime"></a></h3>
+
+<ul>
+  
+<li>
+<p>Syntax:</p>
+  
+<div class="source">
+<pre>interval-start-from-date/time/datetime(date/time/datetime, duration)
+</pre></div></li>
+  
+<li>
+<p>Construct an <tt>interval</tt> value by the given starting <tt>date</tt>/<tt>time</tt>/<tt>datetime</tt> and the <tt>duration</tt> that the interval lasts.</p></li>
+  
+<li>Arguments:
+  
+<ul>
+    
+<li><tt>date/time/datetime</tt>: a <tt>string</tt> representing a <tt>date</tt>, <tt>time</tt> or <tt>datetime</tt>, or a <tt>date</tt>/<tt>time</tt>/<tt>datetime</tt> value, representing the starting time point.</li>
+    
+<li><tt>duration</tt>: a <tt>string</tt> or <tt>duration</tt> value representing the duration of the interval. Note that duration cannot be negative value.</li>
+  </ul></li>
+  
+<li>Return Value:
+  
+<ul>
+    
+<li>An <tt>interval</tt> value representing the interval starting from the given time point with the length of duration.</li>
+  </ul></li>
+  
+<li>
+<p>Example:</p>
+  
+<div class="source">
+<pre>let $itv1 := interval-start-from-date(&quot;1984-01-01&quot;, &quot;P1Y&quot;)
+let $itv2 := interval-start-from-time(time(&quot;02:23:28.394&quot;), &quot;PT3H24M&quot;)
+let $itv3 := interval-start-from-datetime(&quot;1999-09-09T09:09:09.999&quot;, duration(&quot;P2M30D&quot;))
+return {&quot;interval1&quot;: $itv1, &quot;interval2&quot;: $itv2, &quot;interval3&quot;: $itv3}
+</pre></div></li>
+  
+<li>
+<p>The expectecd result is:</p>
+  
+<div class="source">
+<pre>{ &quot;interval1&quot;: interval-date(&quot;1984-01-01, 1985-01-01&quot;), &quot;interval2&quot;: interval-time(&quot;02:23:28.394Z, 05:47:28.394Z&quot;), &quot;interval3&quot;: interval-datetime(&quot;1999-09-09T09:09:09.999Z, 1999-12-09T09:09:09.999Z&quot;) }
+</pre></div></li>
+</ul></div>
+<div class="section">
+<h3>overlap-bins<a name="overlap-bins"></a></h3>
+
+<ul>
+  
+<li>
+<p>Return Value:</p>
+  
+<ul>
+    
+<li>A <tt>interval</tt> value representing the bin containing the <tt>time-to-bin</tt> value. Note that the internal type of this interval value should be the same as the <tt>time-to-bin</tt> type.</li>
+  </ul></li>
+  
+<li>
+<p>Syntax:</p>
+  
+<div class="source">
+<pre>overlap-bins(interval_expression, time-bin-anchor, duration-bin-size)
+</pre></div></li>
+  
+<li>
+<p>Returns an ordered list of <tt>interval</tt> values representing each bin that is overlapping the <tt>interval_expression</tt>.</p></li>
+  
+<li>Arguments:
+  
+<ul>
+    
+<li><tt>interval_expression</tt>: an <tt>interval</tt> value</li>
+    
+<li><tt>time-bin-anchor</tt>: a date/time/datetime value representing an anchor of a bin starts. The type of this argument should be the same as the first <tt>time-to-bin</tt> argument.</li>
+    
+<li><tt>duration-bin-size</tt>: the duration value representing the size of the bin, in the type of year-month-duration or day-time-duration. The type of this duration should be compatible with the type of <tt>time-to-bin</tt>, so that the arithmetic operation between <tt>time-to-bin</tt> and <tt>duration-bin-size</tt> is well-defined. Currently AsterixDB supports the following arithmetic operations:
+    
+<ul>
+      
+<li>datetime +|- year-month-duration</li>
+      
+<li>datetime +|- day-time-duration</li>
+      
+<li>date +|- year-month-duration</li>
+      
+<li>date +|- day-time-duration</li>
+      
+<li>time +|- day-time-duration</li>
+    </ul></li>
+  </ul></li>
+  
+<li>Return Value:
+  
+<ul>
+    
+<li>A ordered list of <tt>interval</tt> values representing each bin that is overlapping the <tt>interval_expression</tt>. Note that the internal type as <tt>time-to-bin</tt> and <tt>duration-bin-size</tt>.</li>
+  </ul></li>
+  
+<li>
+<p>Example:</p>
+  
+<div class="source">
+<pre>let $itv1 := interval-from-time(time(&quot;17:23:37&quot;), time(&quot;18:30:21&quot;))
+let $itv2 := interval-from-date(date(&quot;1984-03-17&quot;), date(&quot;2013-08-22&quot;))
+let $itv3 := interval-from-datetime(datetime(&quot;1800-01-01T23:59:48.938&quot;), datetime(&quot;2015-07-26T13:28:30.218&quot;))
+return { &quot;timebins&quot;: overlap-bins($itv1, time(&quot;00:00:00&quot;), day-time-duration(&quot;PT30M&quot;)),
+  &quot;datebins&quot;: overlap-bins($itv2, date(&quot;1990-01-01&quot;), year-month-duration(&quot;P20Y&quot;)),
+  &quot;datetimebins&quot;: overlap-bins($itv3, datetime(&quot;1900-01-01T00:00:00.000&quot;), year-month-duration(&quot;P100Y&quot;)) }
+</pre></div></li>
+  
+<li>
+<p>The expected result is:</p>
+  
+<div class="source">
+<pre>{ &quot;timebins&quot;: [ interval-time(&quot;17:00:00.000Z, 17:30:00.000Z&quot;), interval-time(&quot;17:30:00.000Z, 18:00:00.000Z&quot;), interval-time(&quot;18:00:00.000Z, 18:30:00.000Z&quot;), interval-time(&quot;18:30:00.000Z, 19:00:00.000Z&quot;) ], 
+  &quot;datebins&quot;: [ interval-date(&quot;1970-01-01, 1990-01-01&quot;), interval-date(&quot;1990-01-01, 2010-01-01&quot;), interval-date(&quot;2010-01-01, 2030-01-01&quot;) ], 
+  &quot;datetimebins&quot;: [ interval-datetime(&quot;1800-01-01T00:00:00.000Z, 1900-01-01T00:00:00.000Z&quot;), interval-datetime(&quot;1900-01-01T00:00:00.000Z, 2000-01-01T00:00:00.000Z&quot;), interval-datetime(&quot;2000-01-01T00:00:00.000Z, 2100-01-01T00:00:00.000Z&quot;) ] }
+</pre></div></li>
+</ul></div></div>
+<div class="section">
+<h2><a name="OtherFunctions" id="OtherFunctions">Other Functions</a> <font size="4"><a href="#toc">[Back to TOC]</a></font><a name="Other_Functions_Back_to_TOC"></a></h2>
+<div class="section">
+<h3>create-uuid<a name="create-uuid"></a></h3>
+
+<ul>
+  
+<li>
+<p>Syntax:</p>
+  
+<div class="source">
+<pre>create-uuid()
+</pre></div></li>
+  
+<li>
+<p>Generates a <tt>uuid</tt>.</p></li>
+  
+<li>Arguments:
+  
+<ul>
+    
+<li>none</li>
+  </ul></li>
+  
+<li>Return Value:
+  
+<ul>
+    
+<li>A generated <tt>uuid</tt>.</li>
+  </ul></li>
+</ul></div>
+<div class="section">
+<h3>is-null<a name="is-null"></a></h3>
+
+<ul>
+  
+<li>
+<p>Syntax:</p>
+  
+<div class="source">
+<pre>is-null(var)
+</pre></div></li>
+  
+<li>
+<p>Checks whether the given variable is a <tt>null</tt> value.</p></li>
+  
+<li>Arguments:
+  
+<ul>
+    
+<li><tt>var</tt> : A variable (any type is allowed).</li>
+  </ul></li>
+  
+<li>Return Value:
+  
+<ul>
+    
+<li>A <tt>boolean</tt> on whether the variable is a <tt>null</tt> or not.</li>
+  </ul></li>
+  
+<li>
+<p>Example:</p>
+  
+<div class="source">
+<pre>for $m in ['hello', 'world', null]
+where not(is-null($m))
+return $m
+</pre></div></li>
+</ul>
+
+<ul>
+  
+<li>
+<p>The expected result is:</p>
+  
+<div class="source">
+<pre>&quot;hello&quot;
+&quot;world&quot;
+</pre></div></li>
+</ul></div>
+<div class="section">
+<h3>is-system-null<a name="is-system-null"></a></h3>
+
+<ul>
+  
+<li>
+<p>Syntax:</p>
+  
+<div class="source">
+<pre>is-system-null(var)
+</pre></div></li>
+  
+<li>
+<p>Checks whether the given variable is a <tt>system null</tt> value.</p></li>
+  
+<li>Arguments:
+  
+<ul>
+    
+<li><tt>var</tt> : A variable (any type is allowed).</li>
+  </ul></li>
+  
+<li>Return Value:
+  
+<ul>
+    
+<li>A <tt>boolean</tt> on whether the variable is a <tt>system null</tt> or not.</li>
+  </ul></li>
+</ul></div>
+<div class="section">
+<h3>len<a name="len"></a></h3>
+
+<ul>
+  
+<li>
+<p>Syntax:</p>
+<p>len(list_expression)</p></li>
+  
+<li>
+<p>Returns the length of the list list_expression.</p></li>
+  
+<li>Arguments:
+  
+<ul>
+    
+<li><tt>list_expression</tt> : An <tt>OrderedList</tt>, <tt>UnorderedList</tt> or <tt>null</tt>, represents the list need to be checked.</li>
+  </ul></li>
+  
+<li>Return Value:
+  
+<ul>
+    
+<li>An <tt>Int32</tt> that represents the length of list_expression.</li>
+  </ul></li>
+  
+<li>
+<p>Example:</p>
+  
+<div class="source">
+<pre>use dataverse TinySocial;
+
+let $l := [&quot;ASTERIX&quot;, &quot;Hyracks&quot;]
+return len($l)
+</pre></div></li>
+</ul>
+
+<ul>
+  
+<li>
+<p>The expected result is:</p>
+  
+<div class="source">
+<pre>2
+</pre></div></li>
+</ul></div>
+<div class="section">
+<h3>not<a name="not"></a></h3>
+
+<ul>
+  
+<li>
+<p>Syntax:</p>
+  
+<div class="source">
+<pre>not(var)
+</pre></div></li>
+  
+<li>
+<p>Inverts a <tt>boolean</tt> value</p></li>
+  
+<li>Arguments:
+  
+<ul>
+    
+<li><tt>var</tt> : A <tt>boolean</tt> (or <tt>null</tt>)</li>
+  </ul></li>
+  
+<li>Return Value:
+  
+<ul>
+    
+<li>A <tt>boolean</tt>, the inverse of <tt>var</tt>. returns <tt>null</tt> if <tt>var</tt> is null</li>
+  </ul></li>
+  
+<li>
+<p>Example:</p>
+  
+<div class="source">
+<pre>for $m in ['hello', 'world', null]
+where not(is-null($m))
+return $m
+</pre></div></li>
+  
+<li>
+<p>The expected result is:</p>
+  
+<div class="source">
+<pre>&quot;hello&quot;
+&quot;world&quot;
+</pre></div></li>
+</ul></div>
+<div class="section">
+<h3>range<a name="range"></a></h3>
+
+<ul>
+  
+<li>
+<p>Syntax:</p>
+  
+<div class="source">
+<pre>range(start_numeric_expression, end_numeric_expression)
+</pre></div></li>
+  
+<li>
+<p>Generates a series of <tt>int64</tt> values based start the <tt>start_numeric_expression</tt> until the <tt>end_numeric_expression</tt>.  The <tt>range</tt> fucntion must be used list argument of a <tt>for</tt> expression.</p></li>
+  
+<li>Arguments:</li>
+  
+<li><tt>start_numeric_expression</tt>: A <tt>int8</tt>/<tt>int16</tt>/<tt>int32</tt>/<tt>int64</tt> value representing the start value.</li>
+  
+<li><tt>end_numeric_expression</tt>: A <tt>int8</tt>/<tt>int16</tt>/<tt>int32</tt>/<tt>int64</tt> value representing the max final value.</li>
+  
+<li>Return Value:
+  
+<ul>
+    
+<li>A generated <tt>uuid</tt>.</li>
+  </ul></li>
+  
+<li>
+<p>Example:</p>
+  
+<div class="source">
+<pre>for $i in range(0, 3)
+return $i;
+</pre></div></li>
+  
+<li>
+<p>The expected result is:</p>
+  
+<div class="source">
+<pre>[ 0
+, 1 
+, 2 
+, 3
+]
+</pre></div></li>
+</ul></div>
+<div class="section">
+<h3>switch-case<a name="switch-case"></a></h3>
+
+<ul>
+  
+<li>
+<p>Syntax:</p>
+  
+<div class="source">
+<pre>switch-case(condition,
+    case1, case1-result,
+    case2, case2-result,
+    ...,
+    default, default-result
+)
+</pre></div></li>
+  
+<li>
+<p>Switches amongst a sequence of cases and returns the result of the first matching case. If no match is found, the result of the default case is returned.</p></li>
+  
+<li>Arguments:
+  
+<ul>
+    
+<li><tt>condition</tt>: A variable (any type is allowed).</li>
+    
+<li><tt>caseI/default</tt>: A variable (any type is allowed).</li>
+    
+<li><tt>caseI/default-result</tt>: A variable (any type is allowed).</li>
+  </ul></li>
+  
+<li>Return Value:
+  
+<ul>
+    
+<li>Returns <tt>caseI-result</tt> if <tt>condition</tt> matches <tt>caseI</tt>, otherwise <tt>default-result</tt>.</li>
+  </ul></li>
+  
+<li>
+<p>Example 1:</p>
+  
+<div class="source">
+<pre>switch-case(&quot;a&quot;,
+    &quot;a&quot;, 0,
+    &quot;x&quot;, 1,
+    &quot;y&quot;, 2,
+    &quot;z&quot;, 3
+)
+</pre></div></li>
+</ul>
+
+<ul>
+  
+<li>
+<p>The expected result is:</p>
+  
+<div class="source">
+<pre>0
+</pre></div></li>
+  
+<li>
+<p>Example 2:</p>
+  
+<div class="source">
+<pre>switch-case(&quot;a&quot;,
+    &quot;x&quot;, 1,
+    &quot;y&quot;, 2,
+    &quot;z&quot;, 3
+)
+</pre></div></li>
+  
+<li>
+<p>The expected result is:</p>
+  
+<div class="source">
+<pre>3
+</pre></div></li>
+</ul></div></div>
+                  </div>
+            </div>
+          </div>
+
+    <hr/>
+
+    <footer>
+            <div class="container-fluid">
+              <div class="row span12">Copyright &copy;                   2015.
+          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>
