Skip to content

Commit 326973d

Browse files
authored
sql: fix sort. (#38)
1 parent bd24d22 commit 326973d

File tree

4 files changed

+105
-5
lines changed

4 files changed

+105
-5
lines changed

engine_test.go

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import (
1111
"github.com/stretchr/testify/require"
1212
)
1313

14-
1514
func TestEngine_Query(t *testing.T) {
1615
e := newEngine(t)
1716
testQuery(t, e,
@@ -29,8 +28,16 @@ func TestEngine_Query(t *testing.T) {
2928
sql.NewMemoryRow(int64(2)),
3029
},
3130
)
32-
}
3331

32+
testQuery(t, e,
33+
"SELECT i FROM mytable ORDER BY i DESC;",
34+
[]sql.Row{
35+
sql.NewMemoryRow(int64(3)),
36+
sql.NewMemoryRow(int64(2)),
37+
sql.NewMemoryRow(int64(1)),
38+
},
39+
)
40+
}
3441

3542
func testQuery(t *testing.T, e *gitql.Engine, q string, r []sql.Row) {
3643
assert := require.New(t)

sql/plan/sort.go

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -93,14 +93,12 @@ func newSortIter(s *Sort, child sql.RowIter) *sortIter {
9393

9494
func (i *sortIter) Next() (sql.Row, error) {
9595
if i.idx == -1 {
96-
println("computing sorted rows")
9796
err := i.computeSortedRows()
9897
if err != nil {
9998
return nil, err
10099
}
101100
i.idx = 0
102101
}
103-
println("sorted rows: ", i.sortedRows)
104102
if i.idx >= len(i.sortedRows) {
105103
return nil, io.EOF
106104
}
@@ -149,9 +147,18 @@ func (s *sorter) Less(i, j int) bool {
149147
typ := sf.Column.Type()
150148
av := sf.Column.Eval(a)
151149
bv := sf.Column.Eval(b)
152-
if typ.Compare(av, bv) == -1 {
150+
151+
if sf.Order == Descending {
152+
av, bv = bv, av
153+
}
154+
155+
switch typ.Compare(av, bv) {
156+
case -1:
153157
return true
158+
case 1:
159+
return false
154160
}
155161
}
162+
156163
return false
157164
}

sql/plan/sort_test.go

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,12 @@ func TestSort(t *testing.T) {
1717
sql.Field{"col1", sql.String},
1818
sql.Field{"col2", sql.Integer},
1919
}
20+
2021
child := mem.NewTable("test", childSchema)
2122
child.Insert("a", int32(3))
2223
child.Insert("b", int32(3))
2324
child.Insert("c", int32(1))
25+
2426
sf := []SortField{
2527
{Column: expression.NewGetField(1, sql.Integer, "col2"), Order: Ascending},
2628
{Column: expression.NewGetField(0, sql.String, "col1"), Order: Descending},
@@ -30,19 +32,94 @@ func TestSort(t *testing.T) {
3032
iter, err := s.RowIter()
3133
assert.Nil(err)
3234
assert.NotNil(iter)
35+
3336
row, err := iter.Next()
3437
assert.Nil(err)
3538
assert.NotNil(row)
3639
assert.Equal("c", row.Fields()[0])
3740
row, err = iter.Next()
3841
assert.Nil(err)
3942
assert.NotNil(row)
43+
assert.Equal("b", row.Fields()[0])
44+
row, err = iter.Next()
45+
assert.Nil(err)
46+
assert.NotNil(row)
47+
assert.Equal("a", row.Fields()[0])
48+
row, err = iter.Next()
49+
assert.Equal(io.EOF, err)
50+
assert.Nil(row)
51+
}
52+
53+
func TestSort_Ascending(t *testing.T) {
54+
assert := assert.New(t)
55+
childSchema := sql.Schema{
56+
sql.Field{"col1", sql.String},
57+
}
58+
59+
child := mem.NewTable("test", childSchema)
60+
child.Insert("b")
61+
child.Insert("c")
62+
child.Insert("a")
63+
64+
sf := []SortField{
65+
{Column: expression.NewGetField(0, sql.String, "col1"), Order: Ascending},
66+
}
67+
s := NewSort(sf, child)
68+
assert.Equal(childSchema, s.Schema())
69+
iter, err := s.RowIter()
70+
assert.Nil(err)
71+
assert.NotNil(iter)
72+
73+
row, err := iter.Next()
74+
assert.Nil(err)
75+
assert.NotNil(row)
4076
assert.Equal("a", row.Fields()[0])
4177
row, err = iter.Next()
4278
assert.Nil(err)
4379
assert.NotNil(row)
4480
assert.Equal("b", row.Fields()[0])
4581
row, err = iter.Next()
82+
assert.Nil(err)
83+
assert.NotNil(row)
84+
assert.Equal("c", row.Fields()[0])
85+
row, err = iter.Next()
86+
assert.Equal(io.EOF, err)
87+
assert.Nil(row)
88+
}
89+
90+
func TestSort_Descending(t *testing.T) {
91+
assert := assert.New(t)
92+
childSchema := sql.Schema{
93+
sql.Field{"col1", sql.String},
94+
}
95+
96+
child := mem.NewTable("test", childSchema)
97+
child.Insert("a")
98+
child.Insert("c")
99+
child.Insert("b")
100+
101+
sf := []SortField{
102+
{Column: expression.NewGetField(0, sql.String, "col1"), Order: Descending},
103+
}
104+
s := NewSort(sf, child)
105+
assert.Equal(childSchema, s.Schema())
106+
iter, err := s.RowIter()
107+
assert.Nil(err)
108+
assert.NotNil(iter)
109+
110+
row, err := iter.Next()
111+
assert.Nil(err)
112+
assert.NotNil(row)
113+
assert.Equal("c", row.Fields()[0])
114+
row, err = iter.Next()
115+
assert.Nil(err)
116+
assert.NotNil(row)
117+
assert.Equal("b", row.Fields()[0])
118+
row, err = iter.Next()
119+
assert.Nil(err)
120+
assert.NotNil(row)
121+
assert.Equal("a", row.Fields()[0])
122+
row, err = iter.Next()
46123
assert.Equal(io.EOF, err)
47124
assert.Nil(row)
48125
}

sql/type_test.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@ func TestType_String(t *testing.T) {
1919
v, err = String.Convert(1)
2020
assert.Equal(ErrInvalidType, err)
2121
assert.Nil(v)
22+
assert.Equal(-1, String.Compare("a", "b"))
23+
assert.Equal(0, String.Compare("a", "a"))
24+
assert.Equal(1, String.Compare("b", "a"))
2225
}
2326

2427
func TestType_Integer(t *testing.T) {
@@ -50,6 +53,9 @@ func TestType_Integer(t *testing.T) {
5053
v, err = Integer.Convert(uint64(18446744073709551615))
5154
assert.NotNil(err)
5255
assert.Nil(v)
56+
assert.Equal(-1, Integer.Compare(int32(1), int32(2)))
57+
assert.Equal(0, Integer.Compare(int32(1), int32(1)))
58+
assert.Equal(1, Integer.Compare(int32(2), int32(1)))
5359
}
5460

5561
func TestType_BigInteger(t *testing.T) {
@@ -81,4 +87,7 @@ func TestType_BigInteger(t *testing.T) {
8187
v, err = BigInteger.Convert("")
8288
assert.NotNil(err)
8389
assert.Nil(v)
90+
assert.Equal(-1, BigInteger.Compare(int64(1), int64(2)))
91+
assert.Equal(0, BigInteger.Compare(int64(1), int64(1)))
92+
assert.Equal(1, BigInteger.Compare(int64(2), int64(1)))
8493
}

0 commit comments

Comments
 (0)