Class: SimplerDB::QueryExecutor

Inherits:
Object
  • Object
show all
Defined in:
lib/simplerdb/query_language.rb

Overview

Uses the lexer/parser/evaluator to perform the query and do simple paging

Constant Summary collapse

ERROR_MARKER =
">>>"

Instance Method Summary collapse

Constructor Details

#initializeQueryExecutor

Returns a new instance of QueryExecutor.



10
11
12
13
# File 'lib/simplerdb/query_language.rb', line 10

def initialize
  @lexer = Dhaka::Lexer.new(QueryLexerSpec)
  @parser = Dhaka::Parser.new(QueryGrammar)
end

Instance Method Details

#do_query(query, domain, max = 100, token = 0) ⇒ Object

Execute the query



16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/simplerdb/query_language.rb', line 16

def do_query(query, domain, max = 100, token = 0)
  parse_result = @parser.parse(@lexer.lex(query))
  token = 0 if token.nil?
  
  case parse_result
    when Dhaka::TokenizerErrorResult
      raise tokenize_error_message(parse_result.unexpected_char_index, query)
    when Dhaka::ParseErrorResult
      raise parse_error_message(parse_result.unexpected_token, query) 
  end
  
  items = QueryEvaluator.new(domain).evaluate(parse_result)
  results = []
  count = 0
  items.each do |item|
    break if results.size == max
    results << item if count >= token
    count += 1
  end
  
  if (count == items.size)
    return results,nil
  else
    return results,count
  end
end

#evaluation_error_message(evaluation_result, program) ⇒ Object



56
57
58
# File 'lib/simplerdb/query_language.rb', line 56

def evaluation_error_message(evaluation_result, program)
  "#{evaluation_result.exception}:\n#{program.dup.insert(evaluation_result.node.tokens[0].input_position, ERROR_MARKER)}"
end

#parse_error_message(unexpected_token, program) ⇒ Object

From dhaka examples



44
45
46
47
48
49
50
# File 'lib/simplerdb/query_language.rb', line 44

def parse_error_message(unexpected_token, program)
  if unexpected_token.symbol_name == Dhaka::END_SYMBOL_NAME
    "Unexpected end of file."
  else
    "Unexpected token #{unexpected_token.symbol_name}:\n#{program.dup.insert(unexpected_token.input_position - 1, ERROR_MARKER)}"
  end
end

#tokenize_error_message(unexpected_char_index, program) ⇒ Object



52
53
54
# File 'lib/simplerdb/query_language.rb', line 52

def tokenize_error_message(unexpected_char_index, program)
  "Unexpected character #{program[unexpected_char_index - 1].chr}:\n#{program.dup.insert(unexpected_char_index - 1, ERROR_MARKER)}"
end