Skip to content

Commit

Permalink
refactor: view -> query & test helpers
Browse files Browse the repository at this point in the history
  • Loading branch information
DerekStride committed Jun 28, 2024
1 parent 3142545 commit 66327e6
Show file tree
Hide file tree
Showing 4 changed files with 28 additions and 27 deletions.
2 changes: 1 addition & 1 deletion lib/sql_tools/view.rb → lib/sql_tools/query.rb
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
module SqlTools
class View
class Query
attr_accessor :select, :from
attr_reader :common_table_expressions

Expand Down
12 changes: 6 additions & 6 deletions lib/sql_tools/view_visitor.rb → lib/sql_tools/query_visitor.rb
Original file line number Diff line number Diff line change
@@ -1,24 +1,24 @@
module SqlTools
class ViewVisitor < TreeStand::Visitor
attr_reader :view
class QueryVisitor < TreeStand::Visitor
attr_reader :query

def initialize(node)
super(node)
@ctes = {}
@view = View.new
@query = Query.new
end

def on_cte(node)
cte = CommonTableExpression.new(node)
@view.common_table_expressions[cte.name] = cte
@query.common_table_expressions[cte.name] = cte
end

def on_select(node)
@view.select = node
@query.select = node
end

def on_from(node)
@view.from = node
@query.from = node
end
end
end
12 changes: 12 additions & 0 deletions test/test_helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -15,3 +15,15 @@
config.parser_path = File.join(__dir__, "..", "treesitter")
end

module TreeStandHelper
def query_from_sql(source) = visit_tree(parse(source))
def visit_tree(tree) = SqlTools::QueryVisitor.new(tree.root_node).visit.query
def parse(source) = parser.parse_string(source)
def parser = @parser ||= TreeStand::Parser.new("sql")
end

module Minitest
class Test
include TreeStandHelper
end
end
29 changes: 9 additions & 20 deletions test/unit/view_visitor_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,46 +4,35 @@

module SqlTools
class ViewVisitorTest < Minitest::Test
def setup
@parser = TreeStand::Parser.new("sql")
end

def test_visit_select
tree = @parser.parse_string(<<~SQL)
query = query_from_sql(<<~SQL)
SELECT * FROM table
SQL

visitor = ViewVisitor.new(tree.root_node).visit
view = visitor.view

assert_instance_of(View, view)
assert_instance_of(Query, query)

assert_equal(1, view.selections.size)
assert_equal(AllFieldsSelection.new, view.selections.first)
assert_equal(1, query.selections.size)
assert_equal(AllFieldsSelection.new, query.selections.first)

assert_equal(1, view.objects.size)
assert_equal(Table.new(name: "table", alias: "table"), view.objects.first)
assert_equal(1, query.objects.size)
assert_equal(Table.new(name: "table", alias: "table"), query.objects.first)
end

def test_visit_select_with_predicate
tree = @parser.parse_string(<<~SQL)
query = query_from_sql(<<~SQL)
SELECT *
FROM table
WHERE id = 1
SQL

visitor = ViewVisitor.new(tree.root_node).visit
view = visitor.view


assert_equal(1, view.predicates.size)
assert_equal(1, query.predicates.size)
assert_equal(
Predicate::Binary.new(
left: Column.new(table: nil, name: "id"),
operator: "=",
right: "1",
),
view.predicates.first,
query.predicates.first,
)
end
end
Expand Down

0 comments on commit 66327e6

Please sign in to comment.