提交 83c47c19 编写于 作者: K Keenan Brock

Add database specific string concatenation

上级 dfd22638
......@@ -40,5 +40,10 @@ def initialize left, right
end
end
class Concat < InfixOperation
def initialize left, right
super('||', left, right)
end
end
end
end
\ No newline at end of file
end
......@@ -202,6 +202,10 @@ def when right
Nodes::Case.new(self).when quoted_node(right)
end
def concat other
Nodes::Concat.new self, other
end
private
def grouping_any method_id, others, *extras
......
......@@ -72,6 +72,7 @@ def binary o
alias :visit_Arel_Nodes_As :binary
alias :visit_Arel_Nodes_Assignment :binary
alias :visit_Arel_Nodes_Between :binary
alias :visit_Arel_Nodes_Concat :binary
alias :visit_Arel_Nodes_DeleteStatement :binary
alias :visit_Arel_Nodes_DoesNotMatch :binary
alias :visit_Arel_Nodes_Equality :binary
......
......@@ -176,6 +176,7 @@ def binary o
alias :visit_Arel_Nodes_As :binary
alias :visit_Arel_Nodes_Assignment :binary
alias :visit_Arel_Nodes_Between :binary
alias :visit_Arel_Nodes_Concat :binary
alias :visit_Arel_Nodes_DoesNotMatch :binary
alias :visit_Arel_Nodes_Equality :binary
alias :visit_Arel_Nodes_GreaterThan :binary
......
......@@ -72,6 +72,14 @@ def visit_Arel_Nodes_UpdateStatement o, collector
maybe_visit o.limit, collector
end
def visit_Arel_Nodes_Concat o, collector
collector << " CONCAT("
visit o.left, collector
collector << ", "
visit o.right, collector
collector << ") "
collector
end
end
end
end
......@@ -103,6 +103,7 @@ def test_right_outer_join
[
Arel::Nodes::Assignment,
Arel::Nodes::Between,
Arel::Nodes::Concat,
Arel::Nodes::DoesNotMatch,
Arel::Nodes::Equality,
Arel::Nodes::GreaterThan,
......
......@@ -55,6 +55,24 @@ def compile node
compile(node).must_be_like "LOCK IN SHARE MODE"
end
end
describe "concat" do
it "concats columns" do
@table = Table.new(:users)
query = @table[:name].concat(@table[:name])
compile(query).must_be_like %{
CONCAT("users"."name", "users"."name")
}
end
it "concats a string" do
@table = Table.new(:users)
query = @table[:name].concat(Nodes.build_quoted('abc'))
compile(query).must_be_like %{
CONCAT("users"."name", 'abc')
}
end
end
end
end
end
......@@ -469,13 +469,19 @@ def quote value, column = nil
compile(node).must_equal %(("products"."price" - 7))
end
it "should handle Concatination" do
table = Table.new(:users)
node = table[:name].concat(table[:name])
compile(node).must_equal %("users"."name" || "users"."name")
end
it "should handle arbitrary operators" do
node = Arel::Nodes::InfixOperation.new(
'||',
'&&',
Arel::Attributes::String.new(Table.new(:products), :name),
Arel::Attributes::String.new(Table.new(:products), :name)
)
compile(node).must_equal %("products"."name" || "products"."name")
compile(node).must_equal %("products"."name" && "products"."name")
end
end
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册