[
https://issues.apache.org/jira/browse/ASTERIXDB-2808?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Gift Sinthong updated ASTERIXDB-2808:
-------------------------------------
Description:
Here is a highly nested query that drops attributes, appends attributes, and
applies a Python UDF. It took *2.928 sec*. to return the result.
{code:java}
SELECT VALUE SF_CRIMES.getResolution(t) FROM (SELECT VALUE OBJECT_REMOVE(t,
'resolved') FROM (SELECT VALUE OBJECT_REMOVE(t, 'time') FROM (SELECT VALUE
OBJECT_REMOVE(t, 'date') FROM (SELECT VALUE OBJECT_REMOVE(t, 'pdDistrict') FROM
(SELECT VALUE OBJECT_REMOVE(t, 'resolution') FROM (SELECT VALUE
OBJECT_REMOVE(t, 'dayOfWeek') FROM (SELECT VALUE OBJECT_REMOVE(t, 'category')
FROM (SELECT VALUE OBJECT_REMOVE(t, 'pdId') FROM (SELECT t.*,
to_number(resolution != "NONE") AS `resolved` FROM (SELECT t.*,
get_hour(parse_time(time, "hh:mm")) AS `hour` FROM (SELECT t.*,
get_month(parse_date(date, "MM/DD/YYYY")) AS `month` FROM (SELECT t.*,
to_number(category = "VEHICLE THEFT") AS `VEHICLE THEFT`, to_number(category =
"WARRANTS") AS `WARRANTS`, to_number(category = "WEAPON LAWS") AS `WEAPON
LAWS`, to_number(category = "DRUG/NARCOTIC") AS `DRUG/NARCOTIC`,
to_number(category = "SEX OFFENSES, FORCIBLE") AS `SEX OFFENSES, FORCIBLE`,
to_number(category = "FORGERY/COUNTERFEITING") AS `FORGERY/COUNTERFEITING`,
to_number(category = "MISSING PERSON") AS `MISSING PERSON`, to_number(category
= "VANDALISM") AS `VANDALISM`, to_number(category = "DRUNKENNESS") AS
`DRUNKENNESS`, to_number(category = "STOLEN PROPERTY") AS `STOLEN PROPERTY`,
to_number(category = "SUSPICIOUS OCC") AS `SUSPICIOUS OCC`, to_number(category
= "DISORDERLY CONDUCT") AS `DISORDERLY CONDUCT`, to_number(category =
"NON-CRIMINAL") AS `NON-CRIMINAL`, to_number(category = "TRESPASS") AS
`TRESPASS`, to_number(category = "FRAUD") AS `FRAUD`, to_number(category =
"LARCENY/THEFT") AS `LARCENY/THEFT`, to_number(category = "OTHER OFFENSES") AS
`OTHER OFFENSES`, to_number(category = "ROBBERY") AS `ROBBERY`,
to_number(category = "ASSAULT") AS `ASSAULT`, to_number(category = "BURGLARY")
AS `BURGLARY`, to_number(category = "KIDNAPPING") AS `KIDNAPPING`,
to_number(category = "PROSTITUTION") AS `PROSTITUTION`, to_number(category =
"SECONDARY CODES") AS `SECONDARY CODES`, to_number(pdDistrict = "TENDERLOIN")
AS `TENDERLOIN`, to_number(pdDistrict = "MISSION") AS `MISSION`,
to_number(pdDistrict = "SOUTHERN") AS `SOUTHERN`, to_number(pdDistrict =
"PARK") AS `PARK`, to_number(pdDistrict = "TARAVAL") AS `TARAVAL`,
to_number(pdDistrict = "BAYVIEW") AS `BAYVIEW`, to_number(pdDistrict =
"RICHMOND") AS `RICHMOND`, to_number(pdDistrict = "CENTRAL") AS `CENTRAL`,
to_number(pdDistrict = "INGLESIDE") AS `INGLESIDE`, to_number(pdDistrict =
"NORTHERN") AS `NORTHERN`, to_number(dayOfWeek = "Tuesday") AS `Tuesday`,
to_number(dayOfWeek = "Monday") AS `Monday`, to_number(dayOfWeek = "Sunday") AS
`Sunday`, to_number(dayOfWeek = "Wednesday") AS `Wednesday`,
to_number(dayOfWeek = "Saturday") AS `Saturday`, to_number(dayOfWeek =
"Friday") AS `Friday`, to_number(dayOfWeek = "Thursday") AS `Thursday` FROM
(SELECT VALUE OBJECT_REMOVE(t, 'id') FROM (SELECT VALUE OBJECT_REMOVE(t,
'location') FROM (SELECT VALUE OBJECT_REMOVE(t, 'incidntNum') FROM (SELECT
VALUE OBJECT_REMOVE(t, 'description') FROM (SELECT VALUE OBJECT_REMOVE(t,
'address') FROM (SELECT VALUE t FROM SF_CRIMES.Crimes AS t WHERE
t.pdId=18600000506244) t) t) t) t) t) t) t) t) t) t) t) t) t) t) t) t) t) t;
{code}
Here is the resulting query plan.
{code:java}
distribute result [$$392]
-- DISTRIBUTE_RESULT |PARTITIONED|
exchange
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
project ([$$392])
-- STREAM_PROJECT |PARTITIONED|
assign [$$392] <-
[getResolution(cast(object-remove(object-remove(object-remove(object-remove(object-remove(object-remove(object-remove(object-remove(object-concat-strict(if-missing-or-null(to-object(object-concat-strict(if-missing-or-null(to-object($$439),
cast($$427)), {"hour": get-hour(parse-time($$439.getField("time"),
"hh:mm"))})), cast($$427)), {"resolved":
to-number(neq(object-concat-strict(if-missing-or-null(to-object($$439),
cast($$427)), {"hour": get-hour(parse-time($$439.getField("time"),
"hh:mm"))}).getField("resolution"), "NONE"))}), "pdId"), "category"),
"dayOfWeek"), "resolution"), "pdDistrict"), "date"), "time"), "resolved")))]
-- ASSIGN |PARTITIONED|
project ([$$427, $$439])
-- STREAM_PROJECT |PARTITIONED|
assign [$$439] <-
[object-concat-strict(if-missing-or-null(to-object($$438), cast($$427)),
{"month": get-month(parse-date($$438.getField("date"), "MM/DD/YYYY"))})]
-- ASSIGN |PARTITIONED|
project ([$$427, $$438])
-- STREAM_PROJECT |PARTITIONED|
assign [$$438] <-
[object-concat-strict(if-missing-or-null(to-object($$435), cast($$427)),
{"VEHICLE THEFT": to-number(eq($$393, "VEHICLE THEFT")), "WARRANTS":
to-number(eq($$393, "WARRANTS")), "WEAPON LAWS": to-number(eq($$393, "WEAPON
LAWS")), "DRUG/NARCOTIC": to-number(eq($$393, "DRUG/NARCOTIC")), "SEX OFFENSES,
FORCIBLE": to-number(eq($$393, "SEX OFFENSES, FORCIBLE")),
"FORGERY/COUNTERFEITING": to-number(eq($$393, "FORGERY/COUNTERFEITING")),
"MISSING PERSON": to-number(eq($$393, "MISSING PERSON")), "VANDALISM":
to-number(eq($$393, "VANDALISM")), "DRUNKENNESS": to-number(eq($$393,
"DRUNKENNESS")), "STOLEN PROPERTY": to-number(eq($$393, "STOLEN PROPERTY")),
"SUSPICIOUS OCC": to-number(eq($$393, "SUSPICIOUS OCC")), "DISORDERLY CONDUCT":
to-number(eq($$393, "DISORDERLY CONDUCT")), "NON-CRIMINAL": to-number(eq($$393,
"NON-CRIMINAL")), "TRESPASS": to-number(eq($$393, "TRESPASS")), "FRAUD":
to-number(eq($$393, "FRAUD")), "LARCENY/THEFT": to-number(eq($$393,
"LARCENY/THEFT")), "OTHER OFFENSES": to-number(eq($$393, "OTHER OFFENSES")),
"ROBBERY": to-number(eq($$393, "ROBBERY")), "ASSAULT": to-number(eq($$393,
"ASSAULT")), "BURGLARY": to-number(eq($$393, "BURGLARY")), "KIDNAPPING":
to-number(eq($$393, "KIDNAPPING")), "PROSTITUTION": to-number(eq($$393,
"PROSTITUTION")), "SECONDARY CODES": to-number(eq($$393, "SECONDARY CODES")),
"TENDERLOIN": to-number(eq($$394, "TENDERLOIN")), "MISSION":
to-number(eq($$394, "MISSION")), "SOUTHERN": to-number(eq($$394, "SOUTHERN")),
"PARK": to-number(eq($$394, "PARK")), "TARAVAL": to-number(eq($$394,
"TARAVAL")), "BAYVIEW": to-number(eq($$394, "BAYVIEW")), "RICHMOND":
to-number(eq($$394, "RICHMOND")), "CENTRAL": to-number(eq($$394, "CENTRAL")),
"INGLESIDE": to-number(eq($$394, "INGLESIDE")), "NORTHERN": to-number(eq($$394,
"NORTHERN")), "Tuesday": to-number(eq($$395, "Tuesday")), "Monday":
to-number(eq($$395, "Monday")), "Sunday": to-number(eq($$395, "Sunday")),
"Wednesday": to-number(eq($$395, "Wednesday")), "Saturday": to-number(eq($$395,
"Saturday")), "Friday": to-number(eq($$395, "Friday")), "Thursday":
to-number(eq($$395, "Thursday"))})]
-- ASSIGN |PARTITIONED|
assign [$$427, $$395, $$394, $$393] <- [{ },
$$435.getField("dayOfWeek"), $$435.getField("pdDistrict"),
$$435.getField("category")]
-- ASSIGN |PARTITIONED|
project ([$$435])
-- STREAM_PROJECT |PARTITIONED|
assign [$$435] <-
[object-remove(object-remove(object-remove(object-remove(object-remove($$t,
"address"), "description"), "incidntNum"), "location"), "id")]
-- ASSIGN |PARTITIONED|
project ([$$t])
-- STREAM_PROJECT |PARTITIONED|
exchange
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
unnest-map [$$396, $$t] <- index-search("Crimes", 0,
"SF_CRIMES", "Crimes", FALSE, FALSE, 1, $$442, 1, $$443, TRUE, TRUE, TRUE)
-- BTREE_SEARCH |PARTITIONED|
exchange
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
assign [$$442, $$443] <- [18600000506244,
18600000506244]
-- ASSIGN |PARTITIONED|
empty-tuple-source
-- EMPTY_TUPLE_SOURCE |PARTITIONED|
{code}
However, when putting the query into a function (called 'is_resolvable') and
passing in the same record (pdId = 18600000506244), it took *6.895 sec*. to
return the result and *5.654 sec*. just to generate the query plan. The query
is listed below along with its query plan.
{code:java}
SELECT is_resolvable(t) FROM (SELECT VALUE c FROM Crimes c WHERE
c.pdId=18600000506244) t;
{code}
{code:java}
distribute result [$$438]
-- DISTRIBUTE_RESULT |PARTITIONED|
exchange
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
project ([$$438])
-- STREAM_PROJECT |PARTITIONED|
assign [$$438] <- [{"$1": get-item($$436, 0)}]
-- ASSIGN |PARTITIONED|
project ([$$436])
-- STREAM_PROJECT |PARTITIONED|
subplan {
aggregate [$$436] <- [listify($$435)]
-- AGGREGATE |LOCAL|
assign [$$435] <-
[getResolution(cast(object-remove(object-remove(object-remove(object-remove(object-remove(object-remove(object-remove(object-remove(object-concat-strict(if-missing-or-null(to-object($$466),
cast($$453)), {"resolved": to-number(neq($$446, "NONE"))}), "pdId"),
"category"), "dayOfWeek"), "resolution"), "pdDistrict"), "date"), "time"),
"resolved")))]
-- ASSIGN |LOCAL|
assign [$$446] <- [$$466.getField("resolution")]
-- ASSIGN |LOCAL|
assign [$$466] <-
[object-concat-strict(if-missing-or-null(to-object($$465), cast($$453)),
{"hour": get-hour(parse-time($$445, "hh:mm"))})]
-- ASSIGN |LOCAL|
assign [$$445] <- [$$465.getField("time")]
-- ASSIGN |LOCAL|
assign [$$465] <-
[object-concat-strict(if-missing-or-null(to-object($$464), cast($$453)),
{"month": get-month(parse-date($$444, "MM/DD/YYYY"))})]
-- ASSIGN |LOCAL|
assign [$$444] <- [$$464.getField("date")]
-- ASSIGN |LOCAL|
assign [$$464] <-
[object-concat-strict(if-missing-or-null(to-object($$461), cast($$453)),
{"VEHICLE THEFT": to-number(eq($$439, "VEHICLE THEFT")), "WARRANTS":
to-number(eq($$439, "WARRANTS")), "WEAPON LAWS": to-number(eq($$439, "WEAPON
LAWS")), "DRUG/NARCOTIC": to-number(eq($$439, "DRUG/NARCOTIC")), "SEX OFFENSES,
FORCIBLE": to-number(eq($$439, "SEX OFFENSES, FORCIBLE")),
"FORGERY/COUNTERFEITING": to-number(eq($$439, "FORGERY/COUNTERFEITING")),
"MISSING PERSON": to-number(eq($$439, "MISSING PERSON")), "VANDALISM":
to-number(eq($$439, "VANDALISM")), "DRUNKENNESS": to-number(eq($$439,
"DRUNKENNESS")), "STOLEN PROPERTY": to-number(eq($$439, "STOLEN PROPERTY")),
"SUSPICIOUS OCC": to-number(eq($$439, "SUSPICIOUS OCC")), "DISORDERLY CONDUCT":
to-number(eq($$439, "DISORDERLY CONDUCT")), "NON-CRIMINAL": to-number(eq($$439,
"NON-CRIMINAL")), "TRESPASS": to-number(eq($$439, "TRESPASS")), "FRAUD":
to-number(eq($$439, "FRAUD")), "LARCENY/THEFT": to-number(eq($$439,
"LARCENY/THEFT")), "OTHER OFFENSES": to-number(eq($$439, "OTHER OFFENSES")),
"ROBBERY": to-number(eq($$439, "ROBBERY")), "ASSAULT": to-number(eq($$439,
"ASSAULT")), "BURGLARY": to-number(eq($$439, "BURGLARY")), "KIDNAPPING":
to-number(eq($$439, "KIDNAPPING")), "PROSTITUTION": to-number(eq($$439,
"PROSTITUTION")), "SECONDARY CODES": to-number(eq($$439, "SECONDARY CODES")),
"TENDERLOIN": to-number(eq($$440, "TENDERLOIN")), "MISSION":
to-number(eq($$440, "MISSION")), "SOUTHERN": to-number(eq($$440, "SOUTHERN")),
"PARK": to-number(eq($$440, "PARK")), "TARAVAL": to-number(eq($$440,
"TARAVAL")), "BAYVIEW": to-number(eq($$440, "BAYVIEW")), "RICHMOND":
to-number(eq($$440, "RICHMOND")), "CENTRAL": to-number(eq($$440, "CENTRAL")),
"INGLESIDE": to-number(eq($$440, "INGLESIDE")), "NORTHERN": to-number(eq($$440,
"NORTHERN")), "Tuesday": to-number(eq($$441, "Tuesday")), "Monday":
to-number(eq($$441, "Monday")), "Sunday": to-number(eq($$441, "Sunday")),
"Wednesday": to-number(eq($$441, "Wednesday")), "Saturday": to-number(eq($$441,
"Saturday")), "Friday": to-number(eq($$441, "Friday")), "Thursday":
to-number(eq($$441, "Thursday"))})]
-- ASSIGN |LOCAL|
assign [$$441, $$440, $$439] <-
[$$461.getField("dayOfWeek"), $$461.getField("pdDistrict"),
$$461.getField("category")]
-- ASSIGN |LOCAL|
assign [$$461] <-
[object-remove(object-remove(object-remove(object-remove(object-remove($$t,
"address"), "description"), "incidntNum"), "location"), "id")]
-- ASSIGN |LOCAL|
unnest $$t <- scan-collection($$237)
-- UNNEST |LOCAL|
nested tuple source
-- NESTED_TUPLE_SOURCE |LOCAL|
}
-- SUBPLAN |PARTITIONED|
project ([$$453, $$237])
-- STREAM_PROJECT |PARTITIONED|
assign [$$453, $$237] <- [{ }, to-array($$c)]
-- ASSIGN |PARTITIONED|
project ([$$c])
-- STREAM_PROJECT |PARTITIONED|
exchange
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
unnest-map [$$442, $$c] <- index-search("Crimes", 0,
"SF_CRIMES", "Crimes", FALSE, FALSE, 1, $$467, 1, $$468, TRUE, TRUE, TRUE)
-- BTREE_SEARCH |PARTITIONED|
exchange
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
assign [$$467, $$468] <- [18600000506244,
18600000506244]
-- ASSIGN |PARTITIONED|
empty-tuple-source
-- EMPTY_TUPLE_SOURCE |PARTITIONED|
{code}
Here are the SQL++ statements that I use to create the dataset, its data type,
and insert the one record used in the queries.
{code:java}
CREATE TYPE Crime_data AS CLOSED{
incidntNum: bigint,
category: string,
description : string,
dayOfWeek: string,
date: string,
time: string,
pdDistrict: string,
resolution: string,
address: string,
x:double,
y:double,
location:string,
pdId:bigint
};
CREATE DATASET Crimes(Crime_data) PRIMARY KEY pdId;
INSERT INTO Crimes(
{"incidntNum": 186000005, "category": "LARCENY/THEFT", "description": "GRAND
THEFT FROM LOCKED AUTO", "dayOfWeek": "Sunday", "date": "12/31/2017", "time":
"20:30", "pdDistrict": "CENTRAL", "resolution": "NONE", "address": "THE
EMBARCADERONORTH ST / SANSOME ST", "x": -122.4035919339672, "y":
37.80541291668366, "location": "POINT (-122.4035919339672 37.80541291668366)",
"pdId": 18600000506244 }
);
{code}
was:
Here is a highly nested query that drops attributes, appends attributes, and
applies a Python UDF. It took *2.928 sec*. to return the result.
{code:java}
SELECT VALUE SF_CRIMES.getResolution(t) FROM (SELECT VALUE OBJECT_REMOVE(t,
'resolved') FROM (SELECT VALUE OBJECT_REMOVE(t, 'time') FROM (SELECT VALUE
OBJECT_REMOVE(t, 'date') FROM (SELECT VALUE OBJECT_REMOVE(t, 'pdDistrict') FROM
(SELECT VALUE OBJECT_REMOVE(t, 'resolution') FROM (SELECT VALUE
OBJECT_REMOVE(t, 'dayOfWeek') FROM (SELECT VALUE OBJECT_REMOVE(t, 'category')
FROM (SELECT VALUE OBJECT_REMOVE(t, 'pdId') FROM (SELECT t.*,
to_number(resolution != "NONE") AS `resolved` FROM (SELECT t.*,
get_hour(parse_time(time, "hh:mm")) AS `hour` FROM (SELECT t.*,
get_month(parse_date(date, "MM/DD/YYYY")) AS `month` FROM (SELECT t.*,
to_number(category = "VEHICLE THEFT") AS `VEHICLE THEFT`, to_number(category =
"WARRANTS") AS `WARRANTS`, to_number(category = "WEAPON LAWS") AS `WEAPON
LAWS`, to_number(category = "DRUG/NARCOTIC") AS `DRUG/NARCOTIC`,
to_number(category = "SEX OFFENSES, FORCIBLE") AS `SEX OFFENSES, FORCIBLE`,
to_number(category = "FORGERY/COUNTERFEITING") AS `FORGERY/COUNTERFEITING`,
to_number(category = "MISSING PERSON") AS `MISSING PERSON`, to_number(category
= "VANDALISM") AS `VANDALISM`, to_number(category = "DRUNKENNESS") AS
`DRUNKENNESS`, to_number(category = "STOLEN PROPERTY") AS `STOLEN PROPERTY`,
to_number(category = "SUSPICIOUS OCC") AS `SUSPICIOUS OCC`, to_number(category
= "DISORDERLY CONDUCT") AS `DISORDERLY CONDUCT`, to_number(category =
"NON-CRIMINAL") AS `NON-CRIMINAL`, to_number(category = "TRESPASS") AS
`TRESPASS`, to_number(category = "FRAUD") AS `FRAUD`, to_number(category =
"LARCENY/THEFT") AS `LARCENY/THEFT`, to_number(category = "OTHER OFFENSES") AS
`OTHER OFFENSES`, to_number(category = "ROBBERY") AS `ROBBERY`,
to_number(category = "ASSAULT") AS `ASSAULT`, to_number(category = "BURGLARY")
AS `BURGLARY`, to_number(category = "KIDNAPPING") AS `KIDNAPPING`,
to_number(category = "PROSTITUTION") AS `PROSTITUTION`, to_number(category =
"SECONDARY CODES") AS `SECONDARY CODES`, to_number(pdDistrict = "TENDERLOIN")
AS `TENDERLOIN`, to_number(pdDistrict = "MISSION") AS `MISSION`,
to_number(pdDistrict = "SOUTHERN") AS `SOUTHERN`, to_number(pdDistrict =
"PARK") AS `PARK`, to_number(pdDistrict = "TARAVAL") AS `TARAVAL`,
to_number(pdDistrict = "BAYVIEW") AS `BAYVIEW`, to_number(pdDistrict =
"RICHMOND") AS `RICHMOND`, to_number(pdDistrict = "CENTRAL") AS `CENTRAL`,
to_number(pdDistrict = "INGLESIDE") AS `INGLESIDE`, to_number(pdDistrict =
"NORTHERN") AS `NORTHERN`, to_number(dayOfWeek = "Tuesday") AS `Tuesday`,
to_number(dayOfWeek = "Monday") AS `Monday`, to_number(dayOfWeek = "Sunday") AS
`Sunday`, to_number(dayOfWeek = "Wednesday") AS `Wednesday`,
to_number(dayOfWeek = "Saturday") AS `Saturday`, to_number(dayOfWeek =
"Friday") AS `Friday`, to_number(dayOfWeek = "Thursday") AS `Thursday` FROM
(SELECT VALUE OBJECT_REMOVE(t, 'id') FROM (SELECT VALUE OBJECT_REMOVE(t,
'location') FROM (SELECT VALUE OBJECT_REMOVE(t, 'incidntNum') FROM (SELECT
VALUE OBJECT_REMOVE(t, 'description') FROM (SELECT VALUE OBJECT_REMOVE(t,
'address') FROM (SELECT VALUE t FROM SF_CRIMES.Crimes AS t WHERE
t.pdId=18600000506244) t) t) t) t) t) t) t) t) t) t) t) t) t) t) t) t) t) t;
{code}
Here is the resulting query plan.
{code:java}
distribute result [$$392]
-- DISTRIBUTE_RESULT |PARTITIONED|
exchange
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
project ([$$392])
-- STREAM_PROJECT |PARTITIONED|
assign [$$392] <-
[getResolution(cast(object-remove(object-remove(object-remove(object-remove(object-remove(object-remove(object-remove(object-remove(object-concat-strict(if-missing-or-null(to-object(object-concat-strict(if-missing-or-null(to-object($$439),
cast($$427)), {"hour": get-hour(parse-time($$439.getField("time"),
"hh:mm"))})), cast($$427)), {"resolved":
to-number(neq(object-concat-strict(if-missing-or-null(to-object($$439),
cast($$427)), {"hour": get-hour(parse-time($$439.getField("time"),
"hh:mm"))}).getField("resolution"), "NONE"))}), "pdId"), "category"),
"dayOfWeek"), "resolution"), "pdDistrict"), "date"), "time"), "resolved")))]
-- ASSIGN |PARTITIONED|
project ([$$427, $$439])
-- STREAM_PROJECT |PARTITIONED|
assign [$$439] <-
[object-concat-strict(if-missing-or-null(to-object($$438), cast($$427)),
{"month": get-month(parse-date($$438.getField("date"), "MM/DD/YYYY"))})]
-- ASSIGN |PARTITIONED|
project ([$$427, $$438])
-- STREAM_PROJECT |PARTITIONED|
assign [$$438] <-
[object-concat-strict(if-missing-or-null(to-object($$435), cast($$427)),
{"VEHICLE THEFT": to-number(eq($$393, "VEHICLE THEFT")), "WARRANTS":
to-number(eq($$393, "WARRANTS")), "WEAPON LAWS": to-number(eq($$393, "WEAPON
LAWS")), "DRUG/NARCOTIC": to-number(eq($$393, "DRUG/NARCOTIC")), "SEX OFFENSES,
FORCIBLE": to-number(eq($$393, "SEX OFFENSES, FORCIBLE")),
"FORGERY/COUNTERFEITING": to-number(eq($$393, "FORGERY/COUNTERFEITING")),
"MISSING PERSON": to-number(eq($$393, "MISSING PERSON")), "VANDALISM":
to-number(eq($$393, "VANDALISM")), "DRUNKENNESS": to-number(eq($$393,
"DRUNKENNESS")), "STOLEN PROPERTY": to-number(eq($$393, "STOLEN PROPERTY")),
"SUSPICIOUS OCC": to-number(eq($$393, "SUSPICIOUS OCC")), "DISORDERLY CONDUCT":
to-number(eq($$393, "DISORDERLY CONDUCT")), "NON-CRIMINAL": to-number(eq($$393,
"NON-CRIMINAL")), "TRESPASS": to-number(eq($$393, "TRESPASS")), "FRAUD":
to-number(eq($$393, "FRAUD")), "LARCENY/THEFT": to-number(eq($$393,
"LARCENY/THEFT")), "OTHER OFFENSES": to-number(eq($$393, "OTHER OFFENSES")),
"ROBBERY": to-number(eq($$393, "ROBBERY")), "ASSAULT": to-number(eq($$393,
"ASSAULT")), "BURGLARY": to-number(eq($$393, "BURGLARY")), "KIDNAPPING":
to-number(eq($$393, "KIDNAPPING")), "PROSTITUTION": to-number(eq($$393,
"PROSTITUTION")), "SECONDARY CODES": to-number(eq($$393, "SECONDARY CODES")),
"TENDERLOIN": to-number(eq($$394, "TENDERLOIN")), "MISSION":
to-number(eq($$394, "MISSION")), "SOUTHERN": to-number(eq($$394, "SOUTHERN")),
"PARK": to-number(eq($$394, "PARK")), "TARAVAL": to-number(eq($$394,
"TARAVAL")), "BAYVIEW": to-number(eq($$394, "BAYVIEW")), "RICHMOND":
to-number(eq($$394, "RICHMOND")), "CENTRAL": to-number(eq($$394, "CENTRAL")),
"INGLESIDE": to-number(eq($$394, "INGLESIDE")), "NORTHERN": to-number(eq($$394,
"NORTHERN")), "Tuesday": to-number(eq($$395, "Tuesday")), "Monday":
to-number(eq($$395, "Monday")), "Sunday": to-number(eq($$395, "Sunday")),
"Wednesday": to-number(eq($$395, "Wednesday")), "Saturday": to-number(eq($$395,
"Saturday")), "Friday": to-number(eq($$395, "Friday")), "Thursday":
to-number(eq($$395, "Thursday"))})]
-- ASSIGN |PARTITIONED|
assign [$$427, $$395, $$394, $$393] <- [{ },
$$435.getField("dayOfWeek"), $$435.getField("pdDistrict"),
$$435.getField("category")]
-- ASSIGN |PARTITIONED|
project ([$$435])
-- STREAM_PROJECT |PARTITIONED|
assign [$$435] <-
[object-remove(object-remove(object-remove(object-remove(object-remove($$t,
"address"), "description"), "incidntNum"), "location"), "id")]
-- ASSIGN |PARTITIONED|
project ([$$t])
-- STREAM_PROJECT |PARTITIONED|
exchange
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
unnest-map [$$396, $$t] <- index-search("Crimes", 0,
"SF_CRIMES", "Crimes", FALSE, FALSE, 1, $$442, 1, $$443, TRUE, TRUE, TRUE)
-- BTREE_SEARCH |PARTITIONED|
exchange
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
assign [$$442, $$443] <- [18600000506244,
18600000506244]
-- ASSIGN |PARTITIONED|
empty-tuple-source
-- EMPTY_TUPLE_SOURCE |PARTITIONED|
{code}
However, when putting the query into a function (called 'is_resolvable') and
passing in the same record (pdId = 18600000506244), it took *6.895 sec*. to
return the result and *5.654 sec*. just to generate the query plan. The query
is listed below along with its query plan.
{code:java}
SELECT is_resolvable(t) FROM (SELECT VALUE c FROM Crimes c WHERE
c.pdId=18600000506244) t;
{code}
{code:java}
distribute result [$$438]
-- DISTRIBUTE_RESULT |PARTITIONED|
exchange
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
project ([$$438])
-- STREAM_PROJECT |PARTITIONED|
assign [$$438] <- [{"$1": get-item($$436, 0)}]
-- ASSIGN |PARTITIONED|
project ([$$436])
-- STREAM_PROJECT |PARTITIONED|
subplan {
aggregate [$$436] <- [listify($$435)]
-- AGGREGATE |LOCAL|
assign [$$435] <-
[getResolution(cast(object-remove(object-remove(object-remove(object-remove(object-remove(object-remove(object-remove(object-remove(object-concat-strict(if-missing-or-null(to-object($$466),
cast($$453)), {"resolved": to-number(neq($$446, "NONE"))}), "pdId"),
"category"), "dayOfWeek"), "resolution"), "pdDistrict"), "date"), "time"),
"resolved")))]
-- ASSIGN |LOCAL|
assign [$$446] <- [$$466.getField("resolution")]
-- ASSIGN |LOCAL|
assign [$$466] <-
[object-concat-strict(if-missing-or-null(to-object($$465), cast($$453)),
{"hour": get-hour(parse-time($$445, "hh:mm"))})]
-- ASSIGN |LOCAL|
assign [$$445] <- [$$465.getField("time")]
-- ASSIGN |LOCAL|
assign [$$465] <-
[object-concat-strict(if-missing-or-null(to-object($$464), cast($$453)),
{"month": get-month(parse-date($$444, "MM/DD/YYYY"))})]
-- ASSIGN |LOCAL|
assign [$$444] <- [$$464.getField("date")]
-- ASSIGN |LOCAL|
assign [$$464] <-
[object-concat-strict(if-missing-or-null(to-object($$461), cast($$453)),
{"VEHICLE THEFT": to-number(eq($$439, "VEHICLE THEFT")), "WARRANTS":
to-number(eq($$439, "WARRANTS")), "WEAPON LAWS": to-number(eq($$439, "WEAPON
LAWS")), "DRUG/NARCOTIC": to-number(eq($$439, "DRUG/NARCOTIC")), "SEX OFFENSES,
FORCIBLE": to-number(eq($$439, "SEX OFFENSES, FORCIBLE")),
"FORGERY/COUNTERFEITING": to-number(eq($$439, "FORGERY/COUNTERFEITING")),
"MISSING PERSON": to-number(eq($$439, "MISSING PERSON")), "VANDALISM":
to-number(eq($$439, "VANDALISM")), "DRUNKENNESS": to-number(eq($$439,
"DRUNKENNESS")), "STOLEN PROPERTY": to-number(eq($$439, "STOLEN PROPERTY")),
"SUSPICIOUS OCC": to-number(eq($$439, "SUSPICIOUS OCC")), "DISORDERLY CONDUCT":
to-number(eq($$439, "DISORDERLY CONDUCT")), "NON-CRIMINAL": to-number(eq($$439,
"NON-CRIMINAL")), "TRESPASS": to-number(eq($$439, "TRESPASS")), "FRAUD":
to-number(eq($$439, "FRAUD")), "LARCENY/THEFT": to-number(eq($$439,
"LARCENY/THEFT")), "OTHER OFFENSES": to-number(eq($$439, "OTHER OFFENSES")),
"ROBBERY": to-number(eq($$439, "ROBBERY")), "ASSAULT": to-number(eq($$439,
"ASSAULT")), "BURGLARY": to-number(eq($$439, "BURGLARY")), "KIDNAPPING":
to-number(eq($$439, "KIDNAPPING")), "PROSTITUTION": to-number(eq($$439,
"PROSTITUTION")), "SECONDARY CODES": to-number(eq($$439, "SECONDARY CODES")),
"TENDERLOIN": to-number(eq($$440, "TENDERLOIN")), "MISSION":
to-number(eq($$440, "MISSION")), "SOUTHERN": to-number(eq($$440, "SOUTHERN")),
"PARK": to-number(eq($$440, "PARK")), "TARAVAL": to-number(eq($$440,
"TARAVAL")), "BAYVIEW": to-number(eq($$440, "BAYVIEW")), "RICHMOND":
to-number(eq($$440, "RICHMOND")), "CENTRAL": to-number(eq($$440, "CENTRAL")),
"INGLESIDE": to-number(eq($$440, "INGLESIDE")), "NORTHERN": to-number(eq($$440,
"NORTHERN")), "Tuesday": to-number(eq($$441, "Tuesday")), "Monday":
to-number(eq($$441, "Monday")), "Sunday": to-number(eq($$441, "Sunday")),
"Wednesday": to-number(eq($$441, "Wednesday")), "Saturday": to-number(eq($$441,
"Saturday")), "Friday": to-number(eq($$441, "Friday")), "Thursday":
to-number(eq($$441, "Thursday"))})]
-- ASSIGN |LOCAL|
assign [$$441, $$440, $$439] <-
[$$461.getField("dayOfWeek"), $$461.getField("pdDistrict"),
$$461.getField("category")]
-- ASSIGN |LOCAL|
assign [$$461] <-
[object-remove(object-remove(object-remove(object-remove(object-remove($$t,
"address"), "description"), "incidntNum"), "location"), "id")]
-- ASSIGN |LOCAL|
unnest $$t <- scan-collection($$237)
-- UNNEST |LOCAL|
nested tuple source
-- NESTED_TUPLE_SOURCE |LOCAL|
}
-- SUBPLAN |PARTITIONED|
project ([$$453, $$237])
-- STREAM_PROJECT |PARTITIONED|
assign [$$453, $$237] <- [{ }, to-array($$c)]
-- ASSIGN |PARTITIONED|
project ([$$c])
-- STREAM_PROJECT |PARTITIONED|
exchange
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
unnest-map [$$442, $$c] <- index-search("Crimes", 0,
"SF_CRIMES", "Crimes", FALSE, FALSE, 1, $$467, 1, $$468, TRUE, TRUE, TRUE)
-- BTREE_SEARCH |PARTITIONED|
exchange
-- ONE_TO_ONE_EXCHANGE |PARTITIONED|
assign [$$467, $$468] <- [18600000506244,
18600000506244]
-- ASSIGN |PARTITIONED|
empty-tuple-source
-- EMPTY_TUPLE_SOURCE |PARTITIONED|
{code}
> Significantly increase in execution time when encapsulating a highly nested
> query in a function
> -----------------------------------------------------------------------------------------------
>
> Key: ASTERIXDB-2808
> URL: https://issues.apache.org/jira/browse/ASTERIXDB-2808
> Project: Apache AsterixDB
> Issue Type: Bug
> Components: FUN - Functions
> Affects Versions: 0.9.6
> Reporter: Gift Sinthong
> Assignee: Dmitry Lychagin
> Priority: Major
>
> Here is a highly nested query that drops attributes, appends attributes, and
> applies a Python UDF. It took *2.928 sec*. to return the result.
> {code:java}
> SELECT VALUE SF_CRIMES.getResolution(t) FROM (SELECT VALUE OBJECT_REMOVE(t,
> 'resolved') FROM (SELECT VALUE OBJECT_REMOVE(t, 'time') FROM (SELECT VALUE
> OBJECT_REMOVE(t, 'date') FROM (SELECT VALUE OBJECT_REMOVE(t, 'pdDistrict')
> FROM (SELECT VALUE OBJECT_REMOVE(t, 'resolution') FROM (SELECT VALUE
> OBJECT_REMOVE(t, 'dayOfWeek') FROM (SELECT VALUE OBJECT_REMOVE(t, 'category')
> FROM (SELECT VALUE OBJECT_REMOVE(t, 'pdId') FROM (SELECT t.*,
> to_number(resolution != "NONE") AS `resolved` FROM (SELECT t.*,
> get_hour(parse_time(time, "hh:mm")) AS `hour` FROM (SELECT t.*,
> get_month(parse_date(date, "MM/DD/YYYY")) AS `month` FROM (SELECT t.*,
> to_number(category = "VEHICLE THEFT") AS `VEHICLE THEFT`, to_number(category
> = "WARRANTS") AS `WARRANTS`, to_number(category = "WEAPON LAWS") AS `WEAPON
> LAWS`, to_number(category = "DRUG/NARCOTIC") AS `DRUG/NARCOTIC`,
> to_number(category = "SEX OFFENSES, FORCIBLE") AS `SEX OFFENSES, FORCIBLE`,
> to_number(category = "FORGERY/COUNTERFEITING") AS `FORGERY/COUNTERFEITING`,
> to_number(category = "MISSING PERSON") AS `MISSING PERSON`,
> to_number(category = "VANDALISM") AS `VANDALISM`, to_number(category =
> "DRUNKENNESS") AS `DRUNKENNESS`, to_number(category = "STOLEN PROPERTY") AS
> `STOLEN PROPERTY`, to_number(category = "SUSPICIOUS OCC") AS `SUSPICIOUS
> OCC`, to_number(category = "DISORDERLY CONDUCT") AS `DISORDERLY CONDUCT`,
> to_number(category = "NON-CRIMINAL") AS `NON-CRIMINAL`, to_number(category =
> "TRESPASS") AS `TRESPASS`, to_number(category = "FRAUD") AS `FRAUD`,
> to_number(category = "LARCENY/THEFT") AS `LARCENY/THEFT`, to_number(category
> = "OTHER OFFENSES") AS `OTHER OFFENSES`, to_number(category = "ROBBERY") AS
> `ROBBERY`, to_number(category = "ASSAULT") AS `ASSAULT`, to_number(category =
> "BURGLARY") AS `BURGLARY`, to_number(category = "KIDNAPPING") AS
> `KIDNAPPING`, to_number(category = "PROSTITUTION") AS `PROSTITUTION`,
> to_number(category = "SECONDARY CODES") AS `SECONDARY CODES`,
> to_number(pdDistrict = "TENDERLOIN") AS `TENDERLOIN`, to_number(pdDistrict =
> "MISSION") AS `MISSION`, to_number(pdDistrict = "SOUTHERN") AS `SOUTHERN`,
> to_number(pdDistrict = "PARK") AS `PARK`, to_number(pdDistrict = "TARAVAL")
> AS `TARAVAL`, to_number(pdDistrict = "BAYVIEW") AS `BAYVIEW`,
> to_number(pdDistrict = "RICHMOND") AS `RICHMOND`, to_number(pdDistrict =
> "CENTRAL") AS `CENTRAL`, to_number(pdDistrict = "INGLESIDE") AS `INGLESIDE`,
> to_number(pdDistrict = "NORTHERN") AS `NORTHERN`, to_number(dayOfWeek =
> "Tuesday") AS `Tuesday`, to_number(dayOfWeek = "Monday") AS `Monday`,
> to_number(dayOfWeek = "Sunday") AS `Sunday`, to_number(dayOfWeek =
> "Wednesday") AS `Wednesday`, to_number(dayOfWeek = "Saturday") AS `Saturday`,
> to_number(dayOfWeek = "Friday") AS `Friday`, to_number(dayOfWeek =
> "Thursday") AS `Thursday` FROM (SELECT VALUE OBJECT_REMOVE(t, 'id') FROM
> (SELECT VALUE OBJECT_REMOVE(t, 'location') FROM (SELECT VALUE
> OBJECT_REMOVE(t, 'incidntNum') FROM (SELECT VALUE OBJECT_REMOVE(t,
> 'description') FROM (SELECT VALUE OBJECT_REMOVE(t, 'address') FROM (SELECT
> VALUE t FROM SF_CRIMES.Crimes AS t WHERE t.pdId=18600000506244) t) t) t) t)
> t) t) t) t) t) t) t) t) t) t) t) t) t) t;
> {code}
> Here is the resulting query plan.
> {code:java}
> distribute result [$$392]
> -- DISTRIBUTE_RESULT |PARTITIONED|
> exchange
> -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
> project ([$$392])
> -- STREAM_PROJECT |PARTITIONED|
> assign [$$392] <-
> [getResolution(cast(object-remove(object-remove(object-remove(object-remove(object-remove(object-remove(object-remove(object-remove(object-concat-strict(if-missing-or-null(to-object(object-concat-strict(if-missing-or-null(to-object($$439),
> cast($$427)), {"hour": get-hour(parse-time($$439.getField("time"),
> "hh:mm"))})), cast($$427)), {"resolved":
> to-number(neq(object-concat-strict(if-missing-or-null(to-object($$439),
> cast($$427)), {"hour": get-hour(parse-time($$439.getField("time"),
> "hh:mm"))}).getField("resolution"), "NONE"))}), "pdId"), "category"),
> "dayOfWeek"), "resolution"), "pdDistrict"), "date"), "time"), "resolved")))]
> -- ASSIGN |PARTITIONED|
> project ([$$427, $$439])
> -- STREAM_PROJECT |PARTITIONED|
> assign [$$439] <-
> [object-concat-strict(if-missing-or-null(to-object($$438), cast($$427)),
> {"month": get-month(parse-date($$438.getField("date"), "MM/DD/YYYY"))})]
> -- ASSIGN |PARTITIONED|
> project ([$$427, $$438])
> -- STREAM_PROJECT |PARTITIONED|
> assign [$$438] <-
> [object-concat-strict(if-missing-or-null(to-object($$435), cast($$427)),
> {"VEHICLE THEFT": to-number(eq($$393, "VEHICLE THEFT")), "WARRANTS":
> to-number(eq($$393, "WARRANTS")), "WEAPON LAWS": to-number(eq($$393, "WEAPON
> LAWS")), "DRUG/NARCOTIC": to-number(eq($$393, "DRUG/NARCOTIC")), "SEX
> OFFENSES, FORCIBLE": to-number(eq($$393, "SEX OFFENSES, FORCIBLE")),
> "FORGERY/COUNTERFEITING": to-number(eq($$393, "FORGERY/COUNTERFEITING")),
> "MISSING PERSON": to-number(eq($$393, "MISSING PERSON")), "VANDALISM":
> to-number(eq($$393, "VANDALISM")), "DRUNKENNESS": to-number(eq($$393,
> "DRUNKENNESS")), "STOLEN PROPERTY": to-number(eq($$393, "STOLEN PROPERTY")),
> "SUSPICIOUS OCC": to-number(eq($$393, "SUSPICIOUS OCC")), "DISORDERLY
> CONDUCT": to-number(eq($$393, "DISORDERLY CONDUCT")), "NON-CRIMINAL":
> to-number(eq($$393, "NON-CRIMINAL")), "TRESPASS": to-number(eq($$393,
> "TRESPASS")), "FRAUD": to-number(eq($$393, "FRAUD")), "LARCENY/THEFT":
> to-number(eq($$393, "LARCENY/THEFT")), "OTHER OFFENSES": to-number(eq($$393,
> "OTHER OFFENSES")), "ROBBERY": to-number(eq($$393, "ROBBERY")), "ASSAULT":
> to-number(eq($$393, "ASSAULT")), "BURGLARY": to-number(eq($$393,
> "BURGLARY")), "KIDNAPPING": to-number(eq($$393, "KIDNAPPING")),
> "PROSTITUTION": to-number(eq($$393, "PROSTITUTION")), "SECONDARY CODES":
> to-number(eq($$393, "SECONDARY CODES")), "TENDERLOIN": to-number(eq($$394,
> "TENDERLOIN")), "MISSION": to-number(eq($$394, "MISSION")), "SOUTHERN":
> to-number(eq($$394, "SOUTHERN")), "PARK": to-number(eq($$394, "PARK")),
> "TARAVAL": to-number(eq($$394, "TARAVAL")), "BAYVIEW": to-number(eq($$394,
> "BAYVIEW")), "RICHMOND": to-number(eq($$394, "RICHMOND")), "CENTRAL":
> to-number(eq($$394, "CENTRAL")), "INGLESIDE": to-number(eq($$394,
> "INGLESIDE")), "NORTHERN": to-number(eq($$394, "NORTHERN")), "Tuesday":
> to-number(eq($$395, "Tuesday")), "Monday": to-number(eq($$395, "Monday")),
> "Sunday": to-number(eq($$395, "Sunday")), "Wednesday": to-number(eq($$395,
> "Wednesday")), "Saturday": to-number(eq($$395, "Saturday")), "Friday":
> to-number(eq($$395, "Friday")), "Thursday": to-number(eq($$395,
> "Thursday"))})]
> -- ASSIGN |PARTITIONED|
> assign [$$427, $$395, $$394, $$393] <- [{ },
> $$435.getField("dayOfWeek"), $$435.getField("pdDistrict"),
> $$435.getField("category")]
> -- ASSIGN |PARTITIONED|
> project ([$$435])
> -- STREAM_PROJECT |PARTITIONED|
> assign [$$435] <-
> [object-remove(object-remove(object-remove(object-remove(object-remove($$t,
> "address"), "description"), "incidntNum"), "location"), "id")]
> -- ASSIGN |PARTITIONED|
> project ([$$t])
> -- STREAM_PROJECT |PARTITIONED|
> exchange
> -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
> unnest-map [$$396, $$t] <- index-search("Crimes",
> 0, "SF_CRIMES", "Crimes", FALSE, FALSE, 1, $$442, 1, $$443, TRUE, TRUE, TRUE)
> -- BTREE_SEARCH |PARTITIONED|
> exchange
> -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
> assign [$$442, $$443] <- [18600000506244,
> 18600000506244]
> -- ASSIGN |PARTITIONED|
> empty-tuple-source
> -- EMPTY_TUPLE_SOURCE |PARTITIONED|
> {code}
> However, when putting the query into a function (called 'is_resolvable') and
> passing in the same record (pdId = 18600000506244), it took *6.895 sec*. to
> return the result and *5.654 sec*. just to generate the query plan. The query
> is listed below along with its query plan.
> {code:java}
> SELECT is_resolvable(t) FROM (SELECT VALUE c FROM Crimes c WHERE
> c.pdId=18600000506244) t;
> {code}
> {code:java}
> distribute result [$$438]
> -- DISTRIBUTE_RESULT |PARTITIONED|
> exchange
> -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
> project ([$$438])
> -- STREAM_PROJECT |PARTITIONED|
> assign [$$438] <- [{"$1": get-item($$436, 0)}]
> -- ASSIGN |PARTITIONED|
> project ([$$436])
> -- STREAM_PROJECT |PARTITIONED|
> subplan {
> aggregate [$$436] <- [listify($$435)]
> -- AGGREGATE |LOCAL|
> assign [$$435] <-
> [getResolution(cast(object-remove(object-remove(object-remove(object-remove(object-remove(object-remove(object-remove(object-remove(object-concat-strict(if-missing-or-null(to-object($$466),
> cast($$453)), {"resolved": to-number(neq($$446, "NONE"))}), "pdId"),
> "category"), "dayOfWeek"), "resolution"), "pdDistrict"), "date"), "time"),
> "resolved")))]
> -- ASSIGN |LOCAL|
> assign [$$446] <- [$$466.getField("resolution")]
> -- ASSIGN |LOCAL|
> assign [$$466] <-
> [object-concat-strict(if-missing-or-null(to-object($$465), cast($$453)),
> {"hour": get-hour(parse-time($$445, "hh:mm"))})]
> -- ASSIGN |LOCAL|
> assign [$$445] <- [$$465.getField("time")]
> -- ASSIGN |LOCAL|
> assign [$$465] <-
> [object-concat-strict(if-missing-or-null(to-object($$464), cast($$453)),
> {"month": get-month(parse-date($$444, "MM/DD/YYYY"))})]
> -- ASSIGN |LOCAL|
> assign [$$444] <- [$$464.getField("date")]
> -- ASSIGN |LOCAL|
> assign [$$464] <-
> [object-concat-strict(if-missing-or-null(to-object($$461), cast($$453)),
> {"VEHICLE THEFT": to-number(eq($$439, "VEHICLE THEFT")), "WARRANTS":
> to-number(eq($$439, "WARRANTS")), "WEAPON LAWS": to-number(eq($$439, "WEAPON
> LAWS")), "DRUG/NARCOTIC": to-number(eq($$439, "DRUG/NARCOTIC")), "SEX
> OFFENSES, FORCIBLE": to-number(eq($$439, "SEX OFFENSES, FORCIBLE")),
> "FORGERY/COUNTERFEITING": to-number(eq($$439, "FORGERY/COUNTERFEITING")),
> "MISSING PERSON": to-number(eq($$439, "MISSING PERSON")), "VANDALISM":
> to-number(eq($$439, "VANDALISM")), "DRUNKENNESS": to-number(eq($$439,
> "DRUNKENNESS")), "STOLEN PROPERTY": to-number(eq($$439, "STOLEN PROPERTY")),
> "SUSPICIOUS OCC": to-number(eq($$439, "SUSPICIOUS OCC")), "DISORDERLY
> CONDUCT": to-number(eq($$439, "DISORDERLY CONDUCT")), "NON-CRIMINAL":
> to-number(eq($$439, "NON-CRIMINAL")), "TRESPASS": to-number(eq($$439,
> "TRESPASS")), "FRAUD": to-number(eq($$439, "FRAUD")), "LARCENY/THEFT":
> to-number(eq($$439, "LARCENY/THEFT")), "OTHER OFFENSES": to-number(eq($$439,
> "OTHER OFFENSES")), "ROBBERY": to-number(eq($$439, "ROBBERY")), "ASSAULT":
> to-number(eq($$439, "ASSAULT")), "BURGLARY": to-number(eq($$439,
> "BURGLARY")), "KIDNAPPING": to-number(eq($$439, "KIDNAPPING")),
> "PROSTITUTION": to-number(eq($$439, "PROSTITUTION")), "SECONDARY CODES":
> to-number(eq($$439, "SECONDARY CODES")), "TENDERLOIN": to-number(eq($$440,
> "TENDERLOIN")), "MISSION": to-number(eq($$440, "MISSION")), "SOUTHERN":
> to-number(eq($$440, "SOUTHERN")), "PARK": to-number(eq($$440, "PARK")),
> "TARAVAL": to-number(eq($$440, "TARAVAL")), "BAYVIEW": to-number(eq($$440,
> "BAYVIEW")), "RICHMOND": to-number(eq($$440, "RICHMOND")), "CENTRAL":
> to-number(eq($$440, "CENTRAL")), "INGLESIDE": to-number(eq($$440,
> "INGLESIDE")), "NORTHERN": to-number(eq($$440, "NORTHERN")), "Tuesday":
> to-number(eq($$441, "Tuesday")), "Monday": to-number(eq($$441, "Monday")),
> "Sunday": to-number(eq($$441, "Sunday")), "Wednesday": to-number(eq($$441,
> "Wednesday")), "Saturday": to-number(eq($$441, "Saturday")), "Friday":
> to-number(eq($$441, "Friday")), "Thursday": to-number(eq($$441,
> "Thursday"))})]
> -- ASSIGN |LOCAL|
> assign [$$441, $$440, $$439] <-
> [$$461.getField("dayOfWeek"), $$461.getField("pdDistrict"),
> $$461.getField("category")]
> -- ASSIGN |LOCAL|
> assign [$$461] <-
> [object-remove(object-remove(object-remove(object-remove(object-remove($$t,
> "address"), "description"), "incidntNum"), "location"), "id")]
> -- ASSIGN |LOCAL|
> unnest $$t <- scan-collection($$237)
> -- UNNEST |LOCAL|
> nested tuple source
> -- NESTED_TUPLE_SOURCE |LOCAL|
> }
> -- SUBPLAN |PARTITIONED|
> project ([$$453, $$237])
> -- STREAM_PROJECT |PARTITIONED|
> assign [$$453, $$237] <- [{ }, to-array($$c)]
> -- ASSIGN |PARTITIONED|
> project ([$$c])
> -- STREAM_PROJECT |PARTITIONED|
> exchange
> -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
> unnest-map [$$442, $$c] <- index-search("Crimes", 0,
> "SF_CRIMES", "Crimes", FALSE, FALSE, 1, $$467, 1, $$468, TRUE, TRUE, TRUE)
> -- BTREE_SEARCH |PARTITIONED|
> exchange
> -- ONE_TO_ONE_EXCHANGE |PARTITIONED|
> assign [$$467, $$468] <- [18600000506244,
> 18600000506244]
> -- ASSIGN |PARTITIONED|
> empty-tuple-source
> -- EMPTY_TUPLE_SOURCE |PARTITIONED|
> {code}
>
> Here are the SQL++ statements that I use to create the dataset, its data
> type, and insert the one record used in the queries.
> {code:java}
> CREATE TYPE Crime_data AS CLOSED{
> incidntNum: bigint,
> category: string,
> description : string,
> dayOfWeek: string,
> date: string,
> time: string,
> pdDistrict: string,
> resolution: string,
> address: string,
> x:double,
> y:double,
> location:string,
> pdId:bigint
> };
> CREATE DATASET Crimes(Crime_data) PRIMARY KEY pdId;
> INSERT INTO Crimes(
> {"incidntNum": 186000005, "category": "LARCENY/THEFT", "description": "GRAND
> THEFT FROM LOCKED AUTO", "dayOfWeek": "Sunday", "date": "12/31/2017", "time":
> "20:30", "pdDistrict": "CENTRAL", "resolution": "NONE", "address": "THE
> EMBARCADERONORTH ST / SANSOME ST", "x": -122.4035919339672, "y":
> 37.80541291668366, "location": "POINT (-122.4035919339672
> 37.80541291668366)", "pdId": 18600000506244 }
> );
> {code}
>
--
This message was sent by Atlassian Jira
(v8.3.4#803005)