Class: Clause
- Inherits:
-
Object
- Object
- Clause
- Defined in:
- lib/enju_biblio/porta_cql.rb
Constant Summary collapse
- INDEX =
/(dpid|dpgroupid|title|creator|publisher|ndc|description|subject|isbn|issn|jpno|from|until|anywhere|porta_type|digitalize_type|webget_type|payment_type|ndl_agent_type|ndlc|itemno)/io
- SORT_BY =
/sortBy/io
- RELATION =
/(=|exact|\^|any|all)/io
- MATCH_ALL =
%w[title creator publisher]- MATCH_EXACT =
%w[dpid dpgroupid isbn issn jpno porta_type digitalize_type webget_type payment_type ndl_agent_type itemno]- MATCH_PART =
%w[description subject]- MATCH_AHEAD =
%w[ndc ndlc]- MATCH_DATE =
%w[from until]- MATCH_ANYWHERE =
%w[anywhere]- LOGIC_ALL =
%w[title creator publisher description subject anywhere]- LOGIC_ANY =
%w[dpid ndl_agent_type]- LOGIC_EQUAL =
%w[dpgroupid ndc isbn issn jpno from until porta_type digitalize_type webget_type payment_type ndlc itemno]- MULTIPLE =
%w[dpid title creator publisher description subject anywhere ndl_agent_type]
Instance Attribute Summary collapse
-
#index ⇒ Object
readonly
Returns the value of attribute index.
-
#relation ⇒ Object
readonly
Returns the value of attribute relation.
-
#terms ⇒ Object
readonly
Returns the value of attribute terms.
Instance Method Summary collapse
- #==(other) ⇒ Object
-
#initialize(text) ⇒ Clause
constructor
A new instance of Clause.
- #logic_adapter ⇒ Object
- #multiple_adapter ⇒ Object
- #porta_adapter ⇒ Object
- #scan(text) ⇒ Object
- #to_sunspot ⇒ Object
- #to_sunspot_match_ahead ⇒ Object
- #to_sunspot_match_all ⇒ Object
- #to_sunspot_match_anywhere ⇒ Object
- #to_sunspot_match_exact ⇒ Object
- #to_sunspot_match_part ⇒ Object
Constructor Details
#initialize(text) ⇒ Clause
Returns a new instance of Clause.
116 117 118 119 120 121 122 123 124 |
# File 'lib/enju_biblio/porta_cql.rb', line 116 def initialize(text) unless text.empty? @index, @relation, @terms = scan(text) porta_adapter @field = @index else @index = '' end end |
Instance Attribute Details
#index ⇒ Object (readonly)
Returns the value of attribute index.
126 127 128 |
# File 'lib/enju_biblio/porta_cql.rb', line 126 def index @index end |
#relation ⇒ Object (readonly)
Returns the value of attribute relation.
126 127 128 |
# File 'lib/enju_biblio/porta_cql.rb', line 126 def relation @relation end |
#terms ⇒ Object (readonly)
Returns the value of attribute terms.
126 127 128 |
# File 'lib/enju_biblio/porta_cql.rb', line 126 def terms @terms end |
Instance Method Details
#==(other) ⇒ Object
128 129 130 131 132 |
# File 'lib/enju_biblio/porta_cql.rb', line 128 def ==(other) instance_variables.all? do |val| instance_variable_get(val) == other.instance_variable_get(val) end end |
#logic_adapter ⇒ Object
168 169 170 171 172 173 174 175 176 177 |
# File 'lib/enju_biblio/porta_cql.rb', line 168 def logic_adapter case when LOGIC_ALL.include?(@index) raise AdapterError unless %w[ALL ANY = EXACT ^].include?(@relation) when LOGIC_ANY.include?(@index) raise AdapterError unless %w[ANY =].include?(@relation) when LOGIC_EQUAL.include?(@index) raise AdapterError unless %w[=].include?(@relation) end end |
#multiple_adapter ⇒ Object
179 180 181 182 183 |
# File 'lib/enju_biblio/porta_cql.rb', line 179 def multiple_adapter unless MULTIPLE.include?(@index) raise AdapterError if @terms.size > 1 end end |
#porta_adapter ⇒ Object
163 164 165 166 |
# File 'lib/enju_biblio/porta_cql.rb', line 163 def porta_adapter logic_adapter multiple_adapter end |
#scan(text) ⇒ Object
134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 |
# File 'lib/enju_biblio/porta_cql.rb', line 134 def scan(text) ss = StringScanner.new(text) index = '' relation = '' terms = [] if ss.scan(INDEX) or ss.scan(SORT_BY) index = ss[0] end # else # raise ScannerError, "index or the sortBy is requested in '#{text}'" # end ss.scan(/\s+/) if ss.scan(RELATION) relation = ss[0].upcase end # else # raise ScannerError, "relation is requested in '#{text}'" # end ss.scan(/\s+/) if ss.scan(/.+/) terms = ss[0].gsub(/(\A\"|\"\Z)/, '').split else raise ScannerError, "search term(s) is requested in '#{text}'" end [index, relation, terms] end |
#to_sunspot ⇒ Object
185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 |
# File 'lib/enju_biblio/porta_cql.rb', line 185 def to_sunspot case when MATCH_ALL.include?(@index) to_sunspot_match_all when MATCH_EXACT.include?(@index) to_sunspot_match_exact when MATCH_PART.include?(@index) to_sunspot_match_part when MATCH_AHEAD.include?(@index) to_sunspot_match_ahead when MATCH_ANYWHERE.include?(@index) to_sunspot_match_anywhere when @index.empty? @terms.join(' ') end end |
#to_sunspot_match_ahead ⇒ Object
250 251 252 |
# File 'lib/enju_biblio/porta_cql.rb', line 250 def to_sunspot_match_ahead "%s_%s:(%s*)" % [@field, :s, @terms.first] end |
#to_sunspot_match_all ⇒ Object
202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 |
# File 'lib/enju_biblio/porta_cql.rb', line 202 def to_sunspot_match_all term = @terms.join(' ') case @relation when /\A=\Z/ unless /\A\^(.+)/ =~ term "%s_%s:(%s)" % [@field, :text, term] else ahead_tarm = $1.gsub("\s", '').downcase "connect_%s_%s:(%s*)" % [@field, :s, ahead_tarm] end when /\AEXACT\Z/ "%s_%s:(%s)" % [@field, :sm, term.gsub(' ', '')] when /\AANY\Z/ "%s_%s:(%s)" % [@field, :text, multiple_to_sunspot(@terms, :any)] when /\AALL\Z/ "%s_%s:(%s)" % [@field, :text, multiple_to_sunspot(@terms, :all)] else raise QuerySyntaxError end end |
#to_sunspot_match_anywhere ⇒ Object
254 255 256 257 258 259 260 261 262 263 264 265 266 |
# File 'lib/enju_biblio/porta_cql.rb', line 254 def to_sunspot_match_anywhere case @relation when /\A=\Z/ term = @terms.join(' ') "(%s)" % [trim_ahead(term)] when /\AANY\Z/ "(%s)" % [multiple_to_sunspot(@terms, :any)] when /\AALL\Z/ "(%s)" % [multiple_to_sunspot(@terms, :all)] else raise QuerySyntaxError end end |
#to_sunspot_match_exact ⇒ Object
223 224 225 226 227 228 229 230 231 232 233 234 |
# File 'lib/enju_biblio/porta_cql.rb', line 223 def to_sunspot_match_exact case @relation when /\A=\Z/ term = @terms.join(' ') type = @field != 'issn' ? :sm : :s "%s_%s:(%s)" % [@field, type, term] when /\AANY\Z/ "%s_%s:(%s)" % [@field, :sm, multiple_to_sunspot(@terms, :any)] else raise QuerySyntaxError end end |
#to_sunspot_match_part ⇒ Object
236 237 238 239 240 241 242 243 244 245 246 247 248 |
# File 'lib/enju_biblio/porta_cql.rb', line 236 def to_sunspot_match_part case @relation when /\A=\Z/ term = @terms.join(' ') "%s_%s:(%s)" % [@field, :text, trim_ahead(term)] when /\AANY\Z/ "%s_%s:(%s)" % [@field, :text, multiple_to_sunspot(@terms, :any)] when /\AALL\Z/ "%s_%s:(%s)" % [@field, :text, multiple_to_sunspot(@terms, :all)] else raise QuerySyntaxError end end |