blob: ec566c208e9448f489ef67edc30820e1b8aff08a [file] [log] [blame]
<!DOCTYPE html>
<!--
| Generated by Apache Maven Doxia at 2015-11-24
| Rendered using Apache Maven Fluido Skin 1.3.0
-->
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="Date-Revision-yyyymmdd" content="20151124" />
<meta http-equiv="Content-Language" content="en" />
<title>AsterixDB &#x2013; AsterixDB Temporal Functions: Allens Relations</title>
<link rel="stylesheet" href="../css/apache-maven-fluido-1.3.0.min.css" />
<link rel="stylesheet" href="../css/site.css" />
<link rel="stylesheet" href="../css/print.css" media="print" />
<script type="text/javascript" src="../js/apache-maven-fluido-1.3.0.min.js"></script>
<script>(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-41536543-1', 'uci.edu');
ga('send', 'pageview');</script>
</head>
<body class="topBarDisabled">
<div class="container-fluid">
<div id="banner">
<div class="pull-left">
<a href="http://asterixdb.apache.org/" id="bannerLeft">
<img src="../images/asterixlogo.png" alt="AsterixDB"/>
</a>
</div>
<div class="pull-right"> </div>
<div class="clear"><hr/></div>
</div>
<div id="breadcrumbs">
<ul class="breadcrumb">
<li id="publishDate">Last Published: 2015-11-24</li>
<li id="projectVersion" class="pull-right">Version: 0.8.7-incubating</li>
<li class="divider pull-right">|</li>
<li class="pull-right"> <a href="../index.html" title="Documentation Home">
Documentation Home</a>
</li>
</ul>
</div>
<div class="row-fluid">
<div id="leftColumn" class="span3">
<div class="well sidebar-nav">
<ul class="nav nav-list">
<li class="nav-header">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="../yarn.html" title="Deploying AsterixDB using YARN">
<i class="none"></i>
Deploying AsterixDB using YARN</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>
<a href="../aql/functions.html" title="AQL Functions">
<i class="none"></i>
AQL Functions</a>
</li>
<li class="active">
<a href="#"><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="../feeds/tutorial.html" title="Support for Data Ingestion in AsterixDB">
<i class="none"></i>
Support for Data Ingestion in AsterixDB</a>
</li>
<li>
<a href="../udf.html" title="Support for User Defined Functions in AsterixDB">
<i class="none"></i>
Support for User Defined Functions in AsterixDB</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="HTTP API to AsterixDB">
<i class="none"></i>
HTTP 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="https://code.google.com/p/hyracks/" title="Hyracks" class="builtBy">
<img class="builtBy" alt="Hyracks" src="../images/hyrax_ts.png" />
</a>
</div>
</div>
</div>
<div id="bodyColumn" class="span9" >
<!-- ! Licensed to the Apache Software Foundation (ASF) under one
! or more contributor license agreements. See the NOTICE file
! distributed with this work for additional information
! regarding copyright ownership. The ASF licenses this file
! to you under the Apache License, Version 2.0 (the
! "License"); you may not use this file except in compliance
! with the License. You may obtain a copy of the License at
!
! http://www.apache.org/licenses/LICENSE-2.0
!
! Unless required by applicable law or agreed to in writing,
! software distributed under the License is distributed on an
! "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
! KIND, either express or implied. See the License for the
! specific language governing permissions and limitations
! under the License.
! --><h1>AsterixDB Temporal Functions: Allen&#x2019;s Relations</h1>
<div class="section">
<h2><a name="Table_of_Contents"></a><a name="toc" id="toc">Table of Contents</a></h2>
<ul>
<li><a href="#AboutAllensRelations">About Allen&#x2019;s Relations</a></li>
<li><a href="#AllensRelatonsFunctions">Allen&#x2019;s Relations Functions</a></li>
</ul></div>
<div class="section">
<h2><a name="About_Allens_Relations_Back_to_TOC"></a><a name="AboutAllensRelations" id="AboutAllensRelations">About Allen&#x2019;s Relations</a> <font size="4"><a href="#toc">[Back to TOC]</a></font></h2>
<p>AsterixDB supports Allen&#x2019;s relations over interval types. Allen&#x2019;s relations are also called Allen&#x2019;s interval algebra. There are totally 13 base relations described by this algebra, and all of them are supported in AsterixDB (note that <tt>interval-equals</tt> is supported by the <tt>=</tt> comparison symbol so there is no extra function for it). </p>
<p>A detailed description of Allen&#x2019;s relations can be found from its <a class="externalLink" href="http://en.wikipedia.org/wiki/Allen&apos;s_interval_algebra">wikipedia entry</a>. </p></div>
<div class="section">
<h2><a name="Allens_Relations_Functions_Back_to_TOC"></a><a name="AllensRelatonsFunctions" id="AllensRelatonsFunctions">Allen&#x2019;s Relations Functions</a> <font size="4"><a href="#toc">[Back to TOC]</a></font></h2>
<div class="section">
<h3><a name="interval-before_interval-after"></a>interval-before, interval-after</h3>
<ul>
<li>
<p>Syntax:</p>
<div class="source">
<div class="source">
<pre>interval-before(interval1, interval2)
interval-after(interval1, interval2)
</pre></div></div></li>
<li>
<p>These two functions check whether an interval happens before/after another interval. </p></li>
<li>Arguments:
<ul>
<li><tt>interval1</tt>, <tt>interval2</tt>: two intervals to be compared</li>
</ul></li>
<li>
<p>Return Value:</p>
<p>A <tt>boolean</tt> value. Specifically, <tt>interval-before(interval1, interval2)</tt> is true if and only if <tt>interval1.end &lt; interval2.start</tt>, and <tt>interval-after(interval1, interval2)</tt> is true if and only if <tt>interval1.start &gt; interval2.end</tt>. If any of the two inputs is <tt>null</tt>, <tt>null</tt> is returned.</p></li>
<li>
<p>Examples:</p>
<div class="source">
<div class="source">
<pre>let $itv1 := interval-from-date(&quot;2000-01-01&quot;, &quot;2005-01-01&quot;)
let $itv2 := interval-from-date(&quot;2005-05-01&quot;, &quot;2012-09-09&quot;)
return {&quot;interval-before&quot;: interval-before($itv1, $itv2), &quot;interval-after&quot;: interval-after($itv2, $itv1)}
</pre></div></div></li>
<li>
<p>The expected result is:</p>
<div class="source">
<div class="source">
<pre>{ &quot;interval-before&quot;: true, &quot;interval-after&quot;: true }
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="interval-covers_interval-covered-by"></a>interval-covers, interval-covered-by</h3>
<ul>
<li>
<p>Syntax:</p>
<div class="source">
<div class="source">
<pre>interval-covers(interval1, interval2)
interval-covered-by(interval1, interval2)
</pre></div></div></li>
<li>
<p>These two functions check whether one interval covers the other interval.</p></li>
<li>Arguments:
<ul>
<li><tt>interval1</tt>, <tt>interval2</tt>: two intervals to be compared</li>
</ul></li>
<li>
<p>Return Value:</p>
<p>A <tt>boolean</tt> value. Specifically, <tt>interval-covers(interval1, interval2)</tt> is true if and only if</p>
<div class="source">
<div class="source">
<pre>interval1.start &lt;= interval2.start
AND interval1.end &gt;= interval2.end
</pre></div></div>
<p><tt>interval-covered-by(interval1, interval2)</tt> is true if and only if</p>
<div class="source">
<div class="source">
<pre>interval2.start &lt;= interval1.start
AND interval2.end &gt;= interval1.end
</pre></div></div>
<p>For both functions, if any of the two inputs is <tt>null</tt>, <tt>null</tt> is returned.</p></li>
<li>
<p>Examples:</p>
<div class="source">
<div class="source">
<pre>let $itv1 := interval-from-date(&quot;2000-01-01&quot;, &quot;2005-01-01&quot;)
let $itv2 := interval-from-date(&quot;2000-03-01&quot;, &quot;2004-09-09&quot;)
let $itv3 := interval-from-date(&quot;2006-08-01&quot;, &quot;2007-03-01&quot;)
let $itv4 := interval-from-date(&quot;2004-09-10&quot;, &quot;2012-08-01&quot;)
return {&quot;interval-covers&quot;: interval-covers($itv1, $itv2), &quot;interval-covered-by&quot;: interval-covered-by($itv3, $itv4)}
</pre></div></div></li>
<li>
<p>The expected result is:</p>
<div class="source">
<div class="source">
<pre>{ &quot;interval-covers&quot;: true, &quot;interval-covered-by&quot;: true }
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="interval-overlaps_interval-overlapped-by"></a>interval-overlaps, interval-overlapped-by</h3>
<ul>
<li>
<p>Syntax:</p>
<div class="source">
<div class="source">
<pre>interval-overlaps(interval1, interval2)
interval-overlapped-by(interval1, interval2)
</pre></div></div></li>
<li>
<p>These functions check whether two intervals overlap with each other.</p></li>
<li>Arguments:
<ul>
<li><tt>interval1</tt>, <tt>interval2</tt>: two intervals to be compared</li>
</ul></li>
<li>
<p>Return Value:</p>
<p>A <tt>boolean</tt> value. Specifically, <tt>interval-overlaps(interval1, interval2)</tt> is true if and only if</p>
<div class="source">
<div class="source">
<pre>interval1.start &lt; interval2.start
AND interval2.end &gt; interval1.end
AND interval1.end &gt; interval2.start
</pre></div></div>
<p><tt>interval-overlapped-by(interval1, interval2)</tt> is true if and only if</p>
<div class="source">
<div class="source">
<pre>interval2.start &lt; interval1.start
AND interval1.end &gt; interval2.end
AND interval2.end &gt; interval1.start
</pre></div></div>
<p>For all these functions, if any of the two inputs is <tt>null</tt>, <tt>null</tt> is returned.</p>
<p>Note that <tt>interval-overlaps</tt> and <tt>interval-overlapped-by</tt> are following the Allen&#x2019;s relations on the definition of overlap.</p></li>
<li>
<p>Examples:</p>
<div class="source">
<div class="source">
<pre>let $itv1 := interval-from-date(&quot;2000-01-01&quot;, &quot;2005-01-01&quot;)
let $itv2 := interval-from-date(&quot;2004-05-01&quot;, &quot;2012-09-09&quot;)
let $itv3 := interval-from-date(&quot;2006-08-01&quot;, &quot;2007-03-01&quot;)
let $itv4 := interval-from-date(&quot;2004-09-10&quot;, &quot;2006-12-31&quot;)
return {&quot;overlaps&quot;: interval-overlaps($itv1, $itv2),
&quot;overlapped-by&quot;: interval-overlapped-by($itv3, $itv4)}
</pre></div></div></li>
<li>
<p>The expected result is:</p>
<div class="source">
<div class="source">
<pre>{ &quot;overlaps&quot;: true, &quot;overlapped-by&quot;: true }
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="interval-overlapping"></a>interval-overlapping</h3>
<p>Note that <tt>interval-overlapping</tt> is not an Allen&#x2019;s Relation, but syntactic sugar we added for the case that the intersect of two intervals is not empty. Basically this function returns true if any of these functions return true: <tt>interval-overlaps</tt>, <tt>interval-overlapped-by</tt>, <tt>interval-covers</tt>, or <tt>interval-covered-by</tt>.</p>
<ul>
<li>
<p>Syntax:</p>
<div class="source">
<div class="source">
<pre>interval-overlapping(interval1, interval2)
</pre></div></div></li>
<li>
<p>This functions check whether two intervals share any points with each other. </p></li>
<li>Arguments:
<ul>
<li><tt>interval1</tt>, <tt>interval2</tt>: two intervals to be compared</li>
</ul></li>
<li>
<p>Return Value:</p>
<p>A <tt>boolean</tt> value. Specifically, <tt>interval-overlapping(interval1, interval2)</tt> is true if</p>
<div class="source">
<div class="source">
<pre>(interval2.start &gt;= interval1.start
AND interval2.start &lt; interval1.end)
OR
(interval2.end &gt; interval1.start
AND interval2.end &lt;= interval1.end)
</pre></div></div>
<p>If any of the two inputs is <tt>null</tt>, <tt>null</tt> is returned.</p></li>
<li>
<p>Examples:</p>
<div class="source">
<div class="source">
<pre>let $itv1 := interval-from-date(&quot;2000-01-01&quot;, &quot;2005-01-01&quot;)
let $itv2 := interval-from-date(&quot;2004-05-01&quot;, &quot;2012-09-09&quot;)
let $itv3 := interval-from-date(&quot;2006-08-01&quot;, &quot;2007-03-01&quot;)
let $itv4 := interval-from-date(&quot;2004-09-10&quot;, &quot;2006-12-31&quot;)
return {&quot;overlapping1&quot;: interval-overlapping($itv1, $itv2),
&quot;overlapping2&quot;: interval-overlapping($itv3, $itv4)}
</pre></div></div></li>
<li>
<p>The expected result is:</p>
<div class="source">
<div class="source">
<pre>{ &quot;overlapping1&quot;: true, &quot;overlapping2&quot;: true }
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="interval-meets_interval-met-by"></a>interval-meets, interval-met-by</h3>
<ul>
<li>
<p>Syntax:</p>
<div class="source">
<div class="source">
<pre>interval-meets(interval1, interval2)
interval-met-by(interval1, interval2)
</pre></div></div></li>
<li>
<p>These two functions check whether an interval meets with another interval. </p></li>
<li>Arguments:
<ul>
<li><tt>interval1</tt>, <tt>interval2</tt>: two intervals to be compared</li>
</ul></li>
<li>
<p>Return Value:</p>
<p>A <tt>boolean</tt> value. Specifically, <tt>interval-meets(interval1, interval2)</tt> is true if and only if <tt>interval1.end = interval2.start</tt>, and <tt>interval-met-by(interval1, interval2)</tt> is true if and only if <tt>interval1.start = interval2.end</tt>. If any of the two inputs is <tt>null</tt>, <tt>null</tt> is returned.</p></li>
<li>
<p>Examples:</p>
<div class="source">
<div class="source">
<pre>let $itv1 := interval-from-date(&quot;2000-01-01&quot;, &quot;2005-01-01&quot;)
let $itv2 := interval-from-date(&quot;2005-01-01&quot;, &quot;2012-09-09&quot;)
let $itv3 := interval-from-date(&quot;2006-08-01&quot;, &quot;2007-03-01&quot;)
let $itv4 := interval-from-date(&quot;2004-09-10&quot;, &quot;2006-08-01&quot;)
return {&quot;meets&quot;: interval-meets($itv1, $itv2), &quot;metby&quot;: interval-met-by($itv3, $itv4)}
</pre></div></div></li>
<li>
<p>The expected result is:</p>
<div class="source">
<div class="source">
<pre>{ &quot;meets&quot;: true, &quot;metby&quot;: true }
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="interval-starts_interval-started-by"></a>interval-starts, interval-started-by</h3>
<ul>
<li>
<p>Syntax:</p>
<div class="source">
<div class="source">
<pre>interval-starts(interval1, interval2)
interval-started-by(interval1, interval2)
</pre></div></div></li>
<li>
<p>These two functions check whether one interval starts with the other interval.</p></li>
<li>Arguments:
<ul>
<li><tt>interval1</tt>, <tt>interval2</tt>: two intervals to be compared</li>
</ul></li>
<li>
<p>Return Value:</p>
<p>A <tt>boolean</tt> value. Specifically, <tt>interval-starts(interval1, interval2)</tt> returns true if and only if</p>
<div class="source">
<div class="source">
<pre>interval1.start = interval2.start
AND interval1.end &lt;= interval2.end
</pre></div></div>
<p><tt>interval-started-by(interval1, interval2)</tt> returns true if and only if</p>
<div class="source">
<div class="source">
<pre>interval1.start = interval2.start
AND interval2.end &lt;= interval1.end
</pre></div></div>
<p>For both functions, if any of the two inputs is <tt>null</tt>, <tt>null</tt> is returned.</p></li>
<li>
<p>Examples:</p>
<div class="source">
<div class="source">
<pre>let $itv1 := interval-from-date(&quot;2000-01-01&quot;, &quot;2005-01-01&quot;)
let $itv2 := interval-from-date(&quot;2000-01-01&quot;, &quot;2012-09-09&quot;)
let $itv3 := interval-from-date(&quot;2006-08-01&quot;, &quot;2007-03-01&quot;)
let $itv4 := interval-from-date(&quot;2006-08-01&quot;, &quot;2006-08-01&quot;)
return {&quot;interval-starts&quot;: interval-starts($itv1, $itv2), &quot;interval-started-by&quot;: interval-started-by($itv3, $itv4)}
</pre></div></div></li>
<li>
<p>The expected result is:</p>
<div class="source">
<div class="source">
<pre>{ &quot;interval-starts&quot;: true, &quot;interval-started-by&quot;: true }
</pre></div></div></li>
</ul></div>
<div class="section">
<h3><a name="interval-ends_interval-ended-by"></a>interval-ends, interval-ended-by</h3>
<ul>
<li>
<p>Syntax:</p>
<div class="source">
<div class="source">
<pre>interval-ends(interval1, interval2)
interval-ended-by(interval1, interval2)
</pre></div></div></li>
<li>
<p>These two functions check whether one interval ends with the other interval.</p></li>
<li>Arguments:
<ul>
<li><tt>interval1</tt>, <tt>interval2</tt>: two intervals to be compared</li>
</ul></li>
<li>
<p>Return Value:</p>
<p>A <tt>boolean</tt> value. Specifically, <tt>interval-ends(interval1, interval2)</tt> returns true if and only if</p>
<div class="source">
<div class="source">
<pre>interval1.end = interval2.end
AND interval1.start &gt;= interval2.start
</pre></div></div>
<p><tt>interval-ended-by(interval1, interval2)</tt> returns true if and only if</p>
<div class="source">
<div class="source">
<pre>interval2.end = interval1.end
AND interval2.start &gt;= interval1.start
</pre></div></div>
<p>For both functions, if any of the two inputs is <tt>null</tt>, <tt>null</tt> is returned.</p></li>
<li>
<p>Examples:</p>
<div class="source">
<div class="source">
<pre>let $itv1 := interval-from-date(&quot;2000-01-01&quot;, &quot;2005-01-01&quot;)
let $itv2 := interval-from-date(&quot;1998-01-01&quot;, &quot;2005-01-01&quot;)
let $itv3 := interval-from-date(&quot;2006-08-01&quot;, &quot;2007-03-01&quot;)
let $itv4 := interval-from-date(&quot;2006-09-10&quot;, &quot;2007-03-01&quot;)
return {&quot;interval-ends&quot;: interval-ends($itv1, $itv2), &quot;interval-ended-by&quot;: interval-ended-by($itv3, $itv4) }
</pre></div></div></li>
<li>
<p>The expected result is:</p>
<div class="source">
<div class="source">
<pre>{ &quot;interval-ends&quot;: true, &quot;interval-ended-by&quot;: true }
</pre></div></div></li>
</ul></div></div>
</div>
</div>
</div>
<hr/>
<footer>
<div class="container-fluid">
<div class="row span12">Copyright &copy; 2015
<a href="http://www.apache.org/">The Apache Software Foundation</a>.
All Rights Reserved.
</div>
<?xml version="1.0" encoding="UTF-8"?>
<div class="row-fluid">Apache AsterixDB, AsterixDB, Apache, the Apache
feather logo, and the Apache AsterixDB project logo are either
registered trademarks or trademarks of The Apache Software
Foundation in the United States and other countries.
All other marks mentioned may be trademarks or registered
trademarks of their respective owners.</div>
</div>
</footer>
</body>
</html>