Skip to content

Commit aac6a39

Browse files
committed
Basic support for ORDER BY
1 parent 66c8eb7 commit aac6a39

File tree

6 files changed

+104
-14
lines changed

6 files changed

+104
-14
lines changed

lib/sql/composer/compiler.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,10 @@ def visit_where(node)
4040
add_node(Nodes::Where, operations: node)
4141
end
4242

43+
def visit_order(node)
44+
add_node(Nodes::Order, operations: node)
45+
end
46+
4347
private
4448

4549
def add_node(klass, options)

lib/sql/composer/nodes.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,7 @@
44
require "sql/composer/nodes/select"
55
require "sql/composer/nodes/from"
66
require "sql/composer/nodes/where"
7+
require "sql/composer/nodes/order"
78
require "sql/composer/nodes/operations/eql"
9+
require "sql/composer/nodes/operations/order_direction"
810
require "sql/composer/nodes/value"

lib/sql/composer/nodes/identifier.rb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,14 @@ def to_s
1414
qualify? ? [qualifier, quote(name)].map(&:to_s).join(".") : quote(name)
1515
end
1616

17+
def asc
18+
Operations::Asc.new(self)
19+
end
20+
21+
def desc
22+
Operations::Desc.new(self)
23+
end
24+
1725
def qualifier
1826
fetch(:qualifier)
1927
end
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
# frozen_string_literal: true
2+
3+
module SQL
4+
module Composer
5+
module Nodes
6+
module Operations
7+
class OrderDirection
8+
attr_reader :source
9+
10+
def initialize(source)
11+
@source = source
12+
end
13+
14+
def to_s
15+
"#{source.to_s} #{direction}"
16+
end
17+
end
18+
19+
class Asc < OrderDirection
20+
def direction
21+
"ASC"
22+
end
23+
end
24+
25+
class Desc < OrderDirection
26+
def direction
27+
"DESC"
28+
end
29+
end
30+
end
31+
end
32+
end
33+
end

lib/sql/composer/nodes/order.rb

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# frozen_string_literal: true
2+
3+
require "sql/composer/nodes/core"
4+
5+
module SQL
6+
module Composer
7+
module Nodes
8+
class Order < Core
9+
def operations
10+
fetch(:operations)
11+
end
12+
13+
def to_s
14+
"ORDER BY #{operations.map(&:to_s).join(', ')}"
15+
end
16+
end
17+
end
18+
end
19+
end

spec/integration/sql/compose_spec.rb

Lines changed: 38 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -22,19 +22,43 @@ def build(&block)
2222
SQL.compose(backend: :postgres, args: UsersRelation.new, &block)
2323
end
2424

25-
it "works" do
26-
result = build { |users|
27-
select users.id, users.name
28-
from users.table
29-
where users.name == "Jane"
30-
}
31-
32-
expect(result.to_s).to eql(
33-
<<~SQL.strip
34-
SELECT "users"."id", "users"."name"
35-
FROM "users"
36-
WHERE "users"."name" == 'Jane'
37-
SQL
38-
)
25+
describe "SELECT" do
26+
context "without ORDER" do
27+
specify do
28+
result = build { |users|
29+
select users.id, users.name
30+
from users.table
31+
where users.name == "Jane"
32+
}
33+
34+
expect(result.to_s).to eql(
35+
<<~SQL.strip
36+
SELECT "users"."id", "users"."name"
37+
FROM "users"
38+
WHERE "users"."name" == 'Jane'
39+
SQL
40+
)
41+
end
42+
end
43+
44+
context "with ORDER" do
45+
specify do
46+
result = build { |users|
47+
select users.id, users.name
48+
from users.table
49+
where users.name == "Jane"
50+
order users.id.desc
51+
}
52+
53+
expect(result.to_s).to eql(
54+
<<~SQL.strip
55+
SELECT "users"."id", "users"."name"
56+
FROM "users"
57+
WHERE "users"."name" == 'Jane'
58+
ORDER BY "users"."id" DESC
59+
SQL
60+
)
61+
end
62+
end
3963
end
4064
end

0 commit comments

Comments
 (0)