Skip to content

Commit ad7060a

Browse files
committed
initial setup and simple term parser
0 parents  commit ad7060a

6 files changed

Lines changed: 84 additions & 0 deletions

File tree

.ruby-gemset

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
query-parser

.ruby-version

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
2.4.0

Gemfile

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
# frozen_string_literal: true
2+
source "https://rubygems.org"
3+
4+
gem 'parslet'
5+
gem 'minitest'
6+
gem 'awesome_print'
7+
gem 'pry'

Gemfile.lock

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
GEM
2+
remote: https://rubygems.org/
3+
specs:
4+
awesome_print (1.7.0)
5+
blankslate (3.1.3)
6+
coderay (1.1.1)
7+
method_source (0.8.2)
8+
minitest (5.10.1)
9+
parslet (1.7.1)
10+
blankslate (>= 2.0, <= 4.0)
11+
pry (0.10.4)
12+
coderay (~> 1.1.0)
13+
method_source (~> 0.8.1)
14+
slop (~> 3.4)
15+
slop (3.6.0)
16+
17+
PLATFORMS
18+
ruby
19+
20+
DEPENDENCIES
21+
awesome_print
22+
minitest
23+
parslet
24+
pry
25+
26+
BUNDLED WITH
27+
1.14.6

term_parser.rb

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
require 'parslet'
2+
3+
class TermParser < Parslet::Parser
4+
rule(:term) { match('[a-zA-Z0-9]').repeat(1) }
5+
rule(:space) { match('\s').repeat(1) }
6+
rule(:query) { (term.as(:term) >> (space >> term.as(:term)).repeat).as(:query) }
7+
root(:query)
8+
end
9+
10+
class TermTransformer < Parslet::Transform
11+
rule(:term => simple(:term)) { term.to_s }
12+
rule(:query => sequence(:terms)) { TermQuery.new(terms) }
13+
end
14+
15+
# A query represented by a list of parsed user terms
16+
class TermQuery
17+
attr_accessor :terms
18+
19+
def initialize(terms)
20+
self.terms = terms
21+
end
22+
23+
def to_elasticsearch
24+
{
25+
:query => {
26+
:match => {
27+
:title => {
28+
:query => terms.join(" "),
29+
:operator => "or"
30+
}
31+
}
32+
}
33+
}
34+
end
35+
end

tests.rb

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
require_relative 'term_parser'
2+
require 'minitest/autorun'
3+
require 'awesome_print'
4+
5+
class ParserTests < Minitest::Test
6+
def test_term_parser
7+
tree = TermParser.new.parse("foo bar baz")
8+
ap tree
9+
10+
term_query = TermTransformer.new.apply(tree)
11+
ap term_query.to_elasticsearch
12+
end
13+
end

0 commit comments

Comments
 (0)