Initial Chef repository
This commit is contained in:
150
cookbooks/chef-solo-search/libraries/vendor/chef/solr_query/lucene.treetop
vendored
Normal file
150
cookbooks/chef-solo-search/libraries/vendor/chef/solr_query/lucene.treetop
vendored
Normal file
@@ -0,0 +1,150 @@
|
||||
#
|
||||
# Author:: Seth Falcon (<seth@opscode.com>)
|
||||
# Copyright:: Copyright (c) 2010-2011 Opscode, Inc.
|
||||
# License:: Apache License, Version 2.0
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
#
|
||||
|
||||
grammar Lucene
|
||||
|
||||
rule body
|
||||
(expression / space)* <Body>
|
||||
end
|
||||
|
||||
rule expression
|
||||
operation / group / field / field_range / term / string
|
||||
end
|
||||
|
||||
rule term
|
||||
keyword valid_letter+ <Term> / !keyword !"?" valid_letter <Term>
|
||||
end
|
||||
|
||||
rule field
|
||||
field_name ":" (term/string/group) <Field>
|
||||
end
|
||||
|
||||
rule field_range
|
||||
field_name ":" "[" range_value " TO " range_value "]" <InclFieldRange>
|
||||
/
|
||||
field_name ":" "{" range_value " TO " range_value "}" <ExclFieldRange>
|
||||
end
|
||||
|
||||
rule field_name
|
||||
!keyword valid_letter+ <FieldName>
|
||||
end
|
||||
|
||||
rule range_value
|
||||
valid_letter+ <RangeValue> / "*" <RangeValue>
|
||||
end
|
||||
|
||||
rule group
|
||||
space? '(' body ')' space? <Group>
|
||||
end
|
||||
|
||||
rule operation
|
||||
binary_op / unary_op / fuzzy_op / boost_op
|
||||
end
|
||||
|
||||
rule unary_op
|
||||
not_op / required_op / prohibited_op
|
||||
end
|
||||
|
||||
rule binary_op
|
||||
(group / field / field_range / term) space? boolean_operator space+ body <BinaryOp>
|
||||
end
|
||||
|
||||
rule boolean_operator
|
||||
and_operator / or_operator
|
||||
end
|
||||
|
||||
rule and_operator
|
||||
'AND' <AndOperator> / '&&' <AndOperator>
|
||||
end
|
||||
|
||||
rule or_operator
|
||||
'OR' <OrOperator> / '||' <OrOperator>
|
||||
end
|
||||
|
||||
rule not_op
|
||||
not_operator space (group / field / field_range / term / string) <UnaryOp>
|
||||
/
|
||||
bang_operator space? (group / field / field_range / term / string) <UnaryOp>
|
||||
end
|
||||
|
||||
rule not_operator
|
||||
'NOT' <NotOperator>
|
||||
end
|
||||
|
||||
rule bang_operator
|
||||
'!' <NotOperator>
|
||||
end
|
||||
|
||||
rule required_op
|
||||
!valid_letter required_operator (term/string) <UnaryOp>
|
||||
/
|
||||
required_operator (term/string) <UnaryOp>
|
||||
end
|
||||
|
||||
rule required_operator
|
||||
'+' <RequiredOperator>
|
||||
end
|
||||
|
||||
rule prohibited_op
|
||||
!valid_letter prohibited_operator (field/field_range/term/string) <UnaryOp>
|
||||
end
|
||||
|
||||
rule prohibited_operator
|
||||
'-' <ProhibitedOperator>
|
||||
end
|
||||
|
||||
rule boost_op
|
||||
(term/string) '^' fuzzy_param <BoostOp>
|
||||
end
|
||||
|
||||
rule fuzzy_op
|
||||
(term/string) '~' fuzzy_param? (space / !valid_letter) <FuzzyOp>
|
||||
end
|
||||
|
||||
rule fuzzy_param
|
||||
[0-9] '.'? [0-9] <FuzzyParam> / [0-9]+ <FuzzyParam>
|
||||
end
|
||||
|
||||
rule string
|
||||
'"' term (space term)* '"' <Phrase>
|
||||
end
|
||||
|
||||
rule keyword
|
||||
'AND' / 'OR' / 'NOT'
|
||||
end
|
||||
|
||||
rule valid_letter
|
||||
start_letter+ ([a-zA-Z0-9@*?_.-] / '\\' special_char)*
|
||||
end
|
||||
|
||||
rule start_letter
|
||||
[a-zA-Z0-9@._*] / '\\' special_char
|
||||
end
|
||||
|
||||
rule end_letter
|
||||
[a-zA-Z0-9*?_.] / '\\' special_char
|
||||
end
|
||||
|
||||
rule special_char
|
||||
[-+&|!(){}\[\]^"~*?:\\]
|
||||
end
|
||||
|
||||
rule space
|
||||
[\s]+
|
||||
end
|
||||
end
|
||||
285
cookbooks/chef-solo-search/libraries/vendor/chef/solr_query/lucene_nodes.rb
vendored
Normal file
285
cookbooks/chef-solo-search/libraries/vendor/chef/solr_query/lucene_nodes.rb
vendored
Normal file
@@ -0,0 +1,285 @@
|
||||
#
|
||||
# Author:: Seth Falcon (<seth@opscode.com>)
|
||||
# Copyright:: Copyright (c) 2010-2011 Opscode, Inc.
|
||||
# License:: Apache License, Version 2.0
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
#
|
||||
|
||||
require 'treetop'
|
||||
|
||||
module Lucene
|
||||
SEP = "__=__"
|
||||
|
||||
class Term < Treetop::Runtime::SyntaxNode
|
||||
def to_array
|
||||
"T:#{self.text_value}"
|
||||
end
|
||||
|
||||
def transform
|
||||
self.text_value
|
||||
end
|
||||
end
|
||||
|
||||
class Field < Treetop::Runtime::SyntaxNode
|
||||
def to_array
|
||||
field = self.elements[0].text_value
|
||||
term = self.elements[1].to_array
|
||||
"(F:#{field} #{term})"
|
||||
end
|
||||
|
||||
def transform
|
||||
field = self.elements[0].text_value
|
||||
term = self.elements[1]
|
||||
if term.is_a? Phrase
|
||||
str = term.transform
|
||||
# remove quotes
|
||||
str = str[1 ... (str.length - 1)]
|
||||
"content:\"#{field}#{SEP}#{str}\""
|
||||
else
|
||||
"content:#{field}#{SEP}#{term.transform}"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
class FieldRange < Treetop::Runtime::SyntaxNode
|
||||
|
||||
def to_array
|
||||
field = self.elements[0].text_value
|
||||
range_start = self.elements[1].to_array
|
||||
range_end = self.elements[2].to_array
|
||||
"(FR:#{field} #{left}#{range_start}#{right} #{left}#{range_end}#{right})"
|
||||
end
|
||||
|
||||
def transform
|
||||
field = self.elements[0].text_value
|
||||
range_start = self.elements[1].transform
|
||||
range_end = self.elements[2].transform
|
||||
# FIXME: handle special cases for missing start/end
|
||||
if ("*" == range_start && "*" == range_end)
|
||||
"content:#{field}#{SEP}*"
|
||||
elsif "*" == range_end
|
||||
"content:#{left}#{field}#{SEP}#{range_start} TO #{field}#{SEP}\\ufff0#{right}"
|
||||
elsif "*" == range_start
|
||||
"content:#{left}#{field}#{SEP} TO #{field}#{SEP}#{range_end}#{right}"
|
||||
else
|
||||
"content:#{left}#{field}#{SEP}#{range_start} TO #{field}#{SEP}#{range_end}#{right}"
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
class InclFieldRange < FieldRange
|
||||
def left
|
||||
"["
|
||||
end
|
||||
def right
|
||||
"]"
|
||||
end
|
||||
end
|
||||
|
||||
class ExclFieldRange < FieldRange
|
||||
def left
|
||||
"{"
|
||||
end
|
||||
def right
|
||||
"}"
|
||||
end
|
||||
end
|
||||
|
||||
class RangeValue < Treetop::Runtime::SyntaxNode
|
||||
def to_array
|
||||
self.text_value
|
||||
end
|
||||
|
||||
def transform
|
||||
to_array
|
||||
end
|
||||
end
|
||||
|
||||
class FieldName < Treetop::Runtime::SyntaxNode
|
||||
def to_array
|
||||
self.text_value
|
||||
end
|
||||
|
||||
def transform
|
||||
to_array
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
class Body < Treetop::Runtime::SyntaxNode
|
||||
def to_array
|
||||
self.elements.map { |x| x.to_array }.join(" ")
|
||||
end
|
||||
|
||||
def transform
|
||||
self.elements.map { |x| x.transform }.join(" ")
|
||||
end
|
||||
end
|
||||
|
||||
class Group < Treetop::Runtime::SyntaxNode
|
||||
def to_array
|
||||
"(" + self.elements[0].to_array + ")"
|
||||
end
|
||||
|
||||
def transform
|
||||
"(" + self.elements[0].transform + ")"
|
||||
end
|
||||
end
|
||||
|
||||
class BinaryOp < Treetop::Runtime::SyntaxNode
|
||||
def to_array
|
||||
op = self.elements[1].to_array
|
||||
a = self.elements[0].to_array
|
||||
b = self.elements[2].to_array
|
||||
"(#{op} #{a} #{b})"
|
||||
end
|
||||
|
||||
def transform
|
||||
op = self.elements[1].transform
|
||||
a = self.elements[0].transform
|
||||
b = self.elements[2].transform
|
||||
"#{a} #{op} #{b}"
|
||||
end
|
||||
end
|
||||
|
||||
class AndOperator < Treetop::Runtime::SyntaxNode
|
||||
def to_array
|
||||
"OP:AND"
|
||||
end
|
||||
|
||||
def transform
|
||||
"AND"
|
||||
end
|
||||
end
|
||||
|
||||
class OrOperator < Treetop::Runtime::SyntaxNode
|
||||
def to_array
|
||||
"OP:OR"
|
||||
end
|
||||
|
||||
def transform
|
||||
"OR"
|
||||
end
|
||||
end
|
||||
|
||||
class FuzzyOp < Treetop::Runtime::SyntaxNode
|
||||
def to_array
|
||||
a = self.elements[0].to_array
|
||||
param = self.elements[1]
|
||||
if param
|
||||
"(OP:~ #{a} #{param.to_array})"
|
||||
else
|
||||
"(OP:~ #{a})"
|
||||
end
|
||||
end
|
||||
|
||||
def transform
|
||||
a = self.elements[0].transform
|
||||
param = self.elements[1]
|
||||
if param
|
||||
"#{a}~#{param.transform}"
|
||||
else
|
||||
"#{a}~"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
class BoostOp < Treetop::Runtime::SyntaxNode
|
||||
def to_array
|
||||
a = self.elements[0].to_array
|
||||
param = self.elements[1]
|
||||
"(OP:^ #{a} #{param.to_array})"
|
||||
end
|
||||
|
||||
def transform
|
||||
a = self.elements[0].transform
|
||||
param = self.elements[1]
|
||||
"#{a}^#{param.transform}"
|
||||
end
|
||||
end
|
||||
|
||||
class FuzzyParam < Treetop::Runtime::SyntaxNode
|
||||
def to_array
|
||||
self.text_value
|
||||
end
|
||||
|
||||
def transform
|
||||
self.text_value
|
||||
end
|
||||
end
|
||||
|
||||
class UnaryOp < Treetop::Runtime::SyntaxNode
|
||||
def to_array
|
||||
op = self.elements[0].to_array
|
||||
a = self.elements[1].to_array
|
||||
"(#{op} #{a})"
|
||||
end
|
||||
|
||||
def transform
|
||||
op = self.elements[0].transform
|
||||
a = self.elements[1].transform
|
||||
spc = case op
|
||||
when "+", "-"
|
||||
""
|
||||
else
|
||||
" "
|
||||
end
|
||||
"#{op}#{spc}#{a}"
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
class NotOperator < Treetop::Runtime::SyntaxNode
|
||||
def to_array
|
||||
"OP:NOT"
|
||||
end
|
||||
|
||||
def transform
|
||||
"NOT"
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
class RequiredOperator < Treetop::Runtime::SyntaxNode
|
||||
def to_array
|
||||
"OP:+"
|
||||
end
|
||||
|
||||
def transform
|
||||
"+"
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
class ProhibitedOperator < Treetop::Runtime::SyntaxNode
|
||||
def to_array
|
||||
"OP:-"
|
||||
end
|
||||
|
||||
def transform
|
||||
"-"
|
||||
end
|
||||
end
|
||||
|
||||
class Phrase < Treetop::Runtime::SyntaxNode
|
||||
def to_array
|
||||
"STR:#{self.text_value}"
|
||||
end
|
||||
|
||||
def transform
|
||||
"#{self.text_value}"
|
||||
end
|
||||
end
|
||||
end
|
||||
65
cookbooks/chef-solo-search/libraries/vendor/chef/solr_query/query_transform.rb
vendored
Normal file
65
cookbooks/chef-solo-search/libraries/vendor/chef/solr_query/query_transform.rb
vendored
Normal file
@@ -0,0 +1,65 @@
|
||||
#
|
||||
# Author:: Seth Falcon (<seth@opscode.com>)
|
||||
# Copyright:: Copyright (c) 2010-2011 Opscode, Inc.
|
||||
# License:: Apache License, Version 2.0
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
#
|
||||
require 'treetop'
|
||||
require 'chef/solr_query/lucene_nodes'
|
||||
|
||||
class Chef
|
||||
class Exceptions
|
||||
class QueryParseError < StandardError
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
class Chef
|
||||
class SolrQuery
|
||||
class QueryTransform
|
||||
@@base_path = File.expand_path(File.dirname(__FILE__))
|
||||
Treetop.load(File.join(@@base_path, 'lucene.treetop'))
|
||||
@@parser = LuceneParser.new
|
||||
|
||||
def self.parse(data)
|
||||
tree = @@parser.parse(data)
|
||||
msg = "Parse error at offset: #{@@parser.index}\n"
|
||||
msg += "Reason: #{@@parser.failure_reason}"
|
||||
raise Chef::Exceptions::QueryParseError, msg if tree.nil?
|
||||
self.clean_tree(tree)
|
||||
tree.to_array
|
||||
end
|
||||
|
||||
def self.transform(data)
|
||||
return "*:*" if data == "*:*"
|
||||
tree = @@parser.parse(data)
|
||||
msg = "Parse error at offset: #{@@parser.index}\n"
|
||||
msg += "Reason: #{@@parser.failure_reason}"
|
||||
raise Chef::Exceptions::QueryParseError, msg if tree.nil?
|
||||
self.clean_tree(tree)
|
||||
tree.transform
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def self.clean_tree(root_node)
|
||||
return if root_node.elements.nil?
|
||||
root_node.elements.delete_if do |node|
|
||||
node.class.name == "Treetop::Runtime::SyntaxNode"
|
||||
end
|
||||
root_node.elements.each { |node| self.clean_tree(node) }
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user