Add As helper for 'SELECT col AS name' queries Clients could do this hackily before by manually passing "col AS name", but it isn't clearly supported.
100 lines
2.6 KiB
Go
100 lines
2.6 KiB
Go
// Copyright (C) 2017 ScyllaDB
|
|
// Use of this source code is governed by a ALv2-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package qb
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/google/go-cmp/cmp"
|
|
)
|
|
|
|
func TestSelectBuilder(t *testing.T) {
|
|
w := EqNamed("id", "expr")
|
|
|
|
table := []struct {
|
|
B *SelectBuilder
|
|
N []string
|
|
S string
|
|
}{
|
|
// Basic test for select *
|
|
{
|
|
B: Select("cycling.cyclist_name"),
|
|
S: "SELECT * FROM cycling.cyclist_name ",
|
|
},
|
|
// Basic test for select columns
|
|
{
|
|
B: Select("cycling.cyclist_name").Columns("id", "user_uuid", "firstname"),
|
|
S: "SELECT id,user_uuid,firstname FROM cycling.cyclist_name ",
|
|
},
|
|
// Add a SELECT AS column
|
|
{
|
|
B: Select("cycling.cyclist_name").Columns("id", "user_uuid", As("firstname", "name")),
|
|
S: "SELECT id,user_uuid,firstname AS name FROM cycling.cyclist_name ",
|
|
},
|
|
// Basic test for select distinct
|
|
{
|
|
B: Select("cycling.cyclist_name").Distinct("id"),
|
|
S: "SELECT DISTINCT id FROM cycling.cyclist_name ",
|
|
},
|
|
// Change table name
|
|
{
|
|
B: Select("cycling.cyclist_name").From("Foobar"),
|
|
S: "SELECT * FROM Foobar ",
|
|
},
|
|
// Add WHERE
|
|
{
|
|
B: Select("cycling.cyclist_name").Where(w, Gt("firstname")),
|
|
S: "SELECT * FROM cycling.cyclist_name WHERE id=? AND firstname>? ",
|
|
N: []string{"expr", "firstname"},
|
|
},
|
|
// Add GROUP BY
|
|
{
|
|
B: Select("cycling.cyclist_name").Columns("MAX(stars) as max_stars").GroupBy("id"),
|
|
S: "SELECT id,MAX(stars) as max_stars FROM cycling.cyclist_name GROUP BY id ",
|
|
},
|
|
// Add ORDER BY
|
|
{
|
|
B: Select("cycling.cyclist_name").Where(w).OrderBy("firstname", ASC),
|
|
S: "SELECT * FROM cycling.cyclist_name WHERE id=? ORDER BY firstname ASC ",
|
|
N: []string{"expr"},
|
|
},
|
|
// Add LIMIT
|
|
{
|
|
B: Select("cycling.cyclist_name").Where(w).Limit(10),
|
|
S: "SELECT * FROM cycling.cyclist_name WHERE id=? LIMIT 10 ",
|
|
N: []string{"expr"},
|
|
},
|
|
// Add PER PARTITION LIMIT
|
|
{
|
|
B: Select("cycling.cyclist_name").Where(w).LimitPerPartition(10),
|
|
S: "SELECT * FROM cycling.cyclist_name WHERE id=? PER PARTITION LIMIT 10 ",
|
|
N: []string{"expr"},
|
|
},
|
|
// Add ALLOW FILTERING
|
|
{
|
|
B: Select("cycling.cyclist_name").Where(w).AllowFiltering(),
|
|
S: "SELECT * FROM cycling.cyclist_name WHERE id=? ALLOW FILTERING ",
|
|
N: []string{"expr"},
|
|
},
|
|
}
|
|
|
|
for _, test := range table {
|
|
stmt, names := test.B.ToCql()
|
|
if diff := cmp.Diff(test.S, stmt); diff != "" {
|
|
t.Error(diff)
|
|
}
|
|
if diff := cmp.Diff(test.N, names); diff != "" {
|
|
t.Error(diff)
|
|
}
|
|
}
|
|
}
|
|
|
|
func BenchmarkSelectBuilder(b *testing.B) {
|
|
b.ResetTimer()
|
|
for i := 0; i < b.N; i++ {
|
|
Select("cycling.cyclist_name").Columns("id", "user_uuid", "firstname", "stars").Where(Eq("id")).ToCql()
|
|
}
|
|
}
|