Class: SimplerDB::QueryExecutor
- Inherits:
-
Object
- Object
- SimplerDB::QueryExecutor
- 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
-
#do_query(query, domain, max = 100, token = 0) ⇒ Object
Execute the query.
- #evaluation_error_message(evaluation_result, program) ⇒ Object
-
#initialize ⇒ QueryExecutor
constructor
A new instance of QueryExecutor.
-
#parse_error_message(unexpected_token, program) ⇒ Object
From dhaka examples.
- #tokenize_error_message(unexpected_char_index, program) ⇒ Object
Constructor Details
#initialize ⇒ QueryExecutor
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 (parse_result.unexpected_char_index, query) when Dhaka::ParseErrorResult raise (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_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 (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 (unexpected_char_index, program) "Unexpected character #{program[unexpected_char_index - 1].chr}:\n#{program.dup.insert(unexpected_char_index - 1, ERROR_MARKER)}" end |