mirror of
https://github.com/featurebasedb/featurebase.git
synced 2026-09-05 16:15:56 +00:00
This commit refactors the pilosa codebase. It makes several major changes: * Removes bitmap handles * Removes dispatch/hold/transport * Removes etcd dependency * Adds consistent hash ring for slice placement * Refactors parser/lexer * Adds strong typing to PQL AST * Flattens package hierarchy
239 lines
5.7 KiB
Go
239 lines
5.7 KiB
Go
package pql_test
|
|
|
|
import (
|
|
"reflect"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/davecgh/go-spew/spew"
|
|
"github.com/umbel/pilosa/pql"
|
|
)
|
|
|
|
// Ensure the parser can parse a "clear()" function with keyed args.
|
|
func TestParser_Parse_Clear_Key(t *testing.T) {
|
|
q, err := pql.ParseString(`clear(id=1, frame="b.n", filter=2, profile_id = 3)`)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
} else if !reflect.DeepEqual(q, &pql.Query{
|
|
Root: &pql.Clear{
|
|
ID: 1,
|
|
Frame: "b.n",
|
|
Filter: 2,
|
|
ProfileID: 3,
|
|
},
|
|
}) {
|
|
t.Fatalf("unexpected query: %s", spew.Sdump(q))
|
|
}
|
|
}
|
|
|
|
// Ensure the parser can parse a "clear()" function with array args.
|
|
func TestParser_Parse_Clear_Array(t *testing.T) {
|
|
q, err := pql.ParseString(`clear(1, "b.n", 2, 3)`)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
} else if !reflect.DeepEqual(q, &pql.Query{
|
|
Root: &pql.Clear{
|
|
ID: 1,
|
|
Frame: "b.n",
|
|
Filter: 2,
|
|
ProfileID: 3,
|
|
},
|
|
}) {
|
|
t.Fatalf("unexpected query: %s", spew.Sdump(q))
|
|
}
|
|
}
|
|
|
|
// Ensure the parser can parse a "count()" function.
|
|
func TestParser_Parse_Count(t *testing.T) {
|
|
q, err := pql.ParseString(`count(get(1))`)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
} else if !reflect.DeepEqual(q, &pql.Query{
|
|
Root: &pql.Count{
|
|
Input: &pql.Get{
|
|
ID: 1,
|
|
},
|
|
},
|
|
}) {
|
|
t.Fatalf("unexpected query: %s", spew.Sdump(q))
|
|
}
|
|
}
|
|
|
|
// Ensure the parser can parse a "difference()" function.
|
|
func TestParser_Parse_Difference(t *testing.T) {
|
|
q, err := pql.ParseString(`difference(get(1), get(2))`)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
} else if !reflect.DeepEqual(q, &pql.Query{
|
|
Root: &pql.Difference{
|
|
Inputs: pql.BitmapCalls{
|
|
&pql.Get{ID: 1},
|
|
&pql.Get{ID: 2},
|
|
},
|
|
},
|
|
}) {
|
|
t.Fatalf("unexpected query: %s", spew.Sdump(q))
|
|
}
|
|
}
|
|
|
|
// Ensure the parser can parse a "get()" function with keyed args.
|
|
func TestParser_Parse_Get_Key(t *testing.T) {
|
|
q, err := pql.ParseString(`get(id=1, frame="b.n")`)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
} else if !reflect.DeepEqual(q, &pql.Query{
|
|
Root: &pql.Get{
|
|
ID: 1,
|
|
Frame: "b.n",
|
|
},
|
|
}) {
|
|
t.Fatalf("unexpected query: %s", spew.Sdump(q))
|
|
}
|
|
}
|
|
|
|
// Ensure the parser can parse a "get()" function with array args.
|
|
func TestParser_Parse_Get_Array(t *testing.T) {
|
|
q, err := pql.ParseString(`get(1, "b.n")`)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
} else if !reflect.DeepEqual(q, &pql.Query{
|
|
Root: &pql.Get{
|
|
ID: 1,
|
|
Frame: "b.n",
|
|
},
|
|
}) {
|
|
t.Fatalf("unexpected query: %s", spew.Sdump(q))
|
|
}
|
|
}
|
|
|
|
// Ensure the parser can parse a "intersect()" function.
|
|
func TestParser_Parse_Intersect(t *testing.T) {
|
|
q, err := pql.ParseString(`intersect(get(1), get(2))`)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
} else if !reflect.DeepEqual(q, &pql.Query{
|
|
Root: &pql.Intersect{
|
|
Inputs: pql.BitmapCalls{
|
|
&pql.Get{ID: 1},
|
|
&pql.Get{ID: 2},
|
|
},
|
|
},
|
|
}) {
|
|
t.Fatalf("unexpected query: %s", spew.Sdump(q))
|
|
}
|
|
}
|
|
|
|
// Ensure the parser can parse a "range()" function with keyed args.
|
|
func TestParser_Parse_Range_Key(t *testing.T) {
|
|
q, err := pql.ParseString(`range(start="2000-01-02T03:04", id=20, frame="b.n", end="2001-01-02T03:04")`)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
} else if !reflect.DeepEqual(q, &pql.Query{
|
|
Root: &pql.Range{
|
|
ID: 20,
|
|
Frame: "b.n",
|
|
StartTime: time.Date(2000, 1, 2, 3, 4, 0, 0, time.UTC),
|
|
EndTime: time.Date(2001, 1, 2, 3, 4, 0, 0, time.UTC),
|
|
},
|
|
}) {
|
|
t.Fatalf("unexpected query: %s", spew.Sdump(q))
|
|
}
|
|
}
|
|
|
|
// Ensure the parser can parse a "range()" function with array args.
|
|
func TestParser_Parse_Range_Array(t *testing.T) {
|
|
q, err := pql.ParseString(`range(20, "b.n", "2000-01-02T03:04", "2001-01-02T03:04")`)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
} else if !reflect.DeepEqual(q, &pql.Query{
|
|
Root: &pql.Range{
|
|
ID: 20,
|
|
Frame: "b.n",
|
|
StartTime: time.Date(2000, 1, 2, 3, 4, 0, 0, time.UTC),
|
|
EndTime: time.Date(2001, 1, 2, 3, 4, 0, 0, time.UTC),
|
|
},
|
|
}) {
|
|
t.Fatalf("unexpected query: %s", spew.Sdump(q))
|
|
}
|
|
}
|
|
|
|
// Ensure the parser can parse a "set()" function with keyed args.
|
|
func TestParser_Parse_Set_Key(t *testing.T) {
|
|
q, err := pql.ParseString(`set(id=1, frame="b.n", filter=2, profile_id = 3)`)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
} else if !reflect.DeepEqual(q, &pql.Query{
|
|
Root: &pql.Set{
|
|
ID: 1,
|
|
Frame: "b.n",
|
|
Filter: 2,
|
|
ProfileID: 3,
|
|
},
|
|
}) {
|
|
t.Fatalf("unexpected query: %s", spew.Sdump(q))
|
|
}
|
|
}
|
|
|
|
// Ensure the parser can parse a "set()" function with array args.
|
|
func TestParser_Parse_Set_Array(t *testing.T) {
|
|
q, err := pql.ParseString(`set(1, "b.n", 2, 3)`)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
} else if !reflect.DeepEqual(q, &pql.Query{
|
|
Root: &pql.Set{
|
|
ID: 1,
|
|
Frame: "b.n",
|
|
Filter: 2,
|
|
ProfileID: 3,
|
|
},
|
|
}) {
|
|
t.Fatalf("unexpected query: %s", spew.Sdump(q))
|
|
}
|
|
}
|
|
|
|
// Ensure the parser can parse a "top-n()" function with keyed args.
|
|
func TestParser_Parse_TopN_Key(t *testing.T) {
|
|
q, err := pql.ParseString(`top-n(frame="b.n", n=2)`)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
} else if !reflect.DeepEqual(q, &pql.Query{
|
|
Root: &pql.TopN{
|
|
Frame: "b.n",
|
|
N: 2,
|
|
},
|
|
}) {
|
|
t.Fatalf("unexpected query: %s", spew.Sdump(q))
|
|
}
|
|
}
|
|
|
|
// Ensure the parser can parse a "top-n()" function with array args.
|
|
func TestParser_Parse_TopN_Array(t *testing.T) {
|
|
q, err := pql.ParseString(`top-n("b.n", 2)`)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
} else if !reflect.DeepEqual(q, &pql.Query{
|
|
Root: &pql.TopN{
|
|
Frame: "b.n",
|
|
N: 2,
|
|
},
|
|
}) {
|
|
t.Fatalf("unexpected query: %s", spew.Sdump(q))
|
|
}
|
|
}
|
|
|
|
// Ensure the parser can parse a "union()" function.
|
|
func TestParser_Parse_Union(t *testing.T) {
|
|
q, err := pql.ParseString(`union(get(1), get(2))`)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
} else if !reflect.DeepEqual(q, &pql.Query{
|
|
Root: &pql.Union{
|
|
Inputs: pql.BitmapCalls{
|
|
&pql.Get{ID: 1},
|
|
&pql.Get{ID: 2},
|
|
},
|
|
},
|
|
}) {
|
|
t.Fatalf("unexpected query: %s", spew.Sdump(q))
|
|
}
|
|
}
|