//
// CSV spec for FORK command
//

simpleFork
required_capability: fork_v9

FROM employees
| FORK ( WHERE emp_no == 10001 )
       ( WHERE emp_no == 10002 )
| KEEP emp_no, _fork
| SORT emp_no
;

emp_no:integer | _fork:keyword
10001          | fork1
10002          | fork2
;

forkWithWhereSortAndLimit
required_capability: fork_v9

FROM employees
| FORK ( WHERE hire_date < "1985-03-01T00:00:00Z" | SORT first_name | LIMIT 5 )
       ( WHERE hire_date < "1988-03-01T00:00:00Z" | SORT first_name | LIMIT 5 )
| KEEP emp_no, first_name, _fork
| SORT emp_no, _fork
;

emp_no:integer | first_name:keyword | _fork:keyword
10002          | Bezalel            | fork2
10009          | Sumant             | fork1
10014          | Berni              | fork2
10048          | Florian            | fork1
10058          | Berhard            | fork2
10060          | Breannda           | fork2
10094          | Arumugam           | fork2
;

fiveFork
required_capability: fork_v9

FROM employees
| FORK ( WHERE emp_no == 10005 )
       ( WHERE emp_no == 10004 )
       ( WHERE emp_no == 10003 )
       ( WHERE emp_no == 10002 )
       ( WHERE emp_no == 10001 )
| KEEP  _fork, emp_no
| SORT _fork
;

_fork:keyword | emp_no:integer 
fork1         | 10005
fork2         | 10004
fork3         | 10003
fork4         | 10002
fork5         | 10001
;

forkWithWhereSortDescAndLimit
required_capability: fork_v9

FROM employees
| FORK ( WHERE hire_date < "1985-03-01T00:00:00Z" | SORT first_name DESC | LIMIT 2 )
       ( WHERE hire_date < "1988-03-01T00:00:00Z" | SORT first_name DESC NULLS LAST | LIMIT 2 )
| KEEP _fork, emp_no, first_name
| SORT _fork, first_name DESC
;

_fork:keyword | emp_no:integer | first_name:keyword 
fork1         | 10009          | Sumant            
fork1         | 10048          | Florian           
fork2         | 10081          | Zhongwei          
fork2         | 10087          | Xinglin
;

forkWithCommonPrefilter
required_capability: fork_v9

FROM employees
| WHERE emp_no > 10050
| FORK ( SORT emp_no ASC | LIMIT 2 )
       ( SORT emp_no DESC NULLS LAST | LIMIT 2 )
| KEEP _fork, emp_no
| SORT _fork, emp_no
;

_fork:keyword | emp_no:integer
fork1         | 10051
fork1         | 10052
fork2         | 10099
fork2         | 10100
;

forkWithSemanticSearchAndScore
required_capability: fork_v9
required_capability: semantic_text_field_caps
required_capability: metadata_score

FROM semantic_text METADATA _id, _score
| FORK ( WHERE semantic_text_field:"something" | SORT _score DESC | LIMIT 2)
       ( WHERE semantic_text_field:"something else" | SORT _score DESC | LIMIT 2)
| EVAL _score = round(_score, 4)
| SORT _fork, _score, _id
| KEEP _fork, _score, _id, semantic_text_field
;

_fork:keyword | _score:double         | _id:keyword | semantic_text_field:text
fork1         | 2.156063961865257E18  | 3           | be excellent to each other
fork1         | 5.603396578413904E18  | 2           | all we have to decide is what to do with the time that is given to us
fork2         | 2.3447541759648727E18 | 3           | be excellent to each other
fork2         | 6.093784261960139E18  | 2           | all we have to decide is what to do with the time that is given to us
;

forkWithEvals
required_capability: fork_v9

FROM employees
| FORK (WHERE emp_no == 10048 OR emp_no == 10081 | EVAL x = "abc" | EVAL y = 1)
       (WHERE emp_no == 10081 OR emp_no == 10087 | EVAL x = "def" | EVAL z = 2)
| KEEP _fork, emp_no, x, y, z
| SORT _fork, emp_no
;

_fork:keyword | emp_no:integer | x:keyword | y:integer | z:integer
fork1         | 10048          | abc       | 1         | null
fork1         | 10081          | abc       | 1         | null
fork2         | 10081          | def       | null      | 2
fork2         | 10087          | def       | null      | 2
;

forkWithStats
required_capability: fork_v9

FROM employees
| FORK (WHERE emp_no == 10048 OR emp_no == 10081)
       (WHERE emp_no == 10081 OR emp_no == 10087)
       (STATS x = COUNT(*), y = MAX(emp_no), z = MIN(emp_no))
       (STATS x = COUNT(*), y = MIN(emp_no))
| KEEP _fork, emp_no, x, y, z
| SORT _fork, emp_no
;

_fork:keyword | emp_no:integer | x:long | y:integer | z:integer
fork1         | 10048          | null   | null      | null
fork1         | 10081          | null   | null      | null
fork2         | 10081          | null   | null      | null
fork2         | 10087          | null   | null      | null
fork3         | null           | 100    | 10100     | 10001
fork4         | null           | 100    | 10001     | null
;

forkWithDissect
required_capability: fork_v9

FROM employees
| WHERE emp_no == 10048 OR emp_no == 10081
| FORK (EVAL a = CONCAT(first_name, " ", emp_no::keyword, " ", last_name)
        | DISSECT a "%{x} %{y} %{z}" )
       (EVAL b = CONCAT(last_name, " ", emp_no::keyword, " ", first_name)
        | DISSECT b "%{x} %{y} %{w}" )
| KEEP _fork, emp_no, x, y, z, w
| SORT _fork, emp_no
;

_fork:keyword | emp_no:integer | x:keyword | y:keyword | z:keyword | w:keyword
fork1         | 10048          | Florian   | 10048     | Syrotiuk  | null
fork1         | 10081          | Zhongwei  | 10081     | Rosen     | null
fork2         | 10048          | Syrotiuk  | 10048     | null      | Florian
fork2         | 10081          | Rosen     | 10081     | null      | Zhongwei
;

forkWithMixOfCommands
required_capability: fork_v9

FROM employees
| WHERE emp_no == 10048 OR emp_no == 10081
| FORK ( EVAL a = CONCAT(first_name, " ", emp_no::keyword, " ", last_name)
        | DISSECT a "%{x} %{y} %{z}"
        | EVAL y = y::keyword )
       ( STATS x = COUNT(*)::keyword, y = MAX(emp_no)::keyword, z = MIN(emp_no)::keyword )
       ( SORT emp_no ASC | LIMIT 2 | EVAL x = last_name )
       ( EVAL x = "abc" | EVAL y = "aaa" )
| KEEP _fork, emp_no, x, y, z, a
| SORT _fork, emp_no
;

_fork:keyword | emp_no:integer | x:keyword | y:keyword | z:keyword | a:keyword
fork1         | 10048          | Florian   | 10048     | Syrotiuk  | Florian 10048 Syrotiuk
fork1         | 10081          | Zhongwei  | 10081     | Rosen     | Zhongwei 10081 Rosen
fork2         | null           | 2         | 10081     | 10048     | null
fork3         | 10048          | Syrotiuk  | null      | null      | null
fork3         | 10081          | Rosen     | null      | null      | null
fork4         | 10048          | abc       | aaa       | null      | null
fork4         | 10081          | abc       | aaa       | null      | null
;

forkWithFiltersOnConstantValues
required_capability: fork_v9

FROM employees
| EVAL z = 1
| WHERE z == 1
| FORK (WHERE emp_no == 10048 OR emp_no == 10081 | WHERE z - 1 == 0)
       (WHERE emp_no == 10081 OR emp_no == 10087 | EVAL a = "x" )
       (STATS x = COUNT(*), y = MAX(emp_no), z = MIN(emp_no) | EVAL a = "y" )
       (STATS x = COUNT(*), y = MIN(emp_no))
| WHERE _fork == "fork2" OR a == "y"
| KEEP _fork, emp_no, x, y, z
| SORT _fork, emp_no
;

_fork:keyword | emp_no:integer | x:long | y:integer | z:integer
fork2         | 10081          | null   | null      | 1
fork2         | 10087          | null   | null      | 1
fork3         | null           | 100    | 10100     | 10001
;

forkWithUnsupportedAttributes
required_capability: fork_v9

FROM heights
| FORK (SORT description DESC | LIMIT 1 | EVAL x = length(description) )
       (SORT description ASC | LIMIT 1)
| SORT _fork
;

description:keyword | height_range:unsupported | x:integer | _fork:keyword
Very Tall           | null                     | 9         | fork1
Medium Height       | null                     | null      | fork2
;

forkAfterLookupJoin
required_capability: fork_v9

FROM employees
| EVAL language_code = languages
| LOOKUP JOIN languages_lookup ON language_code
| FORK (WHERE emp_no == 10048 OR emp_no == 10081)
       (WHERE emp_no == 10081 OR emp_no == 10087)
       (WHERE emp_no == 10081 | EVAL language_name = "Klingon")
| KEEP _fork, emp_no, language_code, language_name
| SORT _fork, emp_no
;

_fork:keyword | emp_no:integer | language_code:integer | language_name:keyword
fork1         | 10048          | 3                     | Spanish
fork1         | 10081          | 2                     | French
fork2         | 10081          | 2                     | French
fork2         | 10087          | 5                     | null
fork3         | 10081          | 2                     | Klingon
;

forkBeforeLookupJoin
required_capability: fork_v9

FROM employees
| EVAL language_code = languages
| FORK (WHERE emp_no == 10048 OR emp_no == 10081)
       (WHERE emp_no == 10081 OR emp_no == 10087)
       (WHERE emp_no == 10081 | EVAL language_name = "Klingon")
| LOOKUP JOIN languages_lookup ON language_code
| KEEP _fork, emp_no, language_code, language_name
| SORT _fork, emp_no
;

_fork:keyword | emp_no:integer | language_code:integer | language_name:keyword
fork1         | 10048          | 3                     | Spanish
fork1         | 10081          | 2                     | French
fork2         | 10081          | 2                     | French
fork2         | 10087          | 5                     | null
fork3         | 10081          | 2                     | French
;

forkBranchWithLookupJoin
required_capability: fork_v9

FROM employees
| EVAL language_code = languages
| FORK (WHERE emp_no == 10048 OR emp_no == 10081 | LOOKUP JOIN languages_lookup ON language_code)
       (WHERE emp_no == 10081 OR emp_no == 10087 | LOOKUP JOIN languages_lookup ON language_code)
       (WHERE emp_no == 10081 | EVAL language_name = "Klingon" | LOOKUP JOIN languages_lookup ON language_code)
| KEEP _fork, emp_no, language_code, language_name
| SORT _fork, emp_no
;

_fork:keyword | emp_no:integer | language_code:integer | language_name:keyword
fork1         | 10048          | 3                     | Spanish
fork1         | 10081          | 2                     | French
fork2         | 10081          | 2                     | French
fork2         | 10087          | 5                     | null
fork3         | 10081          | 2                     | French
;

forkBeforeStats
required_capability: fork_v9

FROM employees
| WHERE emp_no == 10048 OR emp_no == 10081
| FORK ( EVAL a = CONCAT(first_name, " ", emp_no::keyword, " ", last_name)
        | DISSECT a "%{x} %{y} %{z}"
        | EVAL y = y::keyword )
       ( STATS x = COUNT(*)::keyword, y = MAX(emp_no)::keyword, z = MIN(emp_no)::keyword )
       ( SORT emp_no ASC | LIMIT 2 | EVAL x = last_name )
       ( EVAL x = "abc" | EVAL y = "aaa" )
| STATS c = count(*), m = max(_fork)
;

c:long | m:keyword
7      | fork4
;

forkBeforeStatsWithWhere
required_capability: fork_v9

FROM employees
| WHERE emp_no == 10048 OR emp_no == 10081
| FORK ( EVAL a = CONCAT(first_name, " ", emp_no::keyword, " ", last_name)
        | DISSECT a "%{x} %{y} %{z}"
        | EVAL y = y::keyword )
       ( STATS x = COUNT(*)::keyword, y = MAX(emp_no)::keyword, z = MIN(emp_no)::keyword )
       ( SORT emp_no ASC | LIMIT 2 | EVAL x = last_name )
       ( EVAL x = "abc" | EVAL y = "aaa" )
| STATS a = count(*) WHERE _fork == "fork1",
        b = max(_fork)
;

a:long | b:keyword
2      | fork4
;

forkBeforeStatsByWithWhere
required_capability: fork_v9

FROM employees
| WHERE emp_no == 10048 OR emp_no == 10081
| FORK ( EVAL a = CONCAT(first_name, " ", emp_no::keyword, " ", last_name)
        | DISSECT a "%{x} %{y} %{z}"
        | EVAL y = y::keyword )
       ( STATS x = COUNT(*)::keyword, y = MAX(emp_no)::keyword, z = MIN(emp_no)::keyword )
       ( SORT emp_no ASC | LIMIT 2 | EVAL x = last_name )
       ( EVAL x = "abc" | EVAL y = "aaa" )
| STATS a = count(*)  WHERE emp_no > 10000,
        b = max(x) WHERE _fork == "fork1" BY _fork
| SORT _fork
;

a:long | b:keyword | _fork:keyword
2      | Zhongwei  | fork1
0      | null      | fork2
2      | null      | fork3
2      | null      | fork4
;

forkAfterDrop
required_capability: fork_v9

FROM languages
| DROP language_code
| FORK ( WHERE language_name == "English" | EVAL x = 1 )
       ( WHERE language_name != "English" )
| SORT _fork, language_name
;

language_name:keyword | x:integer | _fork:keyword
English               | 1         | fork1
French                | null      | fork2
German                | null      | fork2
Spanish               | null      | fork2
;

forkBranchWithDrop
required_capability: fork_v9

FROM languages
| FORK ( EVAL x = 1 | DROP language_code | WHERE language_name == "English" | DROP x )
       ( WHERE language_name != "English" )
| SORT _fork, language_name
| KEEP language_name, language_code, _fork
;

language_name:keyword | language_code:integer | _fork:keyword
English               | null                  | fork1
French                | 2                     | fork2
German                | 4                     | fork2
Spanish               | 3                     | fork2
;


forkBeforeDrop
required_capability: fork_v9

FROM languages
| FORK (WHERE language_code == 1 OR language_code == 2)
       (WHERE language_code == 1)
| DROP language_code
| SORT _fork, language_name
;

language_name:keyword | _fork:keyword
English               | fork1
French                | fork1
English               | fork2
;

forkBranchWithKeep
required_capability: fork_v9

FROM languages
| FORK ( WHERE language_name == "English" | KEEP language_name, language_code )
       ( WHERE language_name != "English" )
| SORT _fork, language_name
;

language_name:keyword | language_code:integer | _fork:keyword
English               | 1                     | fork1
French                | 2                     | fork2
German                | 4                     | fork2
Spanish               | 3                     | fork2
;

forkBeforeRename
required_capability: fork_v9

FROM languages
| FORK (WHERE language_code == 1 OR language_code == 2)
       (WHERE language_code == 1)
| RENAME language_code AS code
| SORT _fork, language_name
;

code:integer | language_name:keyword | _fork:keyword
1            | English               | fork1
2            | French                | fork1
1            | English               | fork2
;

forkBranchWithRenameAs
required_capability: fork_v9

FROM languages
| FORK (RENAME language_code AS code | WHERE code == 1 OR code == 2)
       (WHERE language_code == 1 | RENAME language_code AS x)
| SORT _fork, language_name
| KEEP code, language_name, x, _fork
;

code:integer | language_name:keyword | x:integer | _fork:keyword
1            | English               | null      | fork1
2            | French                | null      | fork1
null         | English               | 1         | fork2
;

forkBranchWithRenameEquals
required_capability: fork_v9

FROM languages
| FORK (RENAME code = language_code | WHERE code == 1 OR code == 2)
       (WHERE language_code == 1 | RENAME x = language_code)
| SORT _fork, language_name
| KEEP code, language_name, x, _fork
;

code:integer | language_name:keyword | x:integer | _fork:keyword
1            | English               | null      | fork1
2            | French                | null      | fork1
null         | English               | 1         | fork2
;


forkAfterRename
required_capability: fork_v9

FROM languages
| RENAME language_code AS code
| FORK (WHERE code == 1 OR code == 2)
       (WHERE code == 1)
| SORT _fork, language_name
;

code:integer | language_name:keyword | _fork:keyword
1            | English               | fork1
2            | French                | fork1
1            | English               | fork2
;


forkBeforeDissect
required_capability: fork_v9

FROM employees
| FORK (WHERE emp_no == 10048 OR emp_no == 10081)
       (WHERE emp_no == 10081 OR emp_no == 10087)
| EVAL x = concat(gender, " foobar")
| DISSECT x "%{a} %{b}"
| SORT _fork, emp_no
| KEEP emp_no, gender, x, a, b, _fork
;

emp_no:integer | gender:keyword | x:keyword | a:keyword | b:keyword | _fork:keyword
10048          | M              | M foobar  | M         | foobar    | fork1
10081          | M              | M foobar  | M         | foobar    | fork1
10081          | M              | M foobar  | M         | foobar    | fork2
10087          | F              | F foobar  | F         | foobar    | fork2
;

forkBranchWithDissect
required_capability: fork_v9

FROM employees
| FORK (WHERE emp_no == 10048 OR emp_no == 10081
        | EVAL x = concat(gender, " foobar")
        | DISSECT x "%{a} %{b}")
       (WHERE emp_no == 10081 OR emp_no == 10087)
| SORT _fork, emp_no
| KEEP emp_no, gender, x, a, b, _fork
;

emp_no:integer | gender:keyword | x:keyword | a:keyword | b:keyword | _fork:keyword
10048          | M              | M foobar  | M         | foobar    | fork1
10081          | M              | M foobar  | M         | foobar    | fork1
10081          | M              | null      | null      | null      | fork2
10087          | F              | null      | null      | null      | fork2
;

forkAfterDissect
required_capability: fork_v9

FROM employees
| EVAL x = concat(gender, " foobar")
| DISSECT x "%{a} %{b}"
| FORK (WHERE emp_no == 10048 OR emp_no == 10081)
       (WHERE emp_no == 10081 OR emp_no == 10087)
| SORT _fork, emp_no
| KEEP emp_no, gender, x, a, b, _fork
;

emp_no:integer | gender:keyword | x:keyword | a:keyword | b:keyword | _fork:keyword
10048          | M              | M foobar  | M         | foobar    | fork1
10081          | M              | M foobar  | M         | foobar    | fork1
10081          | M              | M foobar  | M         | foobar    | fork2
10087          | F              | F foobar  | F         | foobar    | fork2
;

forkAfterEnrich
required_capability: fork_v9

FROM addresses
| KEEP city.country.continent.planet.name, city.country.name, city.name
| EVAL city.name = REPLACE(city.name, "San Francisco", "South San Francisco")
| ENRICH city_names ON city.name WITH city.country.continent.planet.name = airport
| FORK (WHERE city.name != "Amsterdam")
       (WHERE city.country.name == "Japan")
| SORT _fork, city.name
;

city.country.name:keyword | city.name:keyword   | city.country.continent.planet.name:text | _fork:keyword
United States of America  | South San Francisco | San Francisco Int'l                     | fork1
Japan                     | Tokyo               | null                                    | fork1
Japan                     | Tokyo               | null                                    | fork2
;
    
forkBranchWithEnrich
required_capability: fork_v9

FROM addresses
| KEEP city.country.continent.planet.name, city.country.name, city.name
| EVAL city.name = REPLACE(city.name, "San Francisco", "South San Francisco")
| FORK (ENRICH city_names ON city.name WITH city.country.continent.planet.name = airport)
       (ENRICH city_names ON city.name WITH city.country.continent.planet.name = airport)
| SORT _fork, city.name
;

city.country.name:keyword | city.name:keyword   | city.country.continent.planet.name:text | _fork:keyword
Netherlands               | Amsterdam           | null                                    | fork1
United States of America  | South San Francisco | San Francisco Int'l                     | fork1
Japan                     | Tokyo               | null                                    | fork1
Netherlands               | Amsterdam           | null                                    | fork2
United States of America  | South San Francisco | San Francisco Int'l                     | fork2
Japan                     | Tokyo               | null                                    | fork2
;

forkBeforeEnrich
required_capability: fork_v9

FROM addresses
| KEEP city.country.continent.planet.name, city.country.name, city.name
| EVAL city.name = REPLACE(city.name, "San Francisco", "South San Francisco")
| FORK (WHERE city.country.name == "Netherlands")
       (WHERE city.country.name != "Japan")
| ENRICH city_names ON city.name WITH city.country.continent.planet.name = airport
| SORT _fork, city.name
;

city.country.name:keyword | city.name:keyword   | _fork:keyword | city.country.continent.planet.name:text
Netherlands               | Amsterdam           | fork1         | null
Netherlands               | Amsterdam           | fork2         | null
United States of America  | South San Francisco | fork2         | San Francisco Int'l
;

forkBeforeMvExpand
required_capability: fork_v9

FROM employees
| KEEP emp_no, job_positions
| FORK (WHERE emp_no == 10048 OR emp_no == 10081)
       (WHERE emp_no == 10081 OR emp_no == 10087)
| MV_EXPAND job_positions
| SORT _fork, emp_no, job_positions
;

emp_no:integer | job_positions:keyword | _fork:keyword
10048          | Internship            | fork1
10081          | Accountant            | fork1
10081          | Internship            | fork1
10081          | Accountant            | fork2
10081          | Internship            | fork2
10087          | Internship            | fork2
10087          | Junior Developer      | fork2
;

forkBranchWithMvExpand
required_capability: fork_v9

FROM employees
| KEEP emp_no, job_positions
| FORK (WHERE emp_no == 10048 OR emp_no == 10081 | MV_EXPAND job_positions)
       (WHERE emp_no == 10081 OR emp_no == 10087)
| SORT _fork, emp_no, job_positions
;

emp_no:integer | job_positions:keyword          | _fork:keyword
10048          | Internship                     | fork1
10081          | Accountant                     | fork1
10081          | Internship                     | fork1
10081          | [Accountant, Internship]       | fork2
10087          | [Internship, Junior Developer] | fork2
;

forkAfterMvExpand
required_capability: fork_v9

FROM employees
| KEEP emp_no, job_positions
| MV_EXPAND job_positions
| FORK (WHERE emp_no == 10048 OR emp_no == 10081)
       (WHERE emp_no == 10081 OR emp_no == 10087)
| SORT _fork, emp_no, job_positions
;

emp_no:integer | job_positions:keyword | _fork:keyword
10048          | Internship            | fork1
10081          | Accountant            | fork1
10081          | Internship            | fork1
10081          | Accountant            | fork2
10081          | Internship            | fork2
10087          | Internship            | fork2
10087          | Junior Developer      | fork2
;

// INLINESTATS is under development, we enable this once it will be available
forkBeforeInlineStats-Ignore
required_capability: fork_v9

FROM employees
| KEEP emp_no, languages, gender
| FORK (WHERE emp_no == 10048 OR emp_no == 10081)
       (WHERE emp_no == 10081 OR emp_no == 10087)
| INLINESTATS max_lang = MAX(languages) BY gender 
| SORT emp_no, gender, _fork
| LIMIT 5
;

emp_no:integer | languages:integer | _fork:keyword | max_lang:integer | gender:keyword
1 | 2 | 3 | 4 | 5
;

// INLINESTATS is under development, we enable this once it will be available
forkBranchWithInlineStats-Ignore
required_capability: fork_v9

FROM employees
| KEEP emp_no, languages, gender
| FORK (WHERE emp_no == 10048 OR emp_no == 10081
        | INLINESTATS x = MAX(languages) BY gender)
       (WHERE emp_no == 10081 OR emp_no == 10087
        | INLINESTATS x = MIN(languages))
        (WHERE emp_no == 10012 OR emp_no == 10012)
| SORT emp_no, gender, _fork
;

emp_no:integer | languages:integer | x:integer | gender:keyword | _fork:keyword
10012          | 5                 | null      | null           | fork3
10048          | 3                 | 3         | M              | fork1
10081          | 2                 | 3         | M              | fork1
10081          | 2                 | 2         | M              | fork2
10087          | 5                 | 2         | F              | fork2
;

// INLINESTATS is under development, we enable this once it will be available
forkAfterInlineStats-Ignore
required_capability: fork_v9

FROM employees
| KEEP emp_no, languages, gender
| INLINESTATS max_lang = MAX(languages) BY gender 
| FORK (WHERE emp_no == 10048 OR emp_no == 10081)
       (WHERE emp_no == 10081 OR emp_no == 10087)
| SORT emp_no, gender, _fork
;

emp_no:integer | languages:integer | max_lang:integer | gender:keyword | _fork:keyword
10048          | 3                 | 5                | M              | fork1
10081          | 2                 | 5                | M              | fork1
10081          | 2                 | 5                | M              | fork2
10087          | 5                 | 5                | F              | fork2
;

forkBeforeChangePoint
required_capability: fork_v9

FROM employees
| KEEP emp_no, salary
| EVAL salary=CASE(emp_no==10042, 1000000, salary)
| FORK (WHERE emp_no > 10100)
       (WHERE emp_no <= 10100)
| CHANGE_POINT salary ON emp_no
| STATS COUNT() by type
| SORT type
;

COUNT():long | type:keyword
1            | spike
99           | null
;

forkBranchWithChangePoint
required_capability: fork_v9

FROM employees
| KEEP emp_no, salary
| FORK (EVAL salary=CASE(emp_no==10042, 1000000, salary)
        | CHANGE_POINT salary ON emp_no)
       (EVAL salary=CASE(emp_no==10087, 1000000, salary)
        | CHANGE_POINT salary ON emp_no)
| STATS COUNT() by type, _fork
| SORT _fork, type
;

COUNT():long | type:keyword | _fork:keyword
1            | spike        | fork1
99           | null         | fork1
1            | spike        | fork2
99           | null         | fork2
;

forkAfterChangePoint
required_capability: fork_v9

FROM employees
| KEEP emp_no, salary
| EVAL salary = CASE(emp_no==10042, 1000000, salary)
| CHANGE_POINT salary ON emp_no
| FORK (STATS a = COUNT() by type)
       (STATS b = VALUES(type))
| SORT _fork, a, type, b
;

a:long | type:keyword | _fork:keyword | b:keyword
1      | spike        | fork1         | null
99     | null         | fork1         | null
null   | null         | fork2         | spike
;

forkBeforeCompletion
required_capability: fork_v9
required_capability: completion

FROM employees
| KEEP emp_no, first_name, last_name
| FORK (WHERE emp_no == 10048 OR emp_no == 10081)
       (WHERE emp_no == 10081 OR emp_no == 10087)
| COMPLETION x = CONCAT(first_name, " ", last_name) WITH test_completion
| SORT _fork, emp_no
;

emp_no:integer | first_name:keyword | last_name:keyword | _fork:keyword | x:keyword
10048          | Florian            | Syrotiuk          | fork1         | FLORIAN SYROTIUK
10081          | Zhongwei           | Rosen             | fork1         | ZHONGWEI ROSEN
10081          | Zhongwei           | Rosen             | fork2         | ZHONGWEI ROSEN
10087          | Xinglin            | Eugenio           | fork2         | XINGLIN EUGENIO
;

forkBranchWithCompletion
required_capability: fork_v9
required_capability: completion

FROM employees
| KEEP emp_no, first_name, last_name
| FORK (WHERE emp_no == 10048 OR emp_no == 10081
       | COMPLETION x = CONCAT(first_name, " ", last_name) WITH test_completion)
       (WHERE emp_no == 10081 OR emp_no == 10087)
| SORT _fork, emp_no
;

emp_no:integer | first_name:keyword | last_name:keyword | x:keyword        | _fork:keyword
10048          | Florian            | Syrotiuk          | FLORIAN SYROTIUK | fork1
10081          | Zhongwei           | Rosen             | ZHONGWEI ROSEN   | fork1
10081          | Zhongwei           | Rosen             | null             | fork2
10087          | Xinglin            | Eugenio           | null             | fork2
;

forkAfterCompletion
required_capability: fork_v9
required_capability: completion

FROM employees
| KEEP emp_no, first_name, last_name
| COMPLETION x = CONCAT(first_name, " ", last_name) WITH test_completion
| FORK (WHERE emp_no == 10048 OR emp_no == 10081)
       (WHERE emp_no == 10081 OR emp_no == 10087)
| SORT _fork, emp_no
;

emp_no:integer | first_name:keyword | last_name:keyword | x:keyword        | _fork:keyword
10048          | Florian            | Syrotiuk          | FLORIAN SYROTIUK | fork1
10081          | Zhongwei           | Rosen             | ZHONGWEI ROSEN   | fork1
10081          | Zhongwei           | Rosen             | ZHONGWEI ROSEN   | fork2
10087          | Xinglin            | Eugenio           | XINGLIN EUGENIO  | fork2
;

forkAfterGrok
required_capability: fork_v9

FROM employees
| EVAL x = concat(gender, " foobar")
| GROK x "%{WORD:a} %{WORD:b}"
| FORK (WHERE emp_no == 10048 OR emp_no == 10081)
       (WHERE emp_no == 10081 OR emp_no == 10087)
| SORT _fork, emp_no
| KEEP emp_no, gender, x, a, b, _fork
;

emp_no:integer | gender:keyword | x:keyword | a:keyword | b:keyword | _fork:keyword
10048          | M              | M foobar  | M         | foobar    | fork1
10081          | M              | M foobar  | M         | foobar    | fork1
10081          | M              | M foobar  | M         | foobar    | fork2
10087          | F              | F foobar  | F         | foobar    | fork2
;

forkBranchWithGrok
required_capability: fork_v9

FROM employees
| WHERE emp_no == 10048 OR emp_no == 10081
| FORK (EVAL a = CONCAT(first_name, " ", emp_no::keyword, " ", last_name)
        | GROK a "%{WORD:x} %{WORD:y} %{WORD:z}" )
       (EVAL b = CONCAT(last_name, " ", emp_no::keyword, " ", first_name)
        | GROK b "%{WORD:x} %{WORD:y} %{WORD:z}" )
| KEEP _fork, emp_no, x, y, z
| SORT _fork, emp_no
;

_fork:keyword | emp_no:integer | x:keyword | y:keyword | z:keyword
fork1         | 10048          | Florian   | 10048     | Syrotiuk
fork1         | 10081          | Zhongwei  | 10081     | Rosen
fork2         | 10048          | Syrotiuk  | 10048     | Florian
fork2         | 10081          | Rosen     | 10081     | Zhongwei
;

forkBeforeGrok
required_capability: fork_v9

FROM employees
| FORK (WHERE emp_no == 10048 OR emp_no == 10081)
       (WHERE emp_no == 10081 OR emp_no == 10087)
| EVAL x = concat(gender, " foobar")
| GROK x "%{WORD:a} %{WORD:b}"
| SORT _fork, emp_no
| KEEP emp_no, gender, x, a, b, _fork
;

emp_no:integer | gender:keyword | x:keyword | a:keyword | b:keyword | _fork:keyword
10048          | M              | M foobar  | M         | foobar    | fork1
10081          | M              | M foobar  | M         | foobar    | fork1
10081          | M              | M foobar  | M         | foobar    | fork2
10087          | F              | F foobar  | F         | foobar    | fork2
;
