Skip to content

Commit

Permalink
init
Browse files Browse the repository at this point in the history
  • Loading branch information
owenthereal committed Sep 19, 2011
0 parents commit 78834e4
Show file tree
Hide file tree
Showing 10 changed files with 481 additions and 0 deletions.
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
*.gem
.bundle
Gemfile.lock
pkg/*
4 changes: 4 additions & 0 deletions Gemfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
source "http://rubygems.org"

# Specify your gem's dependencies in sql_parser.gemspec
gemspec
1 change: 1 addition & 0 deletions Rakefile
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
require "bundler/gem_tasks"
5 changes: 5 additions & 0 deletions lib/..rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
require "./version"

module .
# Your code goes here...
end
21 changes: 21 additions & 0 deletions lib/sql_parser.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
require "rubygems"
require "treetop"

dir = File.expand_path(File.dirname(__FILE__))
Treetop.load File.expand_path("#{dir}/sql_parser/sql_parser")

class SqlParser::ItemsNode < Treetop::Runtime::SyntaxNode
def values
items.values.unshift(item.value)
end
end

class SqlParser::ItemNode < Treetop::Runtime::SyntaxNode
def values
[value]
end

def value
text_value.to_sym
end
end
183 changes: 183 additions & 0 deletions lib/sql_parser/sql_parser.treetop
Original file line number Diff line number Diff line change
@@ -0,0 +1,183 @@
grammar Sql
rule statement
select from where {
def tree
{
:operator => operator,
:set_quantifier => set_quantifier,
:fields => fields,
:tables => tables,
:conditions => conditions
}
end

def operator
:select
end

def set_quantifier
select.set_quantifier
end

def fields
select.fields
end

def tables
from.tables
end

def conditions
where.conditions
end
}
end

rule select
"select" quantifier:set_quantifier items {
def fields
items.values
end

def set_quantifier
quantifier.value
end
}
end

rule set_quantifier
(
required_space 'distinct' required_space
/
required_space 'all' required_space
) {
def value
text_value.strip.downcase.to_sym
end
}
/
required_space {
def value
nil
end
}
end

rule from
required_space "from" required_space items {
def tables
items.values
end
}
/
space {
def tables
[]
end
}
end

rule where
required_space "where" required_space conditional_items {
def conditions
conditional_items.node
end
}
/
space {
def conditions
[]
end
}
end

rule conditional_items
conditional_item required_space boolean_join required_space conditional_items {
def node
all_nodes = []
all_nodes.concat(conditional_item.node)
all_nodes << {:operator => boolean_join.operator}
all_nodes.concat(conditional_items.node)
all_nodes
end
}
/
conditional_item
end

rule boolean_join
('and' / 'or') {
def operator
text_value.to_sym
end
}
end

rule conditional_item
assignment_field space conditional_operator space assignment_value {
def node
[{
:operator => conditional_operator.value,
:field => assignment_field.text_value.to_sym,
:value => assignment_value.value
}]
end
}
end

rule conditional_operator
('<>' / '>=' / '<=' / '=' / '>' / '<') {
def value
text_value.to_sym
end
}
end

rule assignment_field
!keyword [a-zA-Z_] [a-zA-Z0-9_]*
end

rule assignment_value
string_assignment_value
/
numeric_assignment_value
end

rule string_assignment_value
"'" [^']* "'" {
def value
text_value[1..-2]
end
}
end

rule numeric_assignment_value
!keyword [0-9]+ {
def value
Integer(text_value)
end
}
end

rule items
item space [,]+ space items <SqlParser::ItemsNode>
/
item
end

rule item
!keyword [a-z_0-9*]+ <SqlParser::ItemNode>
end

rule keyword
'select' / 'from'
end

rule required_space
' '+
end

rule space
' '*
end
end
3 changes: 3 additions & 0 deletions lib/sql_parser/version.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
class SqlParser
VERSION = "0.0.1"
end
5 changes: 5 additions & 0 deletions spec/spec_helper.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
dir = File.dirname(__FILE__)
$LOAD_PATH.unshift("#{dir}/../lib")
require "sql_parser"

# require "spec"
Loading

0 comments on commit 78834e4

Please sign in to comment.