/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
Sorting scalars:
----------------

String order:
- aardvark
- Barbara
- beetroot
- whale
- zeppelin

First: aardvark
Last: zeppelin
Size 5

Numerical order:
- -324
- -34
- 0
- 0.1
- 0.11
- 1
- 5
- 111
- 123
- 543

First: -324
Last: 543
Size 10

Date/time order:
- 06:05
- 08:05
- 08:15
- 18:00

Boolean order:
- false
- false
- true
- true


Sorting hashes:
---------------

Order by name:
- aardvark: 30
- Barbara: 53
- beetroot: 0.3
- whale: 2000
- zeppelin: -200

Order by weight:
- zeppelin: -200
- beetroot: 0.3
- aardvark: 30
- Barbara: 53
- whale: 2000

Order by a.x.v:
- aqweqw
- dfgdf
- qweqw
- utyu

Order by a.y, which is a date:
- 1998-02-20
- 1999-01-20
- 1999-04-19
- 1999-04-20

Reverse:
--------

Order by weight desc:
- whale: 2000
- Barbara: 53
- aardvark: 30
- beetroot: 0.3
- zeppelin: -200

Order by weight desc desc:
- zeppelin: -200
- beetroot: 0.3
- aardvark: 30
- Barbara: 53
- whale: 2000

Order by weight desc desc desc:
- whale: 2000
- Barbara: 53
- aardvark: 30
- beetroot: 0.3
- zeppelin: -200

Contains:
---------

True:
true
true
true
true
true
true
true

False:
false
false
false
false
false
false
false

False: false

Index_of:
---------

0 = 0
1 = 1
2 = 2
6 = 6
0 = 0
1 = 1
2 = 2

-1 = -1
-1 = -1
-1 = -1
-1 = -1
-1 = -1
-1 = -1
-1 = -1

-1 = -1

Last_index_of:
--------------

6 = 6
1 = 1
2 = 2
7 = 7
-1 = -1
0 = 0
1 = 1
2 = 2
-1 = -1

Index_of and last_index_of with starting indices
------------------------------------------------

seq_index_of "Joe":
0 = 0
0 = 0
0 = 0
2 = 2
2 = 2
-1 = -1
-1 = -1
 
seq_last_index_of "Joe":
-1 = -1
-1 = -1
0 = 0
0 = 0
2 = 2
2 = 2
2 = 2
 
seq_index_of "Susan":
3 = 3
3 = 3
3 = 3
3 = 3
3 = 3
3 = 3
-1 = -1
 
seq_last_index_of "Susan":
-1 = -1
-1 = -1
-1 = -1
-1 = -1
-1 = -1
3 = 3
3 = 3

seq_index_of "a":
0 = 0
0 = 0
0 = 0
-1 = -1
-1 = -1
-1 = -1
-1 = -1

seq_index_of "b":
1 = 1
1 = 1
1 = 1
1 = 1
-1 = -1
-1 = -1

seq_index_of "c":
2 = 2
2 = 2
2 = 2
2 = 2
2 = 2
-1 = -1
 
seq_last_index_of "a":
-1 = -1
-1 = -1
0 = 0
0 = 0
0 = 0
0 = 0
0 = 0

seq_last_index_of "b":
-1 = -1
-1 = -1
-1 = -1
1 = 1
1 = 1
1 = 1

seq_last_index_of "c":
-1 = -1
-1 = -1
-1 = -1
-1 = -1
2 = 2
2 = 2

Sequence builtins ignoring nulls
--------------------------------

true = true
2 = 2
0 = 0

These should throw exception, but for BC they don't:
false = false
-1 = -1
-1 = -1

Sequence built-ins failing on date-type mismatch
------------------------------------------------


Chunk
-----

columns = 1, fill = NULL:
  Rows: 7
    a   <-- Columns: 1
    b   <-- Columns: 1
    c   <-- Columns: 1
    d   <-- Columns: 1
    e   <-- Columns: 1
    f   <-- Columns: 1
    g   <-- Columns: 1
  
columns = 2, fill = NULL:
  Rows: 4
    a b   <-- Columns: 2
    c d   <-- Columns: 2
    e f   <-- Columns: 2
    g   <-- Columns: 1
  
columns = 3, fill = NULL:
  Rows: 3
    a b c   <-- Columns: 3
    d e f   <-- Columns: 3
    g   <-- Columns: 1
  
columns = 4, fill = NULL:
  Rows: 2
    a b c d   <-- Columns: 4
    e f g   <-- Columns: 3
  
columns = 5, fill = NULL:
  Rows: 2
    a b c d e   <-- Columns: 5
    f g   <-- Columns: 2
  
columns = 10, fill = NULL:
  Rows: 1
    a b c d e f g   <-- Columns: 7
  
columns = 1, fill = -:
  Rows: 7
    a   <-- Columns: 1
    b   <-- Columns: 1
    c   <-- Columns: 1
    d   <-- Columns: 1
    e   <-- Columns: 1
    f   <-- Columns: 1
    g   <-- Columns: 1
  
columns = 2, fill = -:
  Rows: 4
    a b   <-- Columns: 2
    c d   <-- Columns: 2
    e f   <-- Columns: 2
    g -   <-- Columns: 2
  
columns = 3, fill = -:
  Rows: 3
    a b c   <-- Columns: 3
    d e f   <-- Columns: 3
    g - -   <-- Columns: 3
  
columns = 4, fill = -:
  Rows: 2
    a b c d   <-- Columns: 4
    e f g -   <-- Columns: 4
  
columns = 5, fill = -:
  Rows: 2
    a b c d e   <-- Columns: 5
    f g - - -   <-- Columns: 5
  
columns = 10, fill = -:
  Rows: 1
    a b c d e f g - - -   <-- Columns: 10
  
columns = 3, fill = NULL:
  Rows: 3
    1 2 3   <-- Columns: 3
    4 5 6   <-- Columns: 3
    7 8 9   <-- Columns: 3
  
columns = 3, fill = -:
  Rows: 3
    1 2 3   <-- Columns: 3
    4 5 6   <-- Columns: 3
    7 8 9   <-- Columns: 3
  
columns = 3, fill = NULL:
  Rows: 1
    1   <-- Columns: 1
  
columns = 3, fill = -:
  Rows: 1
    1 - -   <-- Columns: 3
  
columns = 3, fill = NULL:
  Rows: 0
  
columns = 3, fill = -:
  Rows: 0
  



Join
----

- 1, two, three, 4
- 
- 1, two, three, 4.
- (empty)
- a, c
- a, c
- a, c.
- 
- (empty)
- (empty)
- a, b, c.
- a, b, c.


Misc
----

First of set 1: a
First of set 2: a