class SqlQueryExecutor::Query::SubQuery
Constants
- ADD_CHILDREN_METHODS
- BINDING_OPERATORS
Attributes
binding_operator[R]
children[R]
kind[R]
Public Class Methods
new(query)
click to toggle source
# File lib/sql_query_executor/query/sub_query.rb, line 10 def initialize(query) @children = [] @query = query initialize_attributes end
Public Instance Methods
execute!(collection, data=[])
click to toggle source
# File lib/sql_query_executor/query/sub_query.rb, line 16 def execute!(collection, data=[]) is_hash = collection.first.is_a?(Hash) method_eval = logic(is_hash) klass = collection.first.class klass.instance_eval do eval("define_method(:this_method_will_be_removed_in_a_little_while) { #{method_eval} }") end result = collection.select{ |object| object.this_method_will_be_removed_in_a_little_while } klass.class_eval { undef :this_method_will_be_removed_in_a_little_while } is_hash ? result.sort_by{ |hash| hash[:id] } : result.sort_by(&:id) end
logic(is_hash=false)
click to toggle source
# File lib/sql_query_executor/query/sub_query.rb, line 51 def logic(is_hash=false) string = '' @children.each do |child| if child.respond_to?(:binding_operator) && child.binding_operator operator = BINDING_OPERATORS.invert[child.binding_operator] string = "(#{string} #{operator} #{child.logic(is_hash)})" else string += child.logic(is_hash) end end string end
selector()
click to toggle source
# File lib/sql_query_executor/query/sub_query.rb, line 32 def selector hash = {} @children.each do |child| if child.respond_to?(:binding_operator) && child.binding_operator operator = BINDING_OPERATORS.invert[child.binding_operator] hash = {"$#{operator}" => [hash,child.selector]} else hash.merge!(child.selector) end end hash end
to_sql()
click to toggle source
# File lib/sql_query_executor/query/sub_query.rb, line 47 def to_sql SqlQueryExecutor::Query::Normalizers::QueryNormalizer.clean_query(@query) end
Private Instance Methods
add_sentence_children()
click to toggle source
# File lib/sql_query_executor/query/sub_query.rb, line 93 def add_sentence_children @children << SqlQueryExecutor::Query::Sentence.new(@query.gsub(Base::QUERY_SPACE, " ")) end
add_sub_query_children()
click to toggle source
# File lib/sql_query_executor/query/sub_query.rb, line 97 def add_sub_query_children array = @query.split(" ") queries = [] array.each do |query| sanitized_query = replace_parentheses(query) params = sanitized_query.scan(/\$op1\$(\S+)\$cp1\$/).flatten.compact params.each do |param| string = param.gsub("$QS$and$QS$", " and$QS$").gsub("$QS$or$QS$", " or$QS$") query = sanitized_query.gsub(param, string) end query = query.gsub("\$op1\$", "").gsub("\$cp1\$", "").gsub(/\$\Sp\d\$/, "") @children << SqlQueryExecutor::Query::SubQuery.new(query) end end
initialize_attributes()
click to toggle source
# File lib/sql_query_executor/query/sub_query.rb, line 67 def initialize_attributes return if @kind set_binding_operator set_kind set_children end
is_single_query?()
click to toggle source
# File lib/sql_query_executor/query/sub_query.rb, line 116 def is_single_query? array = @query.gsub(Base::QUERY_SPACE, ' ').split(' ') array.size <= 5 end
replace_parentheses(query)
click to toggle source
# File lib/sql_query_executor/query/sub_query.rb, line 122 def replace_parentheses(query) count = 1 string = "" query.each_char do |c| char = c if c == "(" char = "$op#{count}$" count += 1 end if c == ")" count -= 1 char = "$cp#{count}$" end string << char end string end
set_binding_operator()
click to toggle source
# File lib/sql_query_executor/query/sub_query.rb, line 75 def set_binding_operator @binding_operator = nil operator = @query.split(Base::QUERY_SPACE).first if ["and", "or"].include?(operator) @binding_operator = BINDING_OPERATORS[operator] @query = @query.gsub("#{operator}$QS$", "") end end
set_children()
click to toggle source
# File lib/sql_query_executor/query/sub_query.rb, line 89 def set_children send(ADD_CHILDREN_METHODS[@kind]) end
set_kind()
click to toggle source
# File lib/sql_query_executor/query/sub_query.rb, line 85 def set_kind @kind = is_single_query? ? :sentence : :sub_query end