lucid_works 0.2.0 → 0.3.9
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -0
- data/LICENSE +202 -0
- data/NOTICE +202 -0
- data/README.rdoc +285 -0
- data/Rakefile +9 -3
- data/config/locales/en.yml +106 -0
- data/lib/lucid_works/associations.rb +60 -35
- data/lib/lucid_works/base.rb +170 -55
- data/lib/lucid_works/collection/info.rb +13 -0
- data/lib/lucid_works/collection/settings.rb +14 -0
- data/lib/lucid_works/collection.rb +11 -3
- data/lib/lucid_works/crawler.rb +8 -0
- data/lib/lucid_works/datasource/crawldata.rb +9 -0
- data/lib/lucid_works/datasource/history.rb +10 -2
- data/lib/lucid_works/datasource/schedule.rb +7 -0
- data/lib/lucid_works/datasource/status.rb +45 -0
- data/lib/lucid_works/datasource.rb +48 -29
- data/lib/lucid_works/field.rb +53 -0
- data/lib/lucid_works/logs.rb +1 -2
- data/lib/lucid_works/schema.rb +72 -0
- data/lib/lucid_works/server.rb +2 -2
- data/lib/lucid_works/version.rb +1 -1
- data/lib/lucid_works.rb +12 -0
- data/spec/lib/lucid_works/associations_spec.rb +41 -14
- data/spec/lib/lucid_works/base_spec.rb +209 -75
- data/spec/lib/lucid_works/collection_spec.rb +16 -4
- data/spec/lib/lucid_works/datasource/history_spec.rb +47 -0
- data/spec/lib/lucid_works/datasource/status_spec.rb +52 -0
- data/spec/lib/lucid_works/datasource_spec.rb +33 -36
- data/spec/lib/lucid_works/field_spec.rb +23 -0
- data/spec/lib/lucid_works/schema_spec.rb +50 -0
- metadata +18 -2
data/lib/lucid_works/base.rb
CHANGED
@@ -2,29 +2,35 @@ module LucidWorks
|
|
2
2
|
|
3
3
|
# LucidWorks::Base is our REST ORM foundation.
|
4
4
|
#
|
5
|
-
#
|
6
|
-
#
|
7
|
-
# (e.g. parameters must always be nested inside :resouce => {}).
|
5
|
+
# class Collection < LucidWorks::Base
|
6
|
+
# end
|
8
7
|
#
|
9
|
-
#
|
10
|
-
# - send new id with POST
|
11
|
-
# - associations
|
12
|
-
# - multipart POST
|
8
|
+
# When creating or retrieving objects, a parent LucidWorks::Base or LucidWorks::Server object must be supplied, e.g.
|
13
9
|
#
|
14
|
-
#
|
15
|
-
# simultaneously, which was so orthogonal to the design of ActiveResource that patching it to support this would
|
16
|
-
# require a major re-write.
|
10
|
+
# server = LucidWorks::Server.new('http://localhost:8888')
|
17
11
|
#
|
18
|
-
#
|
12
|
+
# collection = Collection.find('collection1', :parent => server)
|
19
13
|
#
|
20
|
-
#
|
21
|
-
#
|
14
|
+
# datasource = Datasource.find(1, :parent => collection)
|
15
|
+
#
|
16
|
+
# This mechanism is used to build up the URI that will be used to manipulate the object in the REST API.
|
17
|
+
# For the above example:
|
18
|
+
#
|
19
|
+
# datasource.uri -> http://localhost:8888/api/collections/collection1/datasources/1
|
20
|
+
#
|
21
|
+
# If you are accessing models using associations, the parent argument is taken care of for you:
|
22
|
+
#
|
23
|
+
# datasource = server.collection('collection1').datasource(1)
|
22
24
|
|
23
25
|
class Base
|
26
|
+
# Much of the internal structure here (method names etc) will resemble ActiveResource as I have spent much time
|
27
|
+
# wandering through that code.
|
28
|
+
|
24
29
|
include ActiveModel::Validations
|
25
30
|
include ActiveModel::Conversion
|
26
|
-
extend
|
27
|
-
|
31
|
+
extend ActiveModel::Naming
|
32
|
+
extend ActiveModel::Translation
|
33
|
+
extend ActiveModel::Callbacks
|
28
34
|
include Associations
|
29
35
|
|
30
36
|
attr_accessor :parent # :nodoc:
|
@@ -33,17 +39,50 @@ module LucidWorks
|
|
33
39
|
attr_accessor :raw_response # :nodoc:
|
34
40
|
attr_accessor :response_data # :nodoc:
|
35
41
|
|
42
|
+
define_model_callbacks :save, :only => [:before, :after]
|
43
|
+
|
36
44
|
class << self
|
45
|
+
include ActionView::Helpers::NumberHelper rescue nil
|
46
|
+
|
37
47
|
attr_accessor_with_default :primary_key, :id
|
38
|
-
attr_accessor :collection_name
|
48
|
+
attr_accessor :collection_name # :nodoc:
|
39
49
|
attr_accessor_with_default :singleton, false
|
50
|
+
attr_accessor_with_default :has_schema, false
|
51
|
+
|
52
|
+
# The attributes for a model are ascertained in on of two ways.
|
53
|
+
# Without a schema, the attributes list is automatically generated when the the object is retrieved from the server.
|
54
|
+
# Alternatively, you may define a schema for your object.
|
55
|
+
# Objects with attributes defined by schemas may have validations run against those attributes during creation.
|
56
|
+
#
|
57
|
+
# Schema should be passed a block:
|
58
|
+
#
|
59
|
+
# class Collection < LucidWorks::Base
|
60
|
+
# schema do
|
61
|
+
# attribute :name
|
62
|
+
# end
|
63
|
+
#
|
64
|
+
# validates_presence_of :name
|
65
|
+
# end
|
66
|
+
|
67
|
+
def schema(&block)
|
68
|
+
@schema ||= Schema.new
|
69
|
+
if block_given?
|
70
|
+
@schema.instance_eval(&block)
|
71
|
+
@schema.create_accessors_for_attributes(self)
|
72
|
+
self.has_schema = true
|
73
|
+
end
|
74
|
+
@schema
|
75
|
+
end
|
76
|
+
|
77
|
+
# Create a new model.
|
78
|
+
#
|
79
|
+
# MyObject.create(attr => value, ..., :parent => server_or_object)
|
40
80
|
|
41
81
|
def create(*arguments)
|
42
82
|
new(*arguments).tap { |model| model.save }
|
43
83
|
end
|
44
84
|
|
45
85
|
# Retrieve one or more models from the server.
|
46
|
-
#
|
47
86
|
# Find may be called in the following ways:
|
48
87
|
#
|
49
88
|
# Retrieve an entire collection:
|
@@ -57,10 +96,10 @@ module LucidWorks
|
|
57
96
|
# find(options)
|
58
97
|
# find(:singleton, options)
|
59
98
|
#
|
60
|
-
#
|
99
|
+
# === Options
|
61
100
|
#
|
62
101
|
# :parent - mandatory, another LucidWorks::Base instance or a LucidWorks::Server instance.
|
63
|
-
|
102
|
+
|
64
103
|
def find(*arguments)
|
65
104
|
unless arguments.first.is_a?(Symbol)
|
66
105
|
# We weren't called with a symbol, figure out what kind of find this is and re-call
|
@@ -85,6 +124,7 @@ module LucidWorks
|
|
85
124
|
|
86
125
|
parent = extract_parent_from_options(options)
|
87
126
|
includes = options.delete(:include)
|
127
|
+
order = options.delete(:order)
|
88
128
|
|
89
129
|
url = case kind_of_find
|
90
130
|
when :all; collection_url(parent)
|
@@ -92,7 +132,12 @@ module LucidWorks
|
|
92
132
|
when :singleton; "#{parent.uri}/#{singleton_name}"
|
93
133
|
end
|
94
134
|
|
95
|
-
raw_response =
|
135
|
+
raw_response = ActiveSupport::Notifications.instrument("lucid_works.request") do |payload|
|
136
|
+
payload[:method] = :get
|
137
|
+
payload[:uri] = url
|
138
|
+
payload[:response] = RestClient.get(url)
|
139
|
+
end
|
140
|
+
|
96
141
|
data = JSON.parse(raw_response)
|
97
142
|
|
98
143
|
results =
|
@@ -119,9 +164,12 @@ module LucidWorks
|
|
119
164
|
end
|
120
165
|
end
|
121
166
|
|
167
|
+
results.sort! { |a,b| a.send(order) <=> b.send(order) } if order
|
122
168
|
results
|
123
169
|
end
|
124
170
|
|
171
|
+
# Shortcut for find(:all, options)
|
172
|
+
|
125
173
|
def all(options)
|
126
174
|
find(:all, options)
|
127
175
|
end
|
@@ -134,6 +182,43 @@ module LucidWorks
|
|
134
182
|
find(:all, options).last
|
135
183
|
end
|
136
184
|
|
185
|
+
# Convert the attribute value to a string. If a schema has been defined for the modeland a type has
|
186
|
+
# been defined for the attribute, it will have formatting applied as follows:
|
187
|
+
#
|
188
|
+
# - <tt>boolean</tt> will be converted to 'yes' or 'no'
|
189
|
+
# - <tt>integer</tt> will be passed to number_with_delimter
|
190
|
+
#
|
191
|
+
# If the attributes is listed in the schema as having :values =>, it will be translated.
|
192
|
+
|
193
|
+
def human_attribute_value(attribute, value)
|
194
|
+
if schema[attribute][:values]
|
195
|
+
l10n_scope = %w{activemodel models} + self.name.underscore.split('/') + [attribute]
|
196
|
+
return I18n.t(value, :scope => l10n_scope, :default => value)
|
197
|
+
end
|
198
|
+
|
199
|
+
case schema[attribute][:type]
|
200
|
+
when :boolean
|
201
|
+
value.to_yesno
|
202
|
+
when :integer
|
203
|
+
number_with_delimiter(value)
|
204
|
+
else
|
205
|
+
value.to_s
|
206
|
+
end
|
207
|
+
rescue
|
208
|
+
value.to_s
|
209
|
+
end
|
210
|
+
|
211
|
+
# For attributes listed in the schema as having :values, this will create an array-of-arrays
|
212
|
+
# suitable for use as options_for_select. The
|
213
|
+
|
214
|
+
def to_select(attribute)
|
215
|
+
raise "Can't to_select for #{attribute} as it has no values" unless schema[attribute][:values]
|
216
|
+
l10n_scope = %w{activemodel models} + self.name.underscore.split('/') + [attribute]
|
217
|
+
schema[attribute][:values].map do |value|
|
218
|
+
[human_attribute_value(attribute, value), value]
|
219
|
+
end
|
220
|
+
end
|
221
|
+
|
137
222
|
def collection_name # :nodoc:
|
138
223
|
@collection_name || name.underscore.gsub(/^.*\//, '').pluralize
|
139
224
|
end
|
@@ -166,29 +251,49 @@ module LucidWorks
|
|
166
251
|
raise ArgumentError.new("new requires a Hash") unless options.is_a?(Hash)
|
167
252
|
@parent = self.class.extract_parent_from_options(options)
|
168
253
|
@persisted = options.delete(:persisted) || singleton? || false
|
169
|
-
@attributes =
|
254
|
+
@attributes = {}.with_indifferent_access
|
255
|
+
load_attributes(options)
|
170
256
|
end
|
171
257
|
|
172
258
|
def save
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
259
|
+
_run_save_callbacks do
|
260
|
+
if valid?
|
261
|
+
ActiveSupport::Notifications.instrument("lucid_works.request") do |payload|
|
262
|
+
method, uri = persisted? ? [:put, member_url] : [:post, collection_url]
|
263
|
+
data = encode
|
264
|
+
payload[:method] = method
|
265
|
+
payload[:uri] = uri
|
266
|
+
payload[:data] = data
|
267
|
+
begin
|
268
|
+
response = RestClient.send(method, uri, data, :content_type => :json)
|
269
|
+
payload[:response] = response
|
270
|
+
@persisted = true
|
271
|
+
load_attributes_from_json_string(response)
|
272
|
+
true
|
273
|
+
rescue RestClient::UnprocessableEntity, RestClient::Conflict => e
|
274
|
+
payload[:exception] = e
|
275
|
+
attach_errors_to_model(e.response)
|
276
|
+
false
|
277
|
+
end
|
180
278
|
end
|
181
|
-
load_attributes_from_json_string(response)
|
182
|
-
true
|
183
|
-
rescue RestClient::UnprocessableEntity, RestClient::Conflict => e
|
184
|
-
attach_errors_to_model(e.response)
|
185
|
-
false
|
186
279
|
end
|
187
280
|
end
|
188
281
|
end
|
189
|
-
|
282
|
+
|
283
|
+
def update_attributes(attrs_and_values)
|
284
|
+
attrs_and_values.each do |attr,value|
|
285
|
+
self.send("#{attr}=", value)
|
286
|
+
end
|
287
|
+
save
|
288
|
+
end
|
289
|
+
|
190
290
|
def destroy(options={})
|
191
|
-
|
291
|
+
ActiveSupport::Notifications.instrument("lucid_works.request") do |payload|
|
292
|
+
payload[:method] = :delete
|
293
|
+
payload[:uri] = member_url
|
294
|
+
payload[:options] = options
|
295
|
+
payload[:repsonse] = RestClient.delete(member_url, options)
|
296
|
+
end
|
192
297
|
end
|
193
298
|
|
194
299
|
def id # :nodoc:
|
@@ -203,21 +308,6 @@ module LucidWorks
|
|
203
308
|
@persisted
|
204
309
|
end
|
205
310
|
|
206
|
-
def method_missing(method_sym, *arguments) # :nodoc:
|
207
|
-
return super if method_sym == :to_ary
|
208
|
-
if method_sym.to_s =~ /^(\w+)=$/
|
209
|
-
return @attributes[$1] = arguments.first
|
210
|
-
elsif method_sym.to_s =~ /^(\w+)\?$/
|
211
|
-
attr = $1
|
212
|
-
predicate = true
|
213
|
-
else
|
214
|
-
attr = method_sym
|
215
|
-
predicate = false
|
216
|
-
end
|
217
|
-
raise "Unknown attribute: '#{attr}'" unless @attributes.has_key?(attr)
|
218
|
-
predicate ? !!@attributes[attr] : @attributes[attr]
|
219
|
-
end
|
220
|
-
|
221
311
|
def read_attribute_for_validation(key) # :nodoc:
|
222
312
|
@attributes[key]
|
223
313
|
end
|
@@ -236,10 +326,17 @@ module LucidWorks
|
|
236
326
|
|
237
327
|
alias :uri :member_url
|
238
328
|
|
239
|
-
def inspect
|
329
|
+
def inspect # :nodoc:
|
240
330
|
"<#{self.class.name} " + @attributes.map { |k,v| "#{k}=#{v.inspect}" }.join(" ") + ">"
|
241
331
|
end
|
242
332
|
|
333
|
+
# Convert the attribute value to a string.
|
334
|
+
# See LucidWorks::Base.human_attribute_values for details.
|
335
|
+
|
336
|
+
def human_attribute_value(attribute)
|
337
|
+
self.class.human_attribute_value(attribute, send(attribute))
|
338
|
+
end
|
339
|
+
|
243
340
|
private
|
244
341
|
|
245
342
|
def singleton? # :nodoc:
|
@@ -254,12 +351,30 @@ module LucidWorks
|
|
254
351
|
@attributes.reject { |k,v| k.to_s == 'id'}.to_json
|
255
352
|
end
|
256
353
|
|
257
|
-
def
|
258
|
-
|
259
|
-
|
260
|
-
|
354
|
+
def load_attributes(attributes_and_values) # :nodoc:
|
355
|
+
attributes_and_values.each do |attr, value|
|
356
|
+
# Special cases - don't overwrite built-in accessors
|
357
|
+
if attr.to_sym == :id
|
358
|
+
self.id = value
|
359
|
+
next
|
360
|
+
elsif self.class.respond_to?(:belongs_to_association_name) && attr.to_sym == self.class.belongs_to_association_name
|
361
|
+
next # Dont overwrite our connection to our parent
|
362
|
+
end
|
363
|
+
unless self.class.schema.has_attribute?(attr)
|
364
|
+
if self.class.has_schema
|
365
|
+
raise "unknown attribute: \"#{attr}\""
|
366
|
+
else
|
367
|
+
self.class.schema.add_attribute(self.class, attr, :string)
|
368
|
+
end
|
369
|
+
end
|
370
|
+
@attributes[attr] = value
|
261
371
|
end
|
262
372
|
end
|
373
|
+
|
374
|
+
def load_attributes_from_json_string(response) # :nodoc:
|
375
|
+
attribute_data = JSON.parse(response) rescue {}
|
376
|
+
load_attributes(attribute_data)
|
377
|
+
end
|
263
378
|
|
264
379
|
def attach_errors_to_model(response) # :nodoc:
|
265
380
|
data = JSON.parse(response) rescue nil
|
@@ -4,6 +4,19 @@ module LucidWorks
|
|
4
4
|
class Info < Base
|
5
5
|
self.singleton = true
|
6
6
|
belongs_to :collection
|
7
|
+
|
8
|
+
schema do
|
9
|
+
attributes :free_disk_space, :total_disk_space, :index_size,
|
10
|
+
:index_last_modified, :collection_name,
|
11
|
+
:data_dir, :root_dir, :instance_dir,
|
12
|
+
:type => :string
|
13
|
+
attribute :index_directory # a hash
|
14
|
+
attributes :index_size_bytes, :free_disk_bytes, :total_disk_bytes,
|
15
|
+
:index_max_doc, :index_num_docs, :index_version,
|
16
|
+
:type => :integer
|
17
|
+
attributes :index_has_deletions, :index_is_optimized, :index_is_current,
|
18
|
+
:type => :boolean
|
19
|
+
end
|
7
20
|
end
|
8
21
|
end
|
9
22
|
end
|
@@ -4,6 +4,20 @@ module LucidWorks
|
|
4
4
|
class Settings < Base
|
5
5
|
self.singleton = true
|
6
6
|
belongs_to :collection
|
7
|
+
|
8
|
+
DEDUP_OPTIONS = %w{ off overwrite tag }
|
9
|
+
|
10
|
+
schema do
|
11
|
+
attributes :unsupervised_feedback_emphasis, :unknown_type_handling,
|
12
|
+
:click_boost_field, :click_boost_data, :query_parser, :default_sort,
|
13
|
+
:type => :string
|
14
|
+
attribute :de_duplication, :string, :values => DEDUP_OPTIONS
|
15
|
+
attributes :spellcheck, :display_facets, :ssl, :unsupervised_feedback, :query_time_stopwords,
|
16
|
+
:auto_complete, :boost_recent, :click_enabled, :show_similar, :query_time_synonyms,
|
17
|
+
:index_time_stopwords, :type => :boolean
|
18
|
+
attributes :search_server_list, :update_server_list, :stopword_list, :boosts, :synonym_list # Arrays
|
19
|
+
attribute :elevations # Hash
|
20
|
+
end
|
7
21
|
end
|
8
22
|
end
|
9
23
|
end
|
@@ -4,11 +4,19 @@ module LucidWorks
|
|
4
4
|
|
5
5
|
self.primary_key = :name
|
6
6
|
|
7
|
-
has_many :datasources
|
8
|
-
has_one :info, :settings
|
7
|
+
has_many :datasources, :fields
|
8
|
+
has_one :info, :settings
|
9
|
+
has_one :index, :has_content => false
|
9
10
|
|
11
|
+
schema do
|
12
|
+
attribute :name
|
13
|
+
attribute :instance_dir
|
14
|
+
end
|
15
|
+
|
16
|
+
validates_presence_of :name
|
17
|
+
|
10
18
|
def empty!
|
11
|
-
|
19
|
+
index.destroy(:params => {:key => 'iaccepttherisk'})
|
12
20
|
end
|
13
21
|
end
|
14
22
|
end
|
@@ -9,8 +9,16 @@ module LucidWorks
|
|
9
9
|
numUpdated + numNew + numUnchanged
|
10
10
|
end
|
11
11
|
|
12
|
-
def
|
13
|
-
|
12
|
+
def crawl_stopped
|
13
|
+
Time.iso8601 crawlStopped
|
14
|
+
end
|
15
|
+
|
16
|
+
def crawl_started
|
17
|
+
Time.iso8601 crawlStarted
|
18
|
+
end
|
19
|
+
|
20
|
+
def duration
|
21
|
+
crawl_stopped - crawl_started
|
14
22
|
end
|
15
23
|
end
|
16
24
|
end
|
@@ -4,6 +4,51 @@ module LucidWorks
|
|
4
4
|
class Status < Base
|
5
5
|
self.singleton = true
|
6
6
|
belongs_to :datasource
|
7
|
+
|
8
|
+
schema do
|
9
|
+
attributes :crawlStarted, :crawlState, :crawlStopped, :jobId
|
10
|
+
attributes :numUnchanged, :numUpdated, :numNew, :numFailed, :numDeleted, :type => :integer
|
11
|
+
end
|
12
|
+
|
13
|
+
STOPPED_STATES = %w{ IDLE STOPPED ABORTED EXCEPTION FINISHED }
|
14
|
+
POST_PROCESSING_STATES = %w{ STOPPING ABORTING }
|
15
|
+
CRAWLSTATES = STOPPED_STATES + [ 'RUNNING' ] + POST_PROCESSING_STATES
|
16
|
+
|
17
|
+
# Create predicate methods for all the crawl states
|
18
|
+
CRAWLSTATES.each do |state|
|
19
|
+
method_name = state.downcase + "?"
|
20
|
+
class_eval <<-EOF
|
21
|
+
def #{method_name}
|
22
|
+
self.crawlState == "#{state}"
|
23
|
+
end
|
24
|
+
EOF
|
25
|
+
end
|
26
|
+
|
27
|
+
def stopped?
|
28
|
+
STOPPED_STATES.include?(crawlState)
|
29
|
+
end
|
30
|
+
|
31
|
+
def post_processing?
|
32
|
+
POST_PROCESSING_STATES.include?(crawlState)
|
33
|
+
end
|
34
|
+
|
35
|
+
def doc_count
|
36
|
+
numUpdated + numNew + numUnchanged
|
37
|
+
end
|
38
|
+
|
39
|
+
def t_crawl_state
|
40
|
+
I18n.translate(crawlState.downcase,
|
41
|
+
:scope => 'activemodel.models.lucid_works.datasource.status.crawl_state',
|
42
|
+
:default => crawlState)
|
43
|
+
end
|
44
|
+
|
45
|
+
def crawl_started
|
46
|
+
Time.iso8601 crawlStarted
|
47
|
+
end
|
48
|
+
|
49
|
+
def elapsed_time
|
50
|
+
Time.now - crawl_started
|
51
|
+
end
|
7
52
|
end
|
8
53
|
end
|
9
54
|
end
|
@@ -3,38 +3,57 @@ module LucidWorks
|
|
3
3
|
class Datasource < Base
|
4
4
|
belongs_to :collection
|
5
5
|
has_many :histories, :class_name => :history
|
6
|
-
has_one
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
:
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
:
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
6
|
+
has_one :status, :schedule, :crawldata
|
7
|
+
has_one :index, :has_content => false
|
8
|
+
|
9
|
+
schema do
|
10
|
+
# common
|
11
|
+
attributes :name, :type, :crawler
|
12
|
+
attributes :crawl_depth, :max_bytes, :type => :integer
|
13
|
+
attribute :include_paths
|
14
|
+
attribute :exclude_paths
|
15
|
+
attribute :mapping # Hash
|
16
|
+
attribute :bounds
|
17
|
+
# web
|
18
|
+
attributes :url, :category
|
19
|
+
attribute :collect_links, :boolean
|
20
|
+
# file
|
21
|
+
attribute :path
|
22
|
+
attribute :follow_links, :boolean
|
23
|
+
end
|
24
|
+
|
25
|
+
validates_presence_of :type, :crawler, :name, :crawl_depth
|
26
|
+
validates_numericality_of :max_bytes, :allow_blank => true
|
27
|
+
validates_presence_of :url, :if => lambda { |d| d.type == 'web' }
|
28
|
+
|
29
|
+
before_save :remove_blank_max_bytes
|
30
|
+
|
31
|
+
TYPES = %w{ file web solrxml jdbc sharepoint }
|
32
|
+
BOUNDS = %w{ tree none }
|
33
|
+
CRAWLERS = {
|
34
|
+
# Later we may change these to be arrays if we decide to support more than one choice
|
35
|
+
# e.g. :web => ['lucid.aperture', 'nutch']
|
36
|
+
:file => 'lucid.aperture',
|
37
|
+
:web => 'lucid.aperture',
|
38
|
+
:solrxml => 'lucid.solrxml',
|
39
|
+
:jdbc => 'lucid.jdbc',
|
40
|
+
:sharepoint => 'lucid.gcm'
|
34
41
|
}.with_indifferent_access
|
35
42
|
|
43
|
+
|
36
44
|
def empty!
|
37
|
-
|
45
|
+
index.destroy
|
46
|
+
end
|
47
|
+
|
48
|
+
def t_type
|
49
|
+
I18n.t(type, :scope => 'activemodel.models.lucid_works.datasource.type')
|
50
|
+
end
|
51
|
+
|
52
|
+
private
|
53
|
+
|
54
|
+
def remove_blank_max_bytes # :nodoc:
|
55
|
+
# API can't handle a blank max_bytes. Send nothing to select 'unlimited'
|
56
|
+
@attributes.delete :max_bytes if self.max_bytes.blank?
|
38
57
|
end
|
39
58
|
end
|
40
59
|
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
module LucidWorks
|
2
|
+
|
3
|
+
class Field < Base
|
4
|
+
belongs_to :collection
|
5
|
+
|
6
|
+
TYPES = [
|
7
|
+
'string',
|
8
|
+
'boolean',
|
9
|
+
'binary',
|
10
|
+
'int',
|
11
|
+
'float',
|
12
|
+
'long',
|
13
|
+
'double',
|
14
|
+
'tint',
|
15
|
+
'tfloat',
|
16
|
+
'tlong',
|
17
|
+
'tdouble',
|
18
|
+
'uri',
|
19
|
+
'date',
|
20
|
+
'tdate',
|
21
|
+
'text_ws',
|
22
|
+
'text_en',
|
23
|
+
'text_porter_en',
|
24
|
+
'textTight',
|
25
|
+
'text_cjk',
|
26
|
+
'text_da',
|
27
|
+
'text_de',
|
28
|
+
'text_es',
|
29
|
+
'text_fr',
|
30
|
+
'text_it',
|
31
|
+
'text_nl',
|
32
|
+
'text_pt',
|
33
|
+
'text_ru',
|
34
|
+
'text_se',
|
35
|
+
'text_fi',
|
36
|
+
'random',
|
37
|
+
'comma-separated',
|
38
|
+
'textSpell',
|
39
|
+
'payloads',
|
40
|
+
'point',
|
41
|
+
'location',
|
42
|
+
'geohash'
|
43
|
+
]
|
44
|
+
|
45
|
+
def t_field_type
|
46
|
+
self.class.t_field_type(self.field_type)
|
47
|
+
end
|
48
|
+
|
49
|
+
def self.t_field_type(type)
|
50
|
+
I18n.translate(type, :scope => 'activemodel.models.lucid_works.collection.field.field_type')
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|