Yingyi Bu has uploaded a new change for review.
https://asterix-gerrit.ics.uci.edu/1287
Change subject: Make results in the SQL++ reference doc pretty.
......................................................................
Make results in the SQL++ reference doc pretty.
Change-Id: Ifaba037b023e76b90a0520751b2914757ec191cf
---
M asterixdb/asterix-doc/src/main/markdown/sqlpp/3_query.md
1 file changed, 713 insertions(+), 131 deletions(-)
git pull ssh://asterix-gerrit.ics.uci.edu:29418/asterixdb
refs/changes/87/1287/1
diff --git a/asterixdb/asterix-doc/src/main/markdown/sqlpp/3_query.md
b/asterixdb/asterix-doc/src/main/markdown/sqlpp/3_query.md
index f1ebc47..c77ba84 100644
--- a/asterixdb/asterix-doc/src/main/markdown/sqlpp/3_query.md
+++ b/asterixdb/asterix-doc/src/main/markdown/sqlpp/3_query.md
@@ -106,10 +106,31 @@
This query returns:
- [
- { "id": 1, "alias": "Margarita", "name": "MargaritaStoddard",
"userSince": datetime("2012-08-20T10:10:00.000Z"), "friendIds": {{ 2, 3, 6, 10
}}, "employment": [ { "organizationName": "Codetechno", "startDate":
date("2006-08-06") }, { "organizationName": "geomedia", "startDate":
date("2010-06-17"), "endDate": date("2010-01-26") } ], "nickname": "Mags",
"gender": "F" }
-
- ]
+ [{
+ "userSince": "2012-08-20T10:10:00.000Z",
+ "friendIds": [
+ 2,
+ 3,
+ 6,
+ 10
+ ],
+ "gender": "F",
+ "name": "MargaritaStoddard",
+ "nickname": "Mags",
+ "alias": "Margarita",
+ "id": 1,
+ "employment": [
+ {
+ "organizationName": "Codetechno",
+ "start-date": "2006-08-06"
+ },
+ {
+ "end-date": "2010-01-26",
+ "organizationName": "geomedia",
+ "start-date": "2010-06-17"
+ }
+ ]
+ } ]
### <a id="SQL_select">SQL-style SELECT</a>
In SQL++, the traditional SQL-style `SELECT` syntax is also supported.
@@ -123,9 +144,10 @@
Returns:
- [
- {"user_alias":"Margarita","user_name":"MargaritaStoddard"}
- ]
+ [ {
+ "user_name": "MargaritaStoddard",
+ "user_alias": "Margarita"
+ } ]
### <a id="Select_star">SELECT *</a>
In SQL++, `SELECT *` returns a record with a nested field for each input
tuple. Each field has as its field name the name of a binding variable
generated by either the `FROM` clause or `GROUP BY` clause in the current
enclosing `SELECT` statement, and its field is the value of that binding
variable.
@@ -137,11 +159,71 @@
Since `user` is the only binding variable generated in the `FROM` clause, this
query returns:
- [
- { "user": { "id": 1, "alias": "Margarita", "name": "MargaritaStoddard",
"userSince": datetime("2012-08-20T10:10:00.000Z"), "friendIds": {{ 2, 3, 6, 10
}}, "employment": [ { "organizationName": "Codetechno", "startDate":
date("2006-08-06") }, { "organizationName": "geomedia", "startDate":
date("2010-06-17"), "endDate": date("2010-01-26") } ], "nickname": "Mags",
"gender": "F" } },
- { "user": { "id": 2, "alias": "Isbel", "name": "IsbelDull", "userSince":
datetime("2011-01-22T10:10:00.000Z"), "friendIds": {{ 1, 4 }}, "employment": [
{ "organizationName": "Hexviafind", "startDate": date("2010-04-27") } ],
"nickname": "Izzy" } },
- { "user": { "id": 3, "alias": "Emory", "name": "EmoryUnk", "userSince":
datetime("2012-07-10T10:10:00.000Z"), "friendIds": {{ 1, 5, 8, 9 }},
"employment": [ { "organizationName": "geomedia", "startDate":
date("2010-06-17"), "endDate": date("2010-01-26") } ] } }
- ]
+ [ {
+ "user": {
+ "userSince": "2012-08-20T10:10:00.000Z",
+ "friendIds": [
+ 2,
+ 3,
+ 6,
+ 10
+ ],
+ "gender": "F",
+ "name": "MargaritaStoddard",
+ "nickname": "Mags",
+ "alias": "Margarita",
+ "id": 1,
+ "employment": [
+ {
+ "organizationName":
"Codetechno",
+ "start-date": "2006-08-06"
+ },
+ {
+ "end-date": "2010-01-26",
+ "organizationName": "geomedia",
+ "start-date": "2010-06-17"
+ }
+ ]
+ }
+ }, {
+ "user": {
+ "userSince": "2011-01-22T10:10:00.000Z",
+ "friendIds": [
+ 1,
+ 4
+ ],
+ "name": "IsbelDull",
+ "nickname": "Izzy",
+ "alias": "Isbel",
+ "id": 2,
+ "employment": [
+ {
+ "organizationName":
"Hexviafind",
+ "startDate": "2010-04-27"
+ }
+ ]
+ }
+ }, {
+ "user": {
+ "userSince": "2012-07-10T10:10:00.000Z",
+ "friendIds": [
+ 1,
+ 5,
+ 8,
+ 9
+ ],
+ "name": "EmoryUnk",
+ "alias": "Emory",
+ "id": 3,
+ "employment": [
+ {
+ "organizationName": "geomedia",
+ "endDate": "2010-01-26",
+ "startDate": "2010-06-17"
+ }
+ ]
+ }
+ } ]
### <a id="Select_distinct">SELECT DISTINCT</a>
SQL++'s `DISTINCT` keyword is used to eliminate duplicate items in results.
The following example shows how it works.
@@ -152,11 +234,13 @@
This query returns:
- [
- { "foo": 1 },
- { "foo": 2 },
- { "foo": 3 }
- ]
+ [ {
+ "foo": 1
+ }, {
+ "foo": 2
+ }, {
+ "foo": 3
+ } ]
##### Example
@@ -164,7 +248,10 @@
This version of the query returns:
- [ 1, 2, 3 ]
+ [ 1
+ , 2
+ , 3
+ ]
### <a id="Unnamed_projections">Unnamed projections</a>
Similar to standard SQL, SQL++ supports unnamed projections (a.k.a, unnamed
`SELECT` clause items), for which names are generated.
@@ -182,9 +269,10 @@
This query outputs:
- [
- { "$1": "Stoddard", "alias": "Margarita" }
- ]
+ [ {
+ "alias": "Margarita",
+ "$1": "Stoddard"
+ } ]
In the result, `$1` is the generated name for `substr(user.name, 1)`, while
`alias` is the generated name for `user.alias`.
@@ -199,9 +287,10 @@
Outputs:
- [
- { "lname": "Stoddard", "alias": "Margarita" }
- ]
+ [ {
+ "lname": "Stoddard",
+ "alias": "Margarita"
+ } ]
## <a id="Unnest_clauses">UNNEST Clause</a>
For each of its input tuples, the `UNNEST` clause flattens a collection-valued
expression into individual items, producing multiple tuples, each of which is
one of the expression's original input tuples augmented with a flattened item
from its collection.
@@ -218,10 +307,13 @@
This query returns:
- [
- { "userId": 1, "orgName": "Codetechno" },
- { "userId": 1, "orgName": "geomedia" }
- ]
+ [ {
+ "orgName": "Codetechno",
+ "userId": 1
+ }, {
+ "orgName": "geomedia",
+ "userId": 1
+ } ]
Note that `UNNEST` has SQL's inner join semantics --- that is, if a user has
no employment history, no tuple corresponding to that user will be emitted in
the result.
@@ -237,9 +329,9 @@
Returns:
- [
- { "userId": 1 }
- ]
+ [ {
+ "userId": 1
+ } ]
Note that if `u.hobbies` is an empty collection or leads to a `MISSING` (as
above) or `NULL` value for a given input tuple, there is no corresponding
binding value for variable `h` for an input tuple. A `MISSING` value will be
generated for `h` so that the input tuple can still be propagated.
@@ -256,15 +348,28 @@
This returns:
- [
- { "uname": "MargaritaStoddard", "message": " can't stand at&t its plan
is terrible" },
- { "uname": "MargaritaStoddard", "message": " dislike iphone its
touch-screen is horrible" },
- { "uname": "MargaritaStoddard", "message": " can't stand at&t the
network is horrible:(" },
- { "uname": "MargaritaStoddard", "message": " like verizon the 3G is
awesome:)" },
- { "uname": "MargaritaStoddard", "message": " can't stand motorola the
touch-screen is terrible" },
- { "uname": "IsbelDull", "message": " like t-mobile its platform is
mind-blowing" },
- { "uname": "IsbelDull", "message": " like samsung the plan is amazing" }
- ]
+ [ {
+ "uname": "MargaritaStoddard",
+ "message": " can't stand at&t its plan is terrible"
+ }, {
+ "uname": "MargaritaStoddard",
+ "message": " dislike iphone its touch-screen is
horrible"
+ }, {
+ "uname": "MargaritaStoddard",
+ "message": " can't stand at&t the network is horrible:("
+ }, {
+ "uname": "MargaritaStoddard",
+ "message": " like verizon the 3G is awesome:)"
+ }, {
+ "uname": "MargaritaStoddard",
+ "message": " can't stand motorola the touch-screen is
terrible"
+ }, {
+ "uname": "IsbelDull",
+ "message": " like t-mobile its platform is mind-blowing"
+ }, {
+ "uname": "IsbelDull",
+ "message": " like samsung the plan is amazing"
+ } ]
Similarly, the above query can also be expressed as the `UNNEST`ing of a
correlated SQL++ subquery:
@@ -345,15 +450,28 @@
Returns:
- [
- { "name": "MargaritaStoddard", "message": " can't stand at&t its plan is
terrible" },
- { "name": "MargaritaStoddard", "message": " dislike iphone its
touch-screen is horrible" },
- { "name": "MargaritaStoddard", "message": " can't stand at&t the network
is horrible:(" },
- { "name": "MargaritaStoddard", "message": " like verizon the 3G is
awesome:)" },
- { "name": "MargaritaStoddard", "message": " can't stand motorola the
touch-screen is terrible" },
- { "name": "IsbelDull", "message": " like t-mobile its platform is
mind-blowing" },
- { "name": "IsbelDull", "message": " like samsung the plan is amazing" }
- ]
+ [ {
+ "name": "MargaritaStoddard",
+ "message": " like verizon the 3G is awesome:)"
+ }, {
+ "name": "MargaritaStoddard",
+ "message": " can't stand motorola the touch-screen is
terrible"
+ }, {
+ "name": "MargaritaStoddard",
+ "message": " can't stand at&t its plan is terrible"
+ }, {
+ "name": "MargaritaStoddard",
+ "message": " dislike iphone its touch-screen is
horrible"
+ }, {
+ "name": "MargaritaStoddard",
+ "message": " can't stand at&t the network is horrible:("
+ }, {
+ "name": "IsbelDull",
+ "message": " like samsung the plan is amazing"
+ }, {
+ "name": "IsbelDull",
+ "message": " like t-mobile its platform is mind-blowing"
+ } ]
##### Example
@@ -367,11 +485,8 @@
Returns:
- Error: Need an alias for the enclosed expression:
- (select element $GleambookMessages
- from $GleambookMessages as $GleambookMessages
- where ($GleambookMessages.authorId = $GleambookUsers.id)
- )
+ Error: "Syntax error: Need an alias for the enclosed expression:\n(select
element GleambookMessages\n from GleambookMessages as GleambookMessages\n
where (GleambookMessages.authorId = GleambookUsers.id)\n )",
+ "query_from_user": "use TinySocial;\n\nSELECT GleambookUsers.name,
GleambookMessages.message\n FROM GleambookUsers,\n (\n SELECT
VALUE GleambookMessages\n FROM GleambookMessages\n WHERE
GleambookMessages.authorId = GleambookUsers.id\n );"
## <a id="Join_clauses">JOIN clauses</a>
The join clause in SQL++ supports both inner joins and left outer joins from
standard SQL.
@@ -392,16 +507,30 @@
Returns:
- [
- { "uname": "MargaritaStoddard", "message": " can't stand at&t its plan
is terrible" },
- { "uname": "MargaritaStoddard", "message": " dislike iphone its
touch-screen is horrible" },
- { "uname": "MargaritaStoddard", "message": " can't stand at&t the
network is horrible:(" },
- { "uname": "MargaritaStoddard", "message": " like verizon the 3G is
awesome:)" },
- { "uname": "MargaritaStoddard", "message": " can't stand motorola the
touch-screen is terrible" },
- { "uname": "IsbelDull", "message": " like t-mobile its platform is
mind-blowing" },
- { "uname": "IsbelDull", "message": " like samsung the plan is amazing" },
- { "uname": "EmoryUnk" }
- ]
+ [ {
+ "uname": "MargaritaStoddard",
+ "message": " like verizon the 3G is awesome:)"
+ }, {
+ "uname": "MargaritaStoddard",
+ "message": " can't stand motorola the touch-screen is
terrible"
+ }, {
+ "uname": "MargaritaStoddard",
+ "message": " can't stand at&t its plan is terrible"
+ }, {
+ "uname": "MargaritaStoddard",
+ "message": " dislike iphone its touch-screen is
horrible"
+ }, {
+ "uname": "MargaritaStoddard",
+ "message": " can't stand at&t the network is horrible:("
+ }, {
+ "uname": "IsbelDull",
+ "message": " like samsung the plan is amazing"
+ }, {
+ "uname": "IsbelDull",
+ "message": " like t-mobile its platform is mind-blowing"
+ }, {
+ "uname": "EmoryUnk"
+ } ]
For non-matching left-side tuples, SQL++ produces `MISSING` values for the
right-side binding variables; that is why the last record in the above result
doesn't have a `message` field. Note that this is slightly different from
standard SQL, which instead would fill in `NULL` values for the right-side
fields. The reason for this difference is that, for non-matches in its join
results, SQL++ views fields from the right-side as being "not there" (a.k.a.
`MISSING`) instead of as being "there but unknown" (i.e., `NULL`).
@@ -434,15 +563,99 @@
This first example query returns:
- [
- { "uid": 1, "msgs": [ { "msg": { "messageId": 8, "authorId": 1,
"inResponseTo": 11, "senderLocation": point("40.33,80.87"), "message": " like
verizon the 3G is awesome:)" } },
- { "msg": { "messageId": 10, "authorId": 1,
"inResponseTo": 12, "senderLocation": point("42.5,70.01"), "message": " can't
stand motorola the touch-screen is terrible" } },
- { "msg": { "messageId": 11, "authorId": 1,
"inResponseTo": 1, "senderLocation": point("38.97,77.49"), "message": " can't
stand at&t its plan is terrible" } },
- { "msg": { "messageId": 2, "authorId": 1,
"inResponseTo": 4, "senderLocation": point("41.66,80.87"), "message": " dislike
iphone its touch-screen is horrible" } },
- { "msg": { "messageId": 4, "authorId": 1,
"inResponseTo": 2, "senderLocation": point("37.73,97.04"), "message": " can't
stand at&t the network is horrible:(" } } ] },
- { "uid": 2, "msgs": [ { "msg": { "messageId": 6, "authorId": 2,
"inResponseTo": 1, "senderLocation": point("31.5,75.56"), "message": " like
t-mobile its platform is mind-blowing" } },
- { "msg": { "messageId": 3, "authorId": 2,
"inResponseTo": 4, "senderLocation": point("48.09,81.01"), "message": " like
samsung the plan is amazing" } } ] }
- ]
+ [ {
+ "msgs": [
+ {
+ "msg": {
+ "senderLocation": [
+ 38.97,
+ 77.49
+ ],
+ "inResponseTo": 1,
+ "messageId": 11,
+ "authorId": 1,
+ "message": " can't stand at&t
its plan is terrible"
+ }
+ },
+ {
+ "msg": {
+ "senderLocation": [
+ 41.66,
+ 80.87
+ ],
+ "inResponseTo": 4,
+ "messageId": 2,
+ "authorId": 1,
+ "message": " dislike iphone its
touch-screen is horrible"
+ }
+ },
+ {
+ "msg": {
+ "senderLocation": [
+ 37.73,
+ 97.04
+ ],
+ "inResponseTo": 2,
+ "messageId": 4,
+ "authorId": 1,
+ "message": " can't stand at&t
the network is horrible:("
+ }
+ },
+ {
+ "msg": {
+ "senderLocation": [
+ 40.33,
+ 80.87
+ ],
+ "inResponseTo": 11,
+ "messageId": 8,
+ "authorId": 1,
+ "message": " like verizon the
3G is awesome:)"
+ }
+ },
+ {
+ "msg": {
+ "senderLocation": [
+ 42.5,
+ 70.01
+ ],
+ "inResponseTo": 12,
+ "messageId": 10,
+ "authorId": 1,
+ "message": " can't stand
motorola the touch-screen is terrible"
+ }
+ }
+ ],
+ "uid": 1
+ }, {
+ "msgs": [
+ {
+ "msg": {
+ "senderLocation": [
+ 31.5,
+ 75.56
+ ],
+ "inResponseTo": 1,
+ "messageId": 6,
+ "authorId": 2,
+ "message": " like t-mobile its
platform is mind-blowing"
+ }
+ },
+ {
+ "msg": {
+ "senderLocation": [
+ 48.09,
+ 81.01
+ ],
+ "inResponseTo": 4,
+ "messageId": 3,
+ "authorId": 2,
+ "message": " like samsung the
plan is amazing"
+ }
+ }
+ ],
+ "uid": 2
+ } ]
As we can see from the above query result, each group in the example query's
output has an associated group
variable value called `msgs` that appears in the `SELECT *`'s result.
@@ -464,13 +677,85 @@
This variant of the example query returns:
- { "uid": 1, "msgs": [ { "messageId": 8, "authorId": 1, "inResponseTo":
11, "senderLocation": point("40.33,80.87"), "message": " like verizon the 3G is
awesome:)" },
- { "messageId": 10, "authorId": 1, "inResponseTo":
12, "senderLocation": point("42.5,70.01"), "message": " can't stand motorola
the touch-screen is terrible" },
- { "messageId": 11, "authorId": 1, "inResponseTo":
1, "senderLocation": point("38.97,77.49"), "message": " can't stand at&t its
plan is terrible" },
- { "messageId": 2, "authorId": 1, "inResponseTo":
4, "senderLocation": point("41.66,80.87"), "message": " dislike iphone its
touch-screen is horrible" },
- { "messageId": 4, "authorId": 1, "inResponseTo":
2, "senderLocation": point("37.73,97.04"), "message": " can't stand at&t the
network is horrible:(" } ] },
- { "uid": 2, "msgs": [ { "messageId": 6, "authorId": 2, "inResponseTo":
1, "senderLocation": point("31.5,75.56"), "message": " like t-mobile its
platform is mind-blowing" },
- { "messageId": 3, "authorId": 2, "inResponseTo":
4, "senderLocation": point("48.09,81.01"), "message": " like samsung the plan
is amazing" } ] }
+ [ {
+ "msgs": [
+ {
+ "senderLocation": [
+ 38.97,
+ 77.49
+ ],
+ "inResponseTo": 1,
+ "messageId": 11,
+ "authorId": 1,
+ "message": " can't stand at&t
its plan is terrible"
+ },
+ {
+ "senderLocation": [
+ 41.66,
+ 80.87
+ ],
+ "inResponseTo": 4,
+ "messageId": 2,
+ "authorId": 1,
+ "message": " dislike iphone its
touch-screen is horrible"
+ },
+ {
+ "senderLocation": [
+ 37.73,
+ 97.04
+ ],
+ "inResponseTo": 2,
+ "messageId": 4,
+ "authorId": 1,
+ "message": " can't stand at&t
the network is horrible:("
+ },
+ {
+ "senderLocation": [
+ 40.33,
+ 80.87
+ ],
+ "inResponseTo": 11,
+ "messageId": 8,
+ "authorId": 1,
+ "message": " like verizon the
3G is awesome:)"
+ },
+ {
+ "senderLocation": [
+ 42.5,
+ 70.01
+ ],
+ "inResponseTo": 12,
+ "messageId": 10,
+ "authorId": 1,
+ "message": " can't stand
motorola the touch-screen is terrible"
+ }
+ ],
+ "uid": 1
+ }, {
+ "msgs": [
+ {
+ "senderLocation": [
+ 31.5,
+ 75.56
+ ],
+ "inResponseTo": 1,
+ "messageId": 6,
+ "authorId": 2,
+ "message": " like t-mobile its
platform is mind-blowing"
+ },
+ {
+ "senderLocation": [
+ 48.09,
+ 81.01
+ ],
+ "inResponseTo": 4,
+ "messageId": 3,
+ "authorId": 2,
+ "message": " like samsung the
plan is amazing"
+ }
+ ],
+ "uid": 2
+ } ]
Because this is a fairly common case, a third variant with output identical to
the second variant is also possible:
@@ -500,11 +785,45 @@
This example query returns:
- [
- { "uid": 1, "msgs": [ { "messageId": 8, "authorId": 1, "inResponseTo":
11, "senderLocation": point("40.33,80.87"), "message": " like verizon the 3G is
awesome:)" } ] },
- { "uid": 2, "msgs": [ { "messageId": 3, "authorId": 2, "inResponseTo":
4, "senderLocation": point("48.09,81.01"), "message": " like samsung the plan
is amazing" },
- { "messageId": 6, "authorId": 2, "inResponseTo":
1, "senderLocation": point("31.5,75.56"), "message": " like t-mobile its
platform is mind-blowing" } ] }
- ]
+ [ {
+ "msgs": [
+ {
+ "senderLocation": [
+ 40.33,
+ 80.87
+ ],
+ "inResponseTo": 11,
+ "messageId": 8,
+ "authorId": 1,
+ "message": " like verizon the 3G is
awesome:)"
+ }
+ ],
+ "uid": 1
+ }, {
+ "msgs": [
+ {
+ "senderLocation": [
+ 48.09,
+ 81.01
+ ],
+ "inResponseTo": 4,
+ "messageId": 3,
+ "authorId": 2,
+ "message": " like samsung the plan is
amazing"
+ },
+ {
+ "senderLocation": [
+ 31.5,
+ 75.56
+ ],
+ "inResponseTo": 1,
+ "messageId": 6,
+ "authorId": 2,
+ "message": " like t-mobile its platform
is mind-blowing"
+ }
+ ],
+ "uid": 2
+ } ]
### <a id="Implicit_group_key_variables">Implicit grouping key variables</a>
In the SQL++ syntax, providing named binding variables for `GROUP BY` key
expressions is optional.
@@ -530,11 +849,45 @@
This query returns:
- [
- { "authorId": 1, "msgs": [ { "messageId": 8, "authorId": 1,
"inResponseTo": 11, "senderLocation": point("40.33,80.87"), "message": " like
verizon the 3G is awesome:)" } ] },
- { "authorId": 2, "msgs": [ { "messageId": 3, "authorId": 2,
"inResponseTo": 4, "senderLocation": point("48.09,81.01"), "message": " like
samsung the plan is amazing" },
- { "messageId": 6, "authorId": 2,
"inResponseTo": 1, "senderLocation": point("31.5,75.56"), "message": " like
t-mobile its platform is mind-blowing" } ] }
- ]
+ [ {
+ "msgs": [
+ {
+ "senderLocation": [
+ 40.33,
+ 80.87
+ ],
+ "inResponseTo": 11,
+ "messageId": 8,
+ "authorId": 1,
+ "message": " like verizon the 3G is
awesome:)"
+ }
+ ],
+ "authorId": 1
+ }, {
+ "msgs": [
+ {
+ "senderLocation": [
+ 48.09,
+ 81.01
+ ],
+ "inResponseTo": 4,
+ "messageId": 3,
+ "authorId": 2,
+ "message": " like samsung the plan is
amazing"
+ },
+ {
+ "senderLocation": [
+ 31.5,
+ 75.56
+ ],
+ "inResponseTo": 1,
+ "messageId": 6,
+ "authorId": 2,
+ "message": " like t-mobile its platform
is mind-blowing"
+ }
+ ],
+ "authorId": 2
+ } ]
Based on the three variable generation rules, the generated variable for the
grouping key expression `message.authorId`
is `authorId` (which is how it is referred to in the example's `SELECT`
clause).
@@ -559,11 +912,24 @@
This query returns:
- [
- { "uid": 1, "msgs": [ { "message": " like verizon the 3G is awesome:)" }
] },
- { "uid": 2, "msgs": [ { "message": " like samsung the plan is amazing" },
- { "message": " like t-mobile its platform is
mind-blowing" } ] }
- ]
+ [ {
+ "msgs": [
+ {
+ "message": " like verizon the 3G is
awesome:)"
+ }
+ ],
+ "uid": 1
+ }, {
+ "msgs": [
+ {
+ "message": " like samsung the plan is
amazing"
+ },
+ {
+ "message": " like t-mobile its platform
is mind-blowing"
+ }
+ ],
+ "uid": 2
+ } ]
Note that in the query above, in principle, `message` is not an in-scope
variable in the `SELECT` clause.
However, the query above is a syntactically-sugared simplification of the
following query and it is thus
@@ -627,10 +993,13 @@
This query returns:
- [
- { "uid": 1, "msgCnt": 5 },
- { "uid": 2, "msgCnt": 2 }
- ]
+ [ {
+ "uid": 1,
+ "msgCnt": 5
+ }, {
+ "uid": 2,
+ "msgCnt": 2
+ } ]
Notice how the query forms groups where each group involves a message author
and their messages.
(SQL cannot do this because the grouped intermediate result is non-1NF in
nature.)
@@ -675,10 +1044,13 @@
This query outputs:
- [
- { "authorId": 1, "$1": 5 },
- { "authorId": 2, "$1": 2 }
- ]
+ [ {
+ "authorId": 1,
+ "$1": 5
+ }, {
+ "authorId": 2,
+ "$1": 2
+ } ]
In principle, a `msg` reference in the query's `SELECT` clause would be
"sugarized" as a collection
(as described in [Implicit group variables](#Implicit_group_variables)).
@@ -701,10 +1073,13 @@
This query returns:
- [
- { "aid": 1, "$1": 5 },
- { "aid": 2, "$1": 2 }
- ]
+ [ {
+ "$1": 5,
+ "aid": 1
+ }, {
+ "$1": 2,
+ "aid": 2
+ } ]
## <a id="Where_having_clauses">WHERE clauses and HAVING clauses</a>
Both `WHERE` clauses and `HAVING` clauses are used to filter input data based
on a condition expression.
@@ -725,11 +1100,65 @@
This query returns:
- [
- { "id": 1, "alias": "Margarita", "name": "MargaritaStoddard",
"userSince": datetime("2012-08-20T10:10:00.000Z"), "friendIds": {{ 2, 3, 6, 10
}}, "employment": [ { "organizationName": "Codetechno", "startDate":
date("2006-08-06") }, { "organizationName": "geomedia", "startDate":
date("2010-06-17"), "endDate": date("2010-01-26") } ], "nickname": "Mags",
"gender": "F" },
- { "id": 3, "alias": "Emory", "name": "EmoryUnk", "userSince":
datetime("2012-07-10T10:10:00.000Z"), "friendIds": {{ 1, 5, 8, 9 }},
"employment": [ { "organizationName": "geomedia", "startDate":
date("2010-06-17"), "endDate": date("2010-01-26") } ] }
- { "id": 2, "alias": "Isbel", "name": "IsbelDull", "userSince":
datetime("2011-01-22T10:10:00.000Z"), "friendIds": {{ 1, 4 }}, "employment": [
{ "organizationName": "Hexviafind", "startDate": date("2010-04-27") } ],
"nickname": "Izzy" }
- ]
+ [ {
+ "userSince": "2012-08-20T10:10:00.000Z",
+ "friendIds": [
+ 2,
+ 3,
+ 6,
+ 10
+ ],
+ "gender": "F",
+ "name": "MargaritaStoddard",
+ "nickname": "Mags",
+ "alias": "Margarita",
+ "id": 1,
+ "employment": [
+ {
+ "organizationName": "Codetechno",
+ "start-date": "2006-08-06"
+ },
+ {
+ "end-date": "2010-01-26",
+ "organizationName": "geomedia",
+ "start-date": "2010-06-17"
+ }
+ ]
+ }, {
+ "userSince": "2012-07-10T10:10:00.000Z",
+ "friendIds": [
+ 1,
+ 5,
+ 8,
+ 9
+ ],
+ "name": "EmoryUnk",
+ "alias": "Emory",
+ "id": 3,
+ "employment": [
+ {
+ "organizationName": "geomedia",
+ "endDate": "2010-01-26",
+ "startDate": "2010-06-17"
+ }
+ ]
+ }, {
+ "userSince": "2011-01-22T10:10:00.000Z",
+ "friendIds": [
+ 1,
+ 4
+ ],
+ "name": "IsbelDull",
+ "nickname": "Izzy",
+ "alias": "Isbel",
+ "id": 2,
+ "employment": [
+ {
+ "organizationName": "Hexviafind",
+ "startDate": "2010-04-27"
+ }
+ ]
+ } ]
## <a id="Limit_clauses">LIMIT clauses</a>
The `LIMIT` clause is used to limit the result set to a specified constant
size.
@@ -744,9 +1173,31 @@
This query returns:
- [
- { "id": 1, "alias": "Margarita", "name": "MargaritaStoddard",
"userSince": datetime("2012-08-20T10:10:00.000Z"), "friendIds": {{ 2, 3, 6, 10
}}, "employment": [ { "organizationName": "Codetechno", "startDate":
date("2006-08-06") }, { "organizationName": "geomedia", "startDate":
date("2010-06-17"), "endDate": date("2010-01-26") } ], "nickname": "Mags",
"gender": "F" }
- ]
+ [ {
+ "userSince": "2012-08-20T10:10:00.000Z",
+ "friendIds": [
+ 2,
+ 3,
+ 6,
+ 10
+ ],
+ "gender": "F",
+ "name": "MargaritaStoddard",
+ "nickname": "Mags",
+ "alias": "Margarita",
+ "id": 1,
+ "employment": [
+ {
+ "organizationName": "Codetechno",
+ "start-date": "2006-08-06"
+ },
+ {
+ "end-date": "2010-01-26",
+ "organizationName": "geomedia",
+ "start-date": "2010-06-17"
+ }
+ ]
+ } ]
## <a id="With_clauses">WITH clauses</a>
As in standard SQL, `WITH` clauses are available to improve the modularity of
a query.
@@ -764,10 +1215,49 @@
This query returns:
- [
- { "id": 1, "alias": "Margarita", "name": "MargaritaStoddard",
"userSince": datetime("2012-08-20T10:10:00.000Z"), "friendIds": {{ 2, 3, 6, 10
}}, "employment": [ { "organizationName": "Codetechno", "startDate":
date("2006-08-06") }, { "organizationName": "geomedia", "startDate":
date("2010-06-17"), "endDate": date("2010-01-26") } ], "nickname": "Mags",
"gender": "F" },
- { "id": 3, "alias": "Emory", "name": "EmoryUnk", "userSince":
datetime("2012-07-10T10:10:00.000Z"), "friendIds": {{ 1, 5, 8, 9 }},
"employment": [ { "organizationName": "geomedia", "startDate":
date("2010-06-17"), "endDate": date("2010-01-26") } ] }
- ]
+ [ {
+ "userSince": "2012-08-20T10:10:00.000Z",
+ "friendIds": [
+ 2,
+ 3,
+ 6,
+ 10
+ ],
+ "gender": "F",
+ "name": "MargaritaStoddard",
+ "nickname": "Mags",
+ "alias": "Margarita",
+ "id": 1,
+ "employment": [
+ {
+ "organizationName": "Codetechno",
+ "start-date": "2006-08-06"
+ },
+ {
+ "end-date": "2010-01-26",
+ "organizationName": "geomedia",
+ "start-date": "2010-06-17"
+ }
+ ]
+ }, {
+ "userSince": "2012-07-10T10:10:00.000Z",
+ "friendIds": [
+ 1,
+ 5,
+ 8,
+ 9
+ ],
+ "name": "EmoryUnk",
+ "alias": "Emory",
+ "id": 3,
+ "employment": [
+ {
+ "organizationName": "geomedia",
+ "endDate": "2010-01-26",
+ "startDate": "2010-06-17"
+ }
+ ]
+ } ]
The query is equivalent to the following, more complex, inlined form of the
query:
@@ -806,10 +1296,85 @@
This query lists `GleambookUsers` that have posted `GleambookMessages` and
shows all authored messages for each listed user. It returns:
- [
- { "messages": [ { "messageId": 8, "authorId": 1, "inResponseTo": 11,
"senderLocation": point("40.33,80.87"), "message": " like verizon the 3G is
awesome:)" }, { "messageId": 10, "authorId": 1, "inResponseTo": 12,
"senderLocation": point("42.5,70.01"), "message": " can't stand motorola the
touch-screen is terrible" }, { "messageId": 11, "authorId": 1, "inResponseTo":
1, "senderLocation": point("38.97,77.49"), "message": " can't stand at&t its
plan is terrible" }, { "messageId": 2, "authorId": 1, "inResponseTo": 4,
"senderLocation": point("41.66,80.87"), "message": " dislike iphone its
touch-screen is horrible" }, { "messageId": 4, "authorId": 1, "inResponseTo":
2, "senderLocation": point("37.73,97.04"), "message": " can't stand at&t the
network is horrible:(" } ], "uname": "MargaritaStoddard" },
- { "messages": [ { "messageId": 6, "authorId": 2, "inResponseTo": 1,
"senderLocation": point("31.5,75.56"), "message": " like t-mobile its platform
is mind-blowing" }, { "messageId": 3, "authorId": 2, "inResponseTo": 4,
"senderLocation": point("48.09,81.01"), "message": " like samsung the plan is
amazing" } ], "uname": "IsbelDull" }
- ]
+ [ {
+ "uname": "MargaritaStoddard",
+ "messages": [
+ {
+ "senderLocation": [
+ 38.97,
+ 77.49
+ ],
+ "inResponseTo": 1,
+ "messageId": 11,
+ "authorId": 1,
+ "message": " can't stand at&t its plan
is terrible"
+ },
+ {
+ "senderLocation": [
+ 41.66,
+ 80.87
+ ],
+ "inResponseTo": 4,
+ "messageId": 2,
+ "authorId": 1,
+ "message": " dislike iphone its
touch-screen is horrible"
+ },
+ {
+ "senderLocation": [
+ 37.73,
+ 97.04
+ ],
+ "inResponseTo": 2,
+ "messageId": 4,
+ "authorId": 1,
+ "message": " can't stand at&t the
network is horrible:("
+ },
+ {
+ "senderLocation": [
+ 40.33,
+ 80.87
+ ],
+ "inResponseTo": 11,
+ "messageId": 8,
+ "authorId": 1,
+ "message": " like verizon the 3G is
awesome:)"
+ },
+ {
+ "senderLocation": [
+ 42.5,
+ 70.01
+ ],
+ "inResponseTo": 12,
+ "messageId": 10,
+ "authorId": 1,
+ "message": " can't stand motorola the
touch-screen is terrible"
+ }
+ ]
+ }, {
+ "uname": "IsbelDull",
+ "messages": [
+ {
+ "senderLocation": [
+ 31.5,
+ 75.56
+ ],
+ "inResponseTo": 1,
+ "messageId": 6,
+ "authorId": 2,
+ "message": " like t-mobile its platform
is mind-blowing"
+ },
+ {
+ "senderLocation": [
+ 48.09,
+ 81.01
+ ],
+ "inResponseTo": 4,
+ "messageId": 3,
+ "authorId": 2,
+ "message": " like samsung the plan is
amazing"
+ }
+ ]
+ } ]
This query is equivalent to the following query that does not use the `LET`
clause:
@@ -839,10 +1404,11 @@
This query returns:
[
- " like t-mobile its platform is mind-blowing",
- " like samsung the plan is amazing",
- { "uname": "IsbelDull" }
- ]
+ " like t-mobile its platform is mind-blowing"
+ , {
+ "uname": "IsbelDull"
+ }, " like samsung the plan is amazing"
+ ]
## <a id="Subqueries">Subqueries</a>
In SQL++, an arbitrary subquery can appear anywhere that an expression can
appear.
@@ -865,10 +1431,26 @@
For our sample data set, this query returns:
- [
- { "uid": 1, "msgs": [ { "messageId": 2, "authorId": 1, "inResponseTo":
4, "senderLocation": point("41.66,80.87"), "message": " dislike iphone its
touch-screen is horrible" } ] },
- { "uid": 2, "msgs": [ ] }
- ]
+ [ {
+ "msgs": [
+ {
+ "senderLocation": [
+ 41.66,
+ 80.87
+ ],
+ "inResponseTo": 4,
+ "messageId": 2,
+ "authorId": 1,
+ "message": " dislike iphone its
touch-screen is horrible"
+ }
+ ],
+ "uid": 1
+ }, {
+ "msgs": [
+
+ ],
+ "uid": 2
+ } ]
Note that a subquery, like a top-level `SELECT` statment, always returns a
collection -- regardless of where
within a query the subquery occurs -- and again, its result is never
automatically cast into a scalar.
--
To view, visit https://asterix-gerrit.ics.uci.edu/1287
To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: Ifaba037b023e76b90a0520751b2914757ec191cf
Gerrit-PatchSet: 1
Gerrit-Project: asterixdb
Gerrit-Branch: master
Gerrit-Owner: Yingyi Bu <[email protected]>