2020-01-23 19:16:16 +01:00
|
|
|
require './parser'
|
|
|
|
|
|
|
|
|
|
class QueryParserTester
|
|
|
|
|
describe 'Testing the Parser' do
|
|
|
|
|
before do
|
|
|
|
|
@evaluator = Query.new
|
|
|
|
|
end
|
2020-01-23 23:00:16 +01:00
|
|
|
|
|
|
|
|
it 'tests query with only one search term without quotes and without column name' do
|
|
|
|
|
@result = @evaluator.parse('-123')
|
|
|
|
|
|
|
|
|
|
expect(@result[:DEFAULT_COLUMN]).to eq '-123'
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
it 'tests query with only one search term with quotes and without column name' do
|
|
|
|
|
@result = @evaluator.parse('"OR 128"')
|
|
|
|
|
|
|
|
|
|
expect(@result[:DEFAULT_COLUMN]).to eq '"OR 128"'
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
it 'tests query with one column and search term without quotes' do
|
|
|
|
|
@result = @evaluator.parse('tag:mta')
|
|
|
|
|
|
|
|
|
|
expect(@result['tag']).to eq 'mta'
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
it 'tests query with one column and search term with quotes' do
|
|
|
|
|
@result = @evaluator.parse('tag:"tag 120"')
|
|
|
|
|
|
|
|
|
|
expect(@result['tag']).to eq '"tag 120"'
|
|
|
|
|
end
|
|
|
|
|
|
2020-01-24 14:43:46 +01:00
|
|
|
it 'tests query with two columns connected with OR and search terms without quotes' do
|
|
|
|
|
@result = @evaluator.parse('tag:mta OR tag:12')
|
|
|
|
|
|
|
|
|
|
@expected_array = [
|
|
|
|
|
{ 'tag' => 'mta' },
|
|
|
|
|
{ 'tag' => '12' }
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
expect(@result.count).to eq 1
|
|
|
|
|
expect(@result[:OPERATOR_OR]).to eq @expected_array
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
it 'tests query with two columns connected with OR and search terms with quotes' do
|
|
|
|
|
@result = @evaluator.parse('tag:mta OR tag:"tag 12"')
|
|
|
|
|
|
|
|
|
|
@expected_array = [
|
|
|
|
|
{ 'tag' => 'mta' },
|
|
|
|
|
{ 'tag' => '"tag 12"' }
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
expect(@result.count).to eq 1
|
|
|
|
|
expect(@result[:OPERATOR_OR]).to eq @expected_array
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
it 'tests query with two columns connected with AND and search terms without quotes' do
|
|
|
|
|
@result = @evaluator.parse('tag:mta AND tag:12')
|
|
|
|
|
|
|
|
|
|
@expected_array = [
|
|
|
|
|
{ 'tag' => 'mta' },
|
|
|
|
|
{ 'tag' => '12' }
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
expect(@result.count).to eq 1
|
|
|
|
|
expect(@result[:OPERATOR_AND]).to eq @expected_array
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
it 'tests query with two columns connected with AND and search terms with quotes' do
|
|
|
|
|
@result = @evaluator.parse('tag:mta and tag:"tag 12"')
|
|
|
|
|
|
|
|
|
|
@expected_array = [
|
|
|
|
|
{ 'tag' => 'mta' },
|
|
|
|
|
{ 'tag' => '"tag 12"' }
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
expect(@result.count).to eq 1
|
|
|
|
|
expect(@result[:OPERATOR_AND]).to eq @expected_array
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
it 'tests simple query with brackets' do
|
|
|
|
|
@result = @evaluator.parse('(123)')
|
|
|
|
|
|
|
|
|
|
expect(@result.count).to eq 1
|
|
|
|
|
expect(@result[:DEFAULT_COLUMN]).to eq '123'
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
it 'tests simple query with brackets and with a column name' do
|
|
|
|
|
@result = @evaluator.parse('(name:JF)')
|
|
|
|
|
|
|
|
|
|
expect(@result.count).to eq 1
|
|
|
|
|
expect(@result['name']).to eq 'JF'
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
it 'tests query with OR operator in brackets' do
|
|
|
|
|
@result = @evaluator.parse('(name:JF or tag:mta)')
|
|
|
|
|
|
|
|
|
|
@expected_array = [
|
|
|
|
|
{ 'name' => 'JF' },
|
|
|
|
|
{ 'tag' => 'mta' }
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
expect(@result.count).to eq 1
|
|
|
|
|
expect(@result[:OPERATOR_OR]).to eq @expected_array
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
it 'tests query with two simple brackets expressions' do
|
|
|
|
|
@result = @evaluator.parse('(name:JF) and (-456)')
|
|
|
|
|
|
|
|
|
|
@expected_array = [
|
|
|
|
|
{ 'name' => 'JF' },
|
|
|
|
|
{ :DEFAULT_COLUMN => '-456' }
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
expect(@result.count).to eq 1
|
|
|
|
|
expect(@result[:OPERATOR_AND]).to eq @expected_array
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
it 'tests query with two brackets expressions' do
|
|
|
|
|
@result = @evaluator.parse('(name:JF or tag:"tag 0") and (-456)')
|
|
|
|
|
|
|
|
|
|
@expected_array_part_1 = [
|
|
|
|
|
{ 'name' => 'JF' },
|
|
|
|
|
{ 'tag' => '"tag 0"' }
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
@expected_array_total = [
|
|
|
|
|
{:OPERATOR_OR => @expected_array_part_1},
|
|
|
|
|
{:DEFAULT_COLUMN => '-456'}
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
expect(@result.count).to eq 1
|
|
|
|
|
expect(@result[:OPERATOR_AND]).to eq @expected_array_total
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
it 'tests operator precedence' do
|
|
|
|
|
@result1 = @evaluator.parse('tag:mta or name:JF and 12_4')
|
|
|
|
|
@result2 = @evaluator.parse('tag:mta or (name:JF and 12_4)')
|
|
|
|
|
|
|
|
|
|
expect(@result1).to eq @result2
|
|
|
|
|
|
|
|
|
|
expect(@result1.length).to eq 1
|
|
|
|
|
|
|
|
|
|
@expected_array_part_2 = [
|
|
|
|
|
{'name' => 'JF'},
|
|
|
|
|
{:DEFAULT_COLUMN => '12_4'}
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
@expected_array_total = [
|
|
|
|
|
{'tag' => 'mta'},
|
|
|
|
|
{:OPERATOR_AND => @expected_array_part_2}
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
expect(@result1[:OPERATOR_OR]).to eq @expected_array_total
|
|
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
# Tests to write :
|
|
|
|
|
# * query with multiple column names and search terms without logical operators
|
|
|
|
|
# * AND NOT, OR NOT tests
|
|
|
|
|
|
2020-01-23 23:00:16 +01:00
|
|
|
|
2020-01-23 19:16:16 +01:00
|
|
|
end
|
|
|
|
|
end
|