Class: Buhos::SearchParser
- Inherits:
-
Object
- Object
- Buhos::SearchParser
- Defined in:
- lib/buhos/search_parser.rb
Defined Under Namespace
Classes: ParsingError
Instance Attribute Summary collapse
-
#tree ⇒ Object
readonly
Returns the value of attribute tree.
-
#tree_processed ⇒ Object
readonly
Returns the value of attribute tree_processed.
Instance Method Summary collapse
- #clean_tree(root_node) ⇒ Object
-
#initialize ⇒ SearchParser
constructor
A new instance of SearchParser.
- #parse(data) ⇒ Object
- #to_sql(or_union: false) ⇒ Object
- #to_sql_elements(field, e) ⇒ Object
Constructor Details
#initialize ⇒ SearchParser
Returns a new instance of SearchParser.
108 109 110 111 |
# File 'lib/buhos/search_parser.rb', line 108 def initialize Treetop.load "#{File.dirname(__FILE__)}/search_grammar.treetop" @parser=::SearchGrammarParser.new end |
Instance Attribute Details
#tree ⇒ Object (readonly)
Returns the value of attribute tree.
103 104 105 |
# File 'lib/buhos/search_parser.rb', line 103 def tree @tree end |
#tree_processed ⇒ Object (readonly)
Returns the value of attribute tree_processed.
104 105 106 |
# File 'lib/buhos/search_parser.rb', line 104 def tree_processed @tree_processed end |
Instance Method Details
#clean_tree(root_node) ⇒ Object
126 127 128 129 130 131 |
# File 'lib/buhos/search_parser.rb', line 126 def clean_tree(root_node) return if(root_node.elements.nil?) root_node.elements.delete_if{|node| node.text_value=='' or node.text_value=~/^\s+$/} root_node.elements.each {|node| self.clean_tree(node) } root_node end |
#parse(data) ⇒ Object
113 114 115 116 117 118 119 120 121 122 123 124 |
# File 'lib/buhos/search_parser.rb', line 113 def parse(data) #$log.info("PARSING:#{data}") @tree=@parser.parse(data) if @tree.nil? raise ParsingError, "Parse error at offset: #{@parser.index}" end @tree=clean_tree(@tree) @tree_processed=@tree.to_array end |
#to_sql(or_union: false) ⇒ Object
153 154 155 156 157 158 159 160 161 162 163 |
# File 'lib/buhos/search_parser.rb', line 153 def to_sql(or_union:false) raise "First parse data" unless @tree @tree_processed.map { |f0| filter=f0.dup next if filter[0]!= :filter filter.shift field=filter.shift elements=filter to_sql_elements(field, elements) }.join( or_union ? " OR ": " AND ") end |
#to_sql_elements(field, e) ⇒ Object
133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 |
# File 'lib/buhos/search_parser.rb', line 133 def to_sql_elements(field,e) #p e if e.is_a? Array if e[0]==:string "INSTR(LOWER(#{field}), '#{::Sequel.lit e[1].gsub('"',"").gsub("'","").downcase}')>0 " elsif e[0]==:string_q "INSTR(LOWER(#{field}), '#{::Sequel.lit(e[1].gsub('"',"").gsub("'","").downcase)}')>0 " elsif e[0]==:boolean "(#{to_sql_elements(field,e[2])} #{e[1]} #{to_sql_elements(field,e[3])})" else if e.length==1 to_sql_elements(field,e[0]) else e.map {|v| "(#{to_sql_elements(field,v)})" }.join" AND " end end else " " end end |