Return-Path: X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183]) by cust-asf2.ponee.io (Postfix) with ESMTP id 0A010200D10 for ; Sat, 26 Aug 2017 07:35:50 +0200 (CEST) Received: by cust-asf.ponee.io (Postfix) id 071AC16C777; Sat, 26 Aug 2017 05:35:50 +0000 (UTC) Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by cust-asf.ponee.io (Postfix) with SMTP id 05B8916C6D3 for ; Sat, 26 Aug 2017 07:35:47 +0200 (CEST) Received: (qmail 78320 invoked by uid 500); 26 Aug 2017 05:35:47 -0000 Mailing-List: contact commits-help@asterixdb.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@asterixdb.apache.org Delivered-To: mailing list commits@asterixdb.apache.org Received: (qmail 78307 invoked by uid 99); 26 Aug 2017 05:35:46 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Sat, 26 Aug 2017 05:35:46 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id 85DA4F5F32; Sat, 26 Aug 2017 05:35:45 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: imaxon@apache.org To: commits@asterixdb.apache.org Date: Sat, 26 Aug 2017 05:36:10 -0000 Message-Id: In-Reply-To: <103b462164bb438a96df81685ba6d7e8@git.apache.org> References: <103b462164bb438a96df81685ba6d7e8@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: [27/29] asterixdb-site git commit: Update site for new release archived-at: Sat, 26 Aug 2017 05:35:50 -0000 http://git-wip-us.apache.org/repos/asf/asterixdb-site/blob/444ca1b3/content/docs/0.9.2/aql/js-sdk.html ---------------------------------------------------------------------- diff --git a/content/docs/0.9.2/aql/js-sdk.html b/content/docs/0.9.2/aql/js-sdk.html new file mode 100644 index 0000000..aa6d633 --- /dev/null +++ b/content/docs/0.9.2/aql/js-sdk.html @@ -0,0 +1,1001 @@ + + + + + + + + + AsterixDB – AsterixDB Javascript SDK + + + + + + + + + + + + + + + + + +
+ + + + + +
+ + + +
+ +

AsterixDB Javascript SDK

+
+

Obtaining and Including

+

Download the javascript SDK and include it like any other javascript library by adding the following line in the appropriate HTML file:

+ +
+
+
<script src="path/to/asterix-sdk-stable.js"></script>
+
+
+

Interactive Demos

+

There are two interactive demos that are available for download. Both of the demos illustrate how the javascript API would be used in an application:

+ +
    + +
  • Tweetbook Demo: a contrived geo-spatial application dealing with artificial Tweets allowing spatial, temporal, and keyword-based filtering.
  • + +
  • ADM/AQL 101 Demo: an interactive version of all of the examples that are provided in the following section.
  • +
+
+

The javascript SDK: by example

+

In this section, we explore how to form AQL queries using the javascript SDK. The queries from AsterixDB 101: An ADM and AQL Primer are used as examples here. For each AQL statement, the equivalent javascript expression is shown below it, followed by the results of executing the query.

+
+

Query 0-A - Exact-Match Lookup

+
+
+
+
AQL
+ +
+
+
use dataverse TinySocial;
+
+for $user in dataset FacebookUsers
+where $user.id = 8
+return $user;
+
+
+
JS
+ +
+
+
var expression0a = new FLWOGRExpression()
+    .ForClause("$user", new AExpression("dataset FacebookUsers"))
+    .WhereClause(new AExpression("$user.id = 8"))
+    .ReturnClause("$user");
+
+
+
Results
+ +
+
+
{ "id": { int32: 8 } , "alias": "Nila", "name": "NilaMilliron", "user-since": { datetime: 1199182200000}, "friend-ids": { unorderedlist: [{ int32: 3 } ]}, "employment": { orderedlist: [{ "organization-name": "Plexlane", "start-date": { date: 1267315200000}, "end-date": null } ]} }
+
+
+

Query 0-B - Range Scan

+
+
+
+
AQL
+ +
+
+
use dataverse TinySocial;
+
+for $user in dataset FacebookUsers
+where $user.id >= 2 and $user.id <= 4
+return $user;
+
+
+
JS
+ +
+
+
var expression0b = new FLWOGRExpression()
+    .ForClause("$user", new AExpression("dataset FacebookUsers"))
+    .WhereClause().and(new AExpression("$user.id >= 2"), new AExpression("$user.id <= 4"))
+    .ReturnClause("$user");
+
+
+
Results
+ +
+
+
{ "id": { int32: 2 } , "alias": "Isbel", "name": "IsbelDull", "user-since": { datetime: 1295691000000}, "friend-ids": { unorderedlist: [{ int32: 1 } , { int32: 4 } ]}, "employment": { orderedlist: [{ "organization-name": "Hexviafind", "start-date": { date: 1272326400000}, "end-date": null } ]} }
+{ "id": { int32: 3 } , "alias": "Emory", "name": "EmoryUnk", "user-since": { datetime: 1341915000000}, "friend-ids": { unorderedlist: [{ int32: 1 } , { int32: 5 } , { int32: 8 } , { int32: 9 } ]}, "employment": { orderedlist: [{ "organization-name": "geomedia", "start-date": { date: 1276732800000}, "end-date": { date: 1264464000000} } ]} }
+{ "id": { int32: 4 } , "alias": "Nicholas", "name": "NicholasStroh", "user-since": { datetime: 1293444600000}, "friend-ids": { unorderedlist: [{ int32: 2 } ]}, "employment": { orderedlist: [{ "organization-name": "Zamcorporation", "start-date": { date: 1275955200000}, "end-date": null } ]} }
+
+
+

Query 1 - Other Query Filters

+
+
+
+
AQL
+ +
+
+
use dataverse TinySocial;
+
+for $user in dataset FacebookUsers
+where $user.user-since >= datetime('2010-07-22T00:00:00')
+and $user.user-since <= datetime('2012-07-29T23:59:59')
+return $user;
+
+
+
JS
+ +
+
+
var expression1 = new FLWOGRExpression()
+    .ForClause("$user", new AExpression("dataset FacebookUsers"))
+    .WhereClause().and(
+       new AExpression("$user.user-since >= datetime('2010-07-22T00:00:00')"),
+       new AExpression("$user.user-since <= datetime('2012-07-29T23:59:59')")
+    ).ReturnClause("$user");
+
+
+
Results
+ +
+
+
{ "id": { int32: 2 } , "alias": "Isbel", "name": "IsbelDull", "user-since": { datetime: 1295691000000}, "friend-ids": { unorderedlist: [{ int32: 1 } , { int32: 4 } ]}, "employment": { orderedlist: [{ "organization-name": "Hexviafind", "start-date": { date: 1272326400000}, "end-date": null } ]} }
+{ "id": { int32: 10 } , "alias": "Bram", "name": "BramHatch", "user-since": { datetime: 1287223800000}, "friend-ids": { unorderedlist: [{ int32: 1 } , { int32: 5 } , { int32: 9 } ]}, "employment": { orderedlist: [{ "organization-name": "physcane", "start-date": { date: 1181001600000}, "end-date": { date: 1320451200000} } ]} }
+{ "id": { int32: 3 } , "alias": "Emory", "name": "EmoryUnk", "user-since": { datetime: 1341915000000}, "friend-ids": { unorderedlist: [{ int32: 1 } , { int32: 5 } , { int32: 8 } , { int32: 9 } ]}, "employment": { orderedlist: [{ "organization-name": "geomedia", "start-date": { date: 1276732800000}, "end-date": { date: 1264464000000} } ]} }
+{ "id": { int32: 4 } , "alias": "Nicholas", "name": "NicholasStroh", "user-since": { datetime: 1293444600000}, "friend-ids": { unorderedlist: [{ int32: 2 } ]}, "employment": { orderedlist: [{ "organization-name": "Zamcorporation", "start-date": { date: 1275955200000}, "end-date": null } ]} }
+
+
+

Query 2-A - Equijoin

+
+
+
+
AQL
+ +
+
+
use dataverse TinySocial;
+
+for $user in dataset FacebookUsers
+for $message in dataset FacebookMessages
+where $message.author-id = $user.id
+return {
+    "uname": $user.name,
+    "message": $message.message
+};
+
+
+
JS
+ +
+
+
var expression2a = new FLWOGRExpression()
+    .ForClause ("$user", new AExpression("dataset FacebookUsers"))
+    .ForClause ("$message", new AExpression("dataset FacebookMessages"))
+    .WhereClause(new AExpression("$message.author-id = $user.id"))
+    .ReturnClause({
+       "uname" : "$user.name",
+       "message" : "$message.message"
+    });
+
+
+
Results
+ +
+
+
{ "uname": "MargaritaStoddard", "message": " dislike x-phone its touch-screen is horrible" }
+{ "uname": "MargaritaStoddard", "message": " like ccast the 3G is awesome:)" }
+{ "uname": "MargaritaStoddard", "message": " can't stand product-w the touch-screen is terrible" }
+{ "uname": "MargaritaStoddard", "message": " can't stand acast the network is horrible:(" }
+{ "uname": "MargaritaStoddard", "message": " can't stand acast its plan is terrible" }
+{ "uname": "IsbelDull", "message": " like product-y the plan is amazing" }
+{ "uname": "IsbelDull", "message": " like product-z its platform is mind-blowing" }
+{ "uname": "WoodrowNehling", "message": " love acast its 3G is good:)" }
+{ "uname": "BramHatch", "message": " dislike x-phone the voice-command is bad:(" }
+{ "uname": "BramHatch", "message": " can't stand product-z its voicemail-service is OMG:(" }
+{ "uname": "EmoryUnk", "message": " love product-b its shortcut-menu is awesome:)" }
+{ "uname": "EmoryUnk", "message": " love ccast its wireless is good" }
+{ "uname": "WillisWynne", "message": " love product-b the customization is mind-blowing" }
+{ "uname": "SuzannaTillson", "message": " like x-phone the voicemail-service is awesome" }
+{ "uname": "VonKemble", "message": " dislike product-b the speed is horrible" }
+
+
+

Query 2-B - Index join

+
+
+
+
AQL
+ +
+
+
use dataverse TinySocial;
+
+for $user in dataset FacebookUsers
+for $message in dataset FacebookMessages
+where $message.author-id /*+ indexnl */  = $user.id
+return {
+    "uname": $user.name,
+    "message": $message.message
+};
+
+
+
JS
+ +
+
+
var expression2b = new FLWOGRExpression()
+    .ForClause ("$user", new AExpression("dataset FacebookUsers"))
+    .ForClause ("$message", new AExpression("dataset FacebookMessages"))
+    .WhereClause(new AExpression("$message.author-id /*+ indexnl */  = $user.id"))
+    .ReturnClause({
+       "uname" : "$user.name",
+       "message" : "$message.message"
+    });
+
+
+
Results
+ +
+
+
{ "uname": "MargaritaStoddard", "message": " dislike x-phone its touch-screen is horrible" }
+{ "uname": "MargaritaStoddard", "message": " like ccast the 3G is awesome:)" }
+{ "uname": "MargaritaStoddard", "message": " can't stand product-w the touch-screen is terrible" }
+{ "uname": "MargaritaStoddard", "message": " can't stand acast the network is horrible:(" }
+{ "uname": "MargaritaStoddard", "message": " can't stand acast its plan is terrible" }
+{ "uname": "IsbelDull", "message": " like product-y the plan is amazing" }
+{ "uname": "IsbelDull", "message": " like product-z its platform is mind-blowing" }
+{ "uname": "WoodrowNehling", "message": " love acast its 3G is good:)" }
+{ "uname": "BramHatch", "message": " dislike x-phone the voice-command is bad:(" }
+{ "uname": "BramHatch", "message": " can't stand product-z its voicemail-service is OMG:(" }
+{ "uname": "EmoryUnk", "message": " love product-b its shortcut-menu is awesome:)" }
+{ "uname": "EmoryUnk", "message": " love ccast its wireless is good" }
+{ "uname": "WillisWynne", "message": " love product-b the customization is mind-blowing" }
+{ "uname": "SuzannaTillson", "message": " like x-phone the voicemail-service is awesome" }
+{ "uname": "VonKemble", "message": " dislike product-b the speed is horrible" }
+
+
+

Query 3 - Nested Outer Join

+
+
+
+
AQL
+ +
+
+
use dataverse TinySocial;
+
+for $user in dataset FacebookUsers
+return {
+    "uname": $user.name,
+    "messages": for $message in dataset FacebookMessages
+                where $message.author-id = $user.id
+                return $message.message
+};
+
+
+
JS
+ +
+
+
var expression3messages = new FLWOGRExpression()
+    .ForClause("$message", new AExpression("dataset FacebookMessages"))
+    .WhereClause(new AExpression("$message.author-id = $user.id"))
+    .ReturnClause("$message.message");
+
+var expression3 = new FLWOGRExpression()
+    .ForClause ("$user", new AExpression("dataset FacebookUsers"))
+    .ReturnClause({
+        "uname": "$user.name",
+        "messages" : expression3messages
+    });
+
+
+
Results
+ +
+
+
{ "uname": "MargaritaStoddard", "messages": { orderedlist: [" dislike x-phone its touch-screen is horrible", " like ccast the 3G is awesome:)", " can't stand product-w the touch-screen is terrible", " can't stand acast the network is horrible:(", " can't stand acast its plan is terrible" ]} }
+{ "uname": "IsbelDull", "messages": { orderedlist: [" like product-y the plan is amazing", " like product-z its platform is mind-blowing" ]} }
+{ "uname": "NilaMilliron", "messages": { orderedlist: [ ]} }
+{ "uname": "WoodrowNehling", "messages": { orderedlist: [" love acast its 3G is good:)" ]} }
+{ "uname": "BramHatch", "messages": { orderedlist: [" dislike x-phone the voice-command is bad:(", " can't stand product-z its voicemail-service is OMG:(" ]} }
+{ "uname": "EmoryUnk", "messages": { orderedlist: [" love product-b its shortcut-menu is awesome:)", " love ccast its wireless is good" ]} }
+{ "uname": "WillisWynne", "messages": { orderedlist: [" love product-b the customization is mind-blowing" ]} }
+{ "uname": "SuzannaTillson", "messages": { orderedlist: [" like x-phone the voicemail-service is awesome" ]} }
+{ "uname": "NicholasStroh", "messages": { orderedlist: [ ]} }
+{ "uname": "VonKemble", "messages": { orderedlist: [" dislike product-b the speed is horrible" ]} }
+
+
+

Query 4 - Theta Join

+
+
+
+
AQL
+ +
+
+
use dataverse TinySocial;
+
+for $t in dataset TweetMessages
+return {
+    "message": $t.message-text,
+    "nearby-messages": for $t2 in dataset TweetMessages
+                       where spatial-distance($t.sender-location, $t2.sender-location) <= 1
+                       return { "msgtxt":$t2.message-text}
+};
+
+
+
JS
+ +
+
+
var expression4messages = new FLWOGRExpression()
+    .ForClause( "$t2", new AExpression("dataset TweetMessages"))
+    .WhereClause( new AExpression("spatial-distance($t.sender-location, $t2.sender-location) <= 1"))
+    .ReturnClause({ "msgtxt" : "$t2.message-text" });
+
+var expression4 = new FLWOGRExpression()
+    .ForClause( "$t", new AExpression("dataset TweetMessages"))
+    .ReturnClause({
+        "message" : "$t.message-text",
+        "nearby-messages" : expression4messages
+    });
+
+
+
Results
+ +
+
+
{ "message": " hate ccast its voice-clarity is OMG:(", "nearby-messages": { orderedlist: [{ "msgtxt": " hate ccast its voice-clarity is OMG:(" }, { "msgtxt": " like product-w the speed is good:)" } ]} }
+{ "message": " like x-phone the voice-clarity is good:)", "nearby-messages": { orderedlist: [{ "msgtxt": " like x-phone the voice-clarity is good:)" } ]} }
+{ "message": " like product-y the platform is good", "nearby-messages": { orderedlist: [{ "msgtxt": " like product-y the platform is good" } ]} }
+{ "message": " love product-z its customization is good:)", "nearby-messages": { orderedlist: [{ "msgtxt": " love product-z its customization is good:)" } ]} }
+{ "message": " like product-y the voice-command is amazing:)", "nearby-messages": { orderedlist: [{ "msgtxt": " like product-y the voice-command is amazing:)" } ]} }
+{ "message": " like product-w the speed is good:)", "nearby-messages": { orderedlist: [{ "msgtxt": " hate ccast its voice-clarity is OMG:(" }, { "msgtxt": " like product-w the speed is good:)" } ]} }
+{ "message": " love ccast its voicemail-service is awesome", "nearby-messages": { orderedlist: [{ "msgtxt": " love ccast its voicemail-service is awesome" } ]} }
+{ "message": " can't stand product-w its speed is terrible:(", "nearby-messages": { orderedlist: [{ "msgtxt": " can't stand product-w its speed is terrible:(" } ]} }
+{ "message": " like product-z the shortcut-menu is awesome:)", "nearby-messages": { orderedlist: [{ "msgtxt": " like product-z the shortcut-menu is awesome:)" } ]} }
+{ "message": " can't stand x-phone its platform is terrible", "nearby-messages": { orderedlist: [{ "msgtxt": " can't stand x-phone its platform is terrible" } ]} }
+{ "message": " like ccast its shortcut-menu is awesome:)", "nearby-messages": { orderedlist: [{ "msgtxt": " like ccast its shortcut-menu is awesome:)" } ]} }
+{ "message": " like product-b the voice-command is mind-blowing:)", "nearby-messages": { orderedlist: [{ "msgtxt": " like product-b the voice-command is mind-blowing:)" } ]} }
+
+
+

Query 5 - Fuzzy Join

+
+
+
+
AQL
+

use dataverse TinySocial;

+ +
+
+
set simfunction "edit-distance";
+set simthreshold "3";
+
+for $fbu in dataset FacebookUsers
+return {
+    "id": $fbu.id,
+    "name": $fbu.name,
+    "similar-users": for $t in dataset TweetMessages
+                     let $tu := $t.user
+                     where $tu.name ~= $fbu.name
+                    return {
+                        "twitter-screenname": $tu.screen-name,
+                        "twitter-name": $tu.name
+                    }
+};
+
+
+
JS
+ +
+
+
var similarUsersExpression = new FLWOGRExpression()
+    .ForClause("$t", new AExpression("dataset TweetMessages"))
+    .LetClause ("$tu", new AExpression("$t.user"))
+    .WhereClause(new AExpression("$tu.name ~= $fbu.name"))
+    .ReturnClause({
+        "twitter-screenname": "$tu.screen-name",
+        "twitter-name": "$tu.name"
+    });
+
+var expression5 = new FLWOGRExpression()
+    .ForClause ("$fbu", new AExpression("dataset FacebookUsers"))
+    .ReturnClause(
+        {
+            "id" : "$fbu.id",
+            "name" : "$fbu.name",
+            "similar-users" : similarUsersExpression
+        }
+    );
+
+
+
Results
+ +
+
+
{ "id": { int32: 1 } , "name": "MargaritaStoddard", "similar-users": { orderedlist: [ ]} }
+{ "id": { int32: 2 } , "name": "IsbelDull", "similar-users": { orderedlist: [ ]} }
+{ "id": { int32: 8 } , "name": "NilaMilliron", "similar-users": { orderedlist: [{ "twitter-screenname": "NilaMilliron_tw", "twitter-name": "Nila Milliron" } ]} }
+{ "id": { int32: 9 } , "name": "WoodrowNehling", "similar-users": { orderedlist: [ ]} }
+{ "id": { int32: 10 } , "name": "BramHatch", "similar-users": { orderedlist: [ ]} }
+{ "id": { int32: 3 } , "name": "EmoryUnk", "similar-users": { orderedlist: [ ]} }
+{ "id": { int32: 6 } , "name": "WillisWynne", "similar-users": { orderedlist: [ ]} }
+{ "id": { int32: 7 } , "name": "SuzannaTillson", "similar-users": { orderedlist: [ ]} }
+{ "id": { int32: 4 } , "name": "NicholasStroh", "similar-users": { orderedlist: [ ]} }
+{ "id": { int32: 5 } , "name": "VonKemble", "similar-users": { orderedlist: [ ]} }
+
+
+

Query 6 - Existential Quantification

+
+
+
+
AQL
+ +
+
+
use dataverse TinySocial;
+
+for $fbu in dataset FacebookUsers
+where (some $e in $fbu.employment satisfies is-null($e.end-date))
+return $fbu;
+
+
+
JS
+ +
+
+
var expression6 = new FLWOGRExpression()
+    .ForClause ("$fbu", new AQLClause().set("dataset FacebookUsers"))
+    .WhereClause(
+        new QuantifiedExpression (
+            "some" ,
+            {"$e" : new AExpression("$fbu.employment") },
+            new FunctionExpression("is-null", new AExpression("$e.end-date"))
+        )
+    )
+    .ReturnClause("$fbu");
+
+
+
Results
+ +
+
+
{ "id": { int32: 1 } , "alias": "Margarita", "name": "MargaritaStoddard", "user-since": { datetime: 1345457400000}, "friend-ids": { unorderedlist: [{ int32: 2 } , { int32: 3 } , { int32: 6 } , { int32: 10 } ]}, "employment": { orderedlist: [{ "organization-name": "Codetechno", "start-date": { date: 1154822400000}, "end-date": null } ]} }
+{ "id": { int32: 2 } , "alias": "Isbel", "name": "IsbelDull", "user-since": { datetime: 1295691000000}, "friend-ids": { unorderedlist: [{ int32: 1 } , { int32: 4 } ]}, "employment": { orderedlist: [{ "organization-name": "Hexviafind", "start-date": { date: 1272326400000}, "end-date": null } ]} }
+{ "id": { int32: 8 } , "alias": "Nila", "name": "NilaMilliron", "user-since": { datetime: 1199182200000}, "friend-ids": { unorderedlist: [{ int32: 3 } ]}, "employment": { orderedlist: [{ "organization-name": "Plexlane", "start-date": { date: 1267315200000}, "end-date": null } ]} }
+{ "id": { int32: 6 } , "alias": "Willis", "name": "WillisWynne", "user-since": { datetime: 1105956600000}, "friend-ids": { unorderedlist: [{ int32: 1 } , { int32: 3 } , { int32: 7 } ]}, "employment": { orderedlist: [{ "organization-name": "jaydax", "start-date": { date: 1242345600000}, "end-date": null } ]} }
+{ "id": { int32: 7 } , "alias": "Suzanna", "name": "SuzannaTillson", "user-since": { datetime: 1344334200000}, "friend-ids": { unorderedlist: [{ int32: 6 } ]}, "employment": { orderedlist: [{ "organization-name": "Labzatron", "start-date": { date: 1303171200000}, "end-date": null } ]} }
+{ "id": { int32: 4 } , "alias": "Nicholas", "name": "NicholasStroh", "user-since": { datetime: 1293444600000}, "friend-ids": { unorderedlist: [{ int32: 2 } ]}, "employment": { orderedlist: [{ "organization-name": "Zamcorporation", "start-date": { date: 1275955200000}, "end-date": null } ]} }
+{ "id": { int32: 5 } , "alias": "Von", "name": "VonKemble", "user-since": { datetime: 1262686200000}, "friend-ids": { unorderedlist: [{ int32: 3 } , { int32: 6 } , { int32: 10 } ]}, "employment": { orderedlist: [{ "organization-name": "Kongreen", "start-date": { date: 1290816000000}, "end-date": null } ]} }
+
+
+

Query 7 - Universal Quantification

+
+
+
+
AQL
+ +
+
+
use dataverse TinySocial;
+
+for $fbu in dataset FacebookUsers
+where (every $e in $fbu.employment satisfies not(is-null($e.end-date)))
+return $fbu;
+
+
+
JS
+ +
+
+
var expression7 = new FLWOGRExpression()
+    .ForClause("$fbu", new AExpression("dataset FacebookUsers"))
+    .WhereClause(
+        new QuantifiedExpression (
+            "every" ,
+            {"$e" : new AExpression("$fbu.employment") },
+            new FunctionExpression("not", new FunctionExpression("is-null", new AExpression("$e.end-date")))
+        )
+    )
+    .ReturnClause("$fbu");
+
+
+
Results
+ +
+
+
{ "id": { int32: 9 } , "alias": "Woodrow", "name": "WoodrowNehling", "user-since": { datetime: 1127211000000}, "friend-ids": { unorderedlist: [{ int32: 3 } , { int32: 10 } ]}, "employment": { orderedlist: [{ "organization-name": "Zuncan", "start-date": { date: 1050969600000}, "end-date": { date: 1260662400000} } ]} }
+{ "id": { int32: 10 } , "alias": "Bram", "name": "BramHatch", "user-since": { datetime: 1287223800000}, "friend-ids": { unorderedlist: [{ int32: 1 } , { int32: 5 } , { int32: 9 } ]}, "employment": { orderedlist: [{ "organization-name": "physcane", "start-date": { date: 1181001600000}, "end-date": { date: 1320451200000} } ]} }
+{ "id": { int32: 3 } , "alias": "Emory", "name": "EmoryUnk", "user-since": { datetime: 1341915000000}, "friend-ids": { unorderedlist: [{ int32: 1 } , { int32: 5 } , { int32: 8 } , { int32: 9 } ]}, "employment": { orderedlist: [{ "organization-name": "geomedia", "start-date": { date: 1276732800000}, "end-date": { date: 1264464000000} } ]} }
+
+
+

Query 8 - Simple Aggregation

+
+
+
+
AQL
+ +
+
+
use dataverse TinySocial;
+
+count(for $fbu in dataset FacebookUsers return $fbu);
+
+
+
JS
+ +
+
+
var expression8 = new FunctionExpression(
+    "count",
+    new FLWOGRExpression()
+        .ForClause("$fbu", new AExpression("dataset FacebookUsers"))
+        .ReturnClause("$fbu")
+);
+
+
+
Results
+ +
+
+
{ int64: 10 }
+
+
+

Query 9-A - Grouping and Aggregation

+
+
+
+
AQL
+ +
+
+
use dataverse TinySocial;
+
+for $t in dataset TweetMessages
+group by $uid := $t.user.screen-name with $t
+return {
+    "user": $uid,
+    "count": count($t)
+};
+
+
+
JS
+ +
+
+
var expression9a = new FLWOGRExpression()
+    .ForClause("$t", new AExpression("dataset TweetMessages"))
+    .GroupClause("$uid", new AExpression("$t.user.screen-name"), "with", "$t")
+    .ReturnClause(
+        {
+            "user" : "$uid",
+            "count" : new FunctionExpression("count", new AExpression("$t"))
+        }
+    );
+
+
+
Results
+ +
+
+
{ "user": "ColineGeyer@63", "count": { int64: 3 } }
+{ "user": "OliJackson_512", "count": { int64: 1 } }
+{ "user": "NilaMilliron_tw", "count": { int64: 1 } }
+{ "user": "ChangEwing_573", "count": { int64: 1 } }
+{ "user": "NathanGiesen@211", "count": { int64: 6 } }
+
+
+

Query 9-B - (Hash-Based) Grouping and Aggregation

+
+
+
+
AQL
+ +
+
+
use dataverse TinySocial;
+
+for $t in dataset TweetMessages
+/*+ hash*/
+group by $uid := $t.user.screen-name with $t
+return {
+    "user": $uid,
+    "count": count($t)
+};
+
+
+
JS
+ +
+
+
var expression9b = new FLWOGRExpression()
+    .ForClause("$t", new AExpression("dataset TweetMessages"))
+    .AQLClause("/*+ hash*/")
+    .GroupClause("$uid", new AExpression("$t.user.screen-name"), "with", "$t")
+    .ReturnClause(
+        {
+            "user" : "$uid",
+            "count" : new FunctionExpression("count", new AExpression("$t"))
+        }
+    );
+
+
+
Results
+ +
+
+
{ "user": "ColineGeyer@63", "count": { int64: 3 } }
+{ "user": "OliJackson_512", "count": { int64: 1 } }
+{ "user": "NilaMilliron_tw", "count": { int64: 1 } }
+{ "user": "ChangEwing_573", "count": { int64: 1 } }
+{ "user": "NathanGiesen@211", "count": { int64: 6 } }
+
+
+

Query 10 - Grouping and Limits

+
+
+
+
AQL
+ +
+
+
use dataverse TinySocial;
+
+for $t in dataset TweetMessages
+group by $uid := $t.user.screen-name with $t
+let $c := count($t)
+order by $c desc
+limit 3
+return {
+    "user": $uid,
+    "count": $c
+};
+
+
+
JS
+ +
+
+
var expression10 = new FLWOGRExpression()
+    .ForClause("$t", new AExpression("dataset TweetMessages"))
+    .GroupClause("$uid", new AExpression("$t.user.screen-name"), "with", "$t")
+    .LetClause("$c", new FunctionExpression("count", new AExpression("$t")))
+    .OrderbyClause( new AExpression("$c"), "desc" )
+    .LimitClause(new AExpression("3"))
+    .ReturnClause(
+        {
+            "user" : "$uid",
+            "count" : "$c"
+        }
+    );
+
+
+
Results
+ +
+
+
{ "user": "NathanGiesen@211", "count": { int64: 6 } }
+{ "user": "ColineGeyer@63", "count": { int64: 3 } }
+{ "user": "NilaMilliron_tw", "count": { int64: 1 } }
+
+
+

Query 11 - Left Outer Fuzzy Join

+
+
+
+
AQL
+ +
+
+
use dataverse TinySocial;
+
+set simfunction "jaccard";
+set simthreshold "0.3";
+
+for $t in dataset TweetMessages
+return {
+    "tweet": $t,
+    "similar-tweets": for $t2 in dataset TweetMessages
+    where  $t2.referred-topics ~= $t.referred-topics
+    and $t2.tweetid != $t.tweetid
+    return $t2.referred-topics
+};
+
+
+
JS
+ +
+
+
var expression11 = new FLWOGRExpression()
+    .ForClause( "$t", new AExpression("dataset TweetMessages"))
+    .ReturnClause({
+        "tweet"         : new AExpression("$t"),
+        "similar-tweets": new FLWOGRExpression()
+                            .ForClause( "$t2", new AExpression("dataset TweetMessages"))
+                            .WhereClause().and(
+                                new AExpression("$t2.referred-topics ~= $t.referred-topics"),
+                                new AExpression("$t2.tweetid != $t.tweetid")
+                             )
+                            .ReturnClause("$t2.referred-topics")
+    });
+
+
+
Results
+ +
+
+
{ "tweet": { "tweetid": "10", "user": { "screen-name": "ColineGeyer@63", "lang": "en", "friends_count": { int32: 121 } , "statuses_count": { int32: 362 } , "name": "Coline Geyer", "followers_count": { int32: 17159 } }, "sender-location": { point: [29.15, 76.53]}, "send-time": { datetime: 1201342200000}, "referred-topics": { unorderedlist: ["ccast", "voice-clarity" ]}, "message-text": " hate ccast its voice-clarity is OMG:(" }, "similar-tweets": { orderedlist: [{ unorderedlist: ["x-phone", "voice-clarity" ]}, { unorderedlist: ["ccast", "shortcut-menu" ]}, { unorderedlist: ["ccast", "voicemail-service" ]} ]} }
+{ "tweet": { "tweetid": "6", "user": { "screen-name": "ColineGeyer@63", "lang": "en", "friends_count": { int32: 121 } , "statuses_count": { int32: 362 } , "name": "Coline Geyer", "followers_count": { int32: 17159 } }, "sender-location": { point: [47.51, 83.99]}, "send-time": { datetime: 1273227000000}, "referred-topics": { unorderedlist: ["x-phone", "voice-clarity" ]}, "message-text": " like x-phone the voice-clarity is good:)" }, "similar-tweets": { orderedlist: [{ unorderedlist: ["ccast", "voice-clarity" ]}, { unorderedlist: ["x-phone", "platform" ]} ]} }
+{ "tweet": { "tweetid": "7", "user": { "screen-name": "ChangEwing_573", "lang": "en", "friends_count": { int32: 182 } , "statuses_count": { int32: 394 } , "name": "Chang Ewing", "followers_count": { int32: 32136 } }, "sender-location": { point: [36.21, 72.6]}, "send-time": { datetime: 1314267000000}, "referred-topics": { unorderedlist: ["product-y", "platform" ]}, "message-text": " like product-y the platform is good" }, "similar-tweets": { orderedlist: [{ unorderedlist: ["x-phone", "platform" ]}, { unorderedlist: ["product-y", "voice-command" ]} ]} }
+{ "tweet": { "tweetid": "1", "user": { "screen-name": "NathanGiesen@211", "lang": "en", "friends_count": { int32: 39339 } , "statuses_count": { int32: 473 } , "name": "Nathan Giesen", "followers_count": { int32: 49416 } }, "sender-location": { point: [47.44, 80.65]}, "send-time": { datetime: 1209204600000}, "referred-topics": { unorderedlist: ["product-z", "customization" ]}, "message-text": " love product-z its customization is good:)" }, "similar-tweets": { orderedlist: [{ unorderedlist: ["product-z", "shortcut-menu" ]} ]} }
+{ "tweet": { "tweetid": "12", "user": { "screen-name": "OliJackson_512", "lang": "en", "friends_count": { int32: 445 } , "statuses_count": { int32: 164 } , "name": "Oli Jackson", "followers_count": { int32: 22649 } }, "sender-location": { point: [24.82, 94.63]}, "send-time": { datetime: 1266055800000}, "referred-topics": { unorderedlist: ["product-y", "voice-command" ]}, "message-text": " like product-y the voice-command is amazing:)" }, "similar-tweets": { orderedlist: [{ unorderedlist: ["product-y", "platform" ]}, { unorderedlist: ["product-b", "voice-command" ]} ]} }
+{ "tweet": { "tweetid": "3", "user": { "screen-name": "NathanGiesen@211", "lang": "en", "friends_count": { int32: 39339 } , "statuses_count": { int32: 473 } , "name": "Nathan Giesen", "followers_count": { int32: 49416 } }, "sender-location": { point: [29.72, 75.8]}, "send-time": { datetime: 1162635000000}, "referred-topics": { unorderedlist: ["product-w", "speed" ]}, "message-text": " like product-w the speed is good:)" }, "similar-tweets": { orderedlist: [{ unorderedlist: ["product-w", "speed" ]} ]} }
+{ "tweet": { "tweetid": "9", "user": { "screen-name": "NathanGiesen@211", "lang": "en", "friends_count": { int32: 39339 } , "statuses_count": { int32: 473 } , "name": "Nathan Giesen", "followers_count": { int32: 49416 } }, "sender-location": { point: [36.86, 74.62]}, "send-time": { datetime: 1342865400000}, "referred-topics": { unorderedlist: ["ccast", "voicemail-service" ]}, "message-text": " love ccast its voicemail-service is awesome" }, "similar-tweets": { orderedlist: [{ unorderedlist: ["ccast", "voice-clarity" ]}, { unorderedlist: ["ccast", "shortcut-menu" ]} ]} }
+{ "tweet": { "tweetid": "5", "user": { "screen-name": "NathanGiesen@211", "lang": "en", "friends_count": { int32: 39339 } , "statuses_count": { int32: 473 } , "name": "Nathan Giesen", "followers_count": { int32: 49416 } }, "sender-location": { point: [40.09, 92.69]}, "send-time": { datetime: 1154686200000}, "referred-topics": { unorderedlist: ["product-w", "speed" ]}, "message-text": " can't stand product-w its speed is terrible:(" }, "similar-tweets": { orderedlist: [{ unorderedlist: ["product-w", "speed" ]} ]} }
+{ "tweet": { "tweetid": "8", "user": { "screen-name": "NathanGiesen@211", "lang": "en", "friends_count": { int32: 39339 } , "statuses_count": { int32: 473 } , "name": "Nathan Giesen", "followers_count": { int32: 49416 } }, "sender-location": { point: [46.05, 93.34]}, "send-time": { datetime: 1129284600000}, "referred-topics": { unorderedlist: ["product-z", "shortcut-menu" ]}, "message-text": " like product-z the shortcut-menu is awesome:)" }, "similar-tweets": { orderedlist: [{ unorderedlist: ["ccast", "shortcut-menu" ]}, { unorderedlist: ["product-z", "customization" ]} ]} }
+{ "tweet": { "tweetid": "11", "user": { "screen-name": "NilaMilliron_tw", "lang": "en", "friends_count": { int32: 445 } , "statuses_count": { int32: 164 } , "name": "Nila Milliron", "followers_count": { int32: 22649 } }, "sender-location": { point: [37.59, 68.42]}, "send-time": { datetime: 1205057400000}, "referred-topics": { unorderedlist: ["x-phone", "platform" ]}, "message-text": " can't stand x-phone its platform is terrible" }, "similar-tweets": { orderedlist: [{ unorderedlist: ["x-phone", "voice-clarity" ]}, { unorderedlist: ["product-y", "platform" ]} ]} }
+{ "tweet": { "tweetid": "2", "user": { "screen-name": "ColineGeyer@63", "lang": "en", "friends_count": { int32: 121 } , "statuses_count": { int32: 362 } , "name": "Coline Geyer", "followers_count": { int32: 17159 } }, "sender-location": { point: [32.84, 67.14]}, "send-time": { datetime: 1273745400000}, "referred-topics": { unorderedlist: ["ccast", "shortcut-menu" ]}, "message-text": " like ccast its shortcut-menu is awesome:)" }, "similar-tweets": { orderedlist: [{ unorderedlist: ["product-z", "shortcut-menu" ]}, { unorderedlist: ["ccast", "voice-clarity" ]}, { unorderedlist: ["ccast", "voicemail-service" ]} ]} }
+{ "tweet": { "tweetid": "4", "user": { "screen-name": "NathanGiesen@211", "lang": "en", "friends_count": { int32: 39339 } , "statuses_count": { int32: 473 } , "name": "Nathan Giesen", "followers_count": { int32: 49416 } }, "sender-location": { point: [39.28, 70.48]}, "send-time": { datetime: 1324894200000}, "referred-topics": { unorderedlist: ["product-b", "voice-command" ]}, "message-text": " like product-b the voice-command is mind-blowing:)" }, "similar-tweets": { orderedlist: [{ unorderedlist: ["product-y", "voice-command" ]} ]} }
+
+
+
+
+ +
+ + + +