active-fedora 11.5.6 → 12.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. checksums.yaml +5 -5
  2. data/.rubocop.yml +4 -0
  3. data/.travis.yml +15 -0
  4. data/Gemfile +1 -3
  5. data/README.md +10 -13
  6. data/active-fedora.gemspec +7 -9
  7. data/lib/active_fedora.rb +3 -5
  8. data/lib/active_fedora/associations/collection_proxy.rb +0 -2
  9. data/lib/active_fedora/attributes/property_builder.rb +3 -1
  10. data/lib/active_fedora/caching_connection.rb +1 -1
  11. data/lib/active_fedora/errors.rb +4 -0
  12. data/lib/active_fedora/fedora.rb +5 -0
  13. data/lib/active_fedora/file.rb +3 -1
  14. data/lib/active_fedora/file/attributes.rb +5 -0
  15. data/lib/active_fedora/file_io.rb +120 -0
  16. data/lib/active_fedora/indexing.rb +6 -1
  17. data/lib/active_fedora/indexing/default_descriptors.rb +128 -0
  18. data/lib/active_fedora/indexing/descendant_fetcher.rb +22 -18
  19. data/lib/active_fedora/indexing/descriptor.rb +44 -0
  20. data/lib/active_fedora/indexing/field_mapper.rb +146 -0
  21. data/lib/active_fedora/indexing/inserter.rb +40 -0
  22. data/lib/active_fedora/indexing/suffix.rb +81 -0
  23. data/lib/active_fedora/indexing_service.rb +2 -2
  24. data/lib/active_fedora/ldp_resource.rb +1 -2
  25. data/lib/active_fedora/railtie.rb +0 -1
  26. data/lib/active_fedora/rdf/field_map_entry.rb +2 -2
  27. data/lib/active_fedora/rdf/indexing_service.rb +6 -6
  28. data/lib/active_fedora/relation.rb +0 -14
  29. data/lib/active_fedora/relation/delegation.rb +1 -2
  30. data/lib/active_fedora/relation/finder_methods.rb +19 -39
  31. data/lib/active_fedora/version.rb +1 -1
  32. data/lib/generators/active_fedora/config/fedora/templates/.fcrepo_wrapper +1 -1
  33. data/lib/generators/active_fedora/config/solr/templates/solr.yml +3 -3
  34. data/lib/generators/active_fedora/config/solr/templates/solr/config/schema.xml +34 -33
  35. data/spec/integration/base_spec.rb +39 -35
  36. data/spec/integration/indexing/descendant_fetcher_spec.rb +64 -0
  37. data/spec/integration/relation_spec.rb +1 -39
  38. data/spec/integration/scoping_spec.rb +17 -11
  39. data/spec/spec_helper.rb +1 -1
  40. data/spec/unit/active_fedora/indexing/inserter_spec.rb +30 -0
  41. data/spec/unit/attributes_spec.rb +3 -7
  42. data/spec/unit/fedora_spec.rb +12 -0
  43. data/spec/unit/file_configurator_spec.rb +0 -9
  44. data/spec/unit/file_io_spec.rb +137 -0
  45. data/spec/unit/file_spec.rb +14 -17
  46. metadata +26 -30
  47. data/.circleci/config.yml +0 -43
@@ -5,7 +5,6 @@ module ActiveFedora::RDF
5
5
  # @see ActiveFedora::Indexing
6
6
  # @see ActiveFedora::IndexingService
7
7
  class IndexingService
8
- include Solrizer::Common
9
8
  attr_reader :object, :index_config
10
9
 
11
10
  # @param [#resource, #rdf_subject] obj the object to build an solr document for. Its class must respond to 'properties'
@@ -43,13 +42,14 @@ module ActiveFedora::RDF
43
42
  # Override this in order to allow one field to be expanded into more than one:
44
43
  # example:
45
44
  # def append_to_solr_doc(solr_doc, field_key, field_info, val)
46
- # Solrizer.set_field(solr_doc, 'lcsh_subject_uri', val.to_uri, :symbol)
47
- # Solrizer.set_field(solr_doc, 'lcsh_subject_label', val.to_label, :searchable)
45
+ # ActiveFedora.index_field_mapper.set_field(solr_doc, 'lcsh_subject_uri', val.to_uri, :symbol)
46
+ # ActiveFedora.index_field_mapper.set_field(solr_doc, 'lcsh_subject_label', val.to_label, :searchable)
48
47
  # end
49
48
  def append_to_solr_doc(solr_doc, solr_field_key, field_info, val)
50
- self.class.create_and_insert_terms(solr_field_key,
51
- solr_document_field_value(val),
52
- field_info.behaviors, solr_doc)
49
+ ActiveFedora::Indexing::Inserter.create_and_insert_terms(solr_field_key,
50
+ solr_document_field_value(val),
51
+ field_info.behaviors,
52
+ solr_doc)
53
53
  end
54
54
 
55
55
  def solr_document_field_name(field_key, prefix_method)
@@ -144,20 +144,6 @@ module ActiveFedora
144
144
  @scope_for_create ||= where_values_hash.merge(create_with_value)
145
145
  end
146
146
 
147
- def each
148
- if loaded?
149
- @records.each { |item| yield item } if block_given?
150
- @records.to_enum
151
- else
152
- find_each(where_values) { |item| yield item } if block_given?
153
- enum_for(:find_each, where_values)
154
- end
155
- end
156
-
157
- def empty?
158
- !any?
159
- end
160
-
161
147
  private
162
148
 
163
149
  VALID_FIND_OPTIONS = [:order, :limit, :start, :conditions, :cast].freeze
@@ -13,8 +13,7 @@ module ActiveFedora
13
13
  :keep_if, :pop, :shift, :delete_at, :select!
14
14
  ].to_set
15
15
 
16
- delegate :length, :map, :to_ary, to: :to_a
17
- delegate :any?, :all?, :collect, :include?, to: :each
16
+ delegate :length, :collect, :map, :each, :all?, :include?, :to_ary, to: :to_a
18
17
 
19
18
  protected
20
19
 
@@ -1,7 +1,6 @@
1
1
  module ActiveFedora
2
2
  module FinderMethods
3
- # Returns the first records that was found.
4
- #
3
+ # Returns the first record that was found.
5
4
  # @example
6
5
  # Person.where(name_t: 'Jones').first
7
6
  # => #<Person @id="foo:123" @name='Jones' ... >
@@ -15,7 +14,6 @@ module ActiveFedora
15
14
 
16
15
  # Returns the last record sorted by id. ID was chosen because this mimics
17
16
  # how ActiveRecord would achieve the same behavior.
18
- #
19
17
  # @example
20
18
  # Person.where(name_t: 'Jones').last
21
19
  # => #<Person @id="foo:123" @name='Jones' ... >
@@ -27,12 +25,10 @@ module ActiveFedora
27
25
  end
28
26
  end
29
27
 
30
- # Returns an Array of objects of the Class that +find+ is being
31
- # called on
32
- #
33
- # @param[String,Hash] args either an id or a hash of conditions
28
+ # @param [String, Hash] args either an id or a hash of conditions
34
29
  # @option args [Integer] :rows when :all is passed, the maximum number of rows to load from solr
35
30
  # @option args [Boolean] :cast when true, examine the model and cast it to the first known cModel
31
+ # @return [Array] objects of the Class that +find+ is being called on
36
32
  def find(*args)
37
33
  return to_a.find { |*block_args| yield(*block_args) } if block_given?
38
34
  options = args.extract_options!
@@ -71,10 +67,9 @@ module ActiveFedora
71
67
  end
72
68
  end
73
69
 
74
- # Returns true if object having the id or matching the conditions exists in the repository
75
70
  # Returns false if param is false (or nil)
76
- # @param[ActiveFedora::Base, String, Hash] object, id or hash of conditions
77
- # @return[boolean]
71
+ # @param [ActiveFedora::Base, String, Hash] object, id or hash of conditions
72
+ # @return [Boolean] true if object having the id or matching the conditions exists in the repository
78
73
  def exists?(conditions)
79
74
  conditions = conditions.id if Base === conditions
80
75
  return false unless conditions
@@ -86,15 +81,13 @@ module ActiveFedora
86
81
  else
87
82
  raise ArgumentError, "`conditions' argument must be ActiveFedora::Base, String, or Hash: #{conditions.inspect}"
88
83
  end
89
- rescue ActiveFedora::ObjectNotFoundError, Ldp::Gone
84
+ rescue ActiveFedora::ObjectNotFoundError, ActiveFedora::ModelMismatch, Ldp::Gone
90
85
  false
91
86
  end
92
87
 
93
88
  # Returns a solr result matching the supplied conditions
94
- # @param[Hash,String] conditions can either be specified as a string, or
95
- # hash representing the query part of an solr statement. If a hash is
96
- # provided, this method will generate conditions based simple equality
97
- # combined using the boolean AND operator.
89
+ # @param [Hash, String] conditions represention of the query part of an solr statement.
90
+ # If a hash is provided, query will combine based on simple equality using the boolean AND operator.
98
91
  # @param [Hash] options
99
92
  # @option opts [Array] :sort a list of fields to sort by
100
93
  # @option opts [Array] :rows number of rows to return
@@ -110,11 +103,9 @@ module ActiveFedora
110
103
  def search_by_id(id, opts = {})
111
104
  opts[:rows] = 1
112
105
  result = search_with_conditions({ id: id }, opts)
113
-
114
106
  if result.empty?
115
107
  raise ActiveFedora::ObjectNotFoundError, "Object '#{id}' not found in solr"
116
108
  end
117
-
118
109
  result.first
119
110
  end
120
111
 
@@ -129,7 +120,7 @@ module ActiveFedora
129
120
  group.each do |hit|
130
121
  begin
131
122
  yield(load_from_fedora(hit[ActiveFedora.id_field], cast))
132
- rescue Ldp::Gone
123
+ rescue Ldp::Gone, ActiveFedora::ObjectNotFoundError
133
124
  ActiveFedora::Base.logger.error "Although #{hit[ActiveFedora.id_field]} was found in Solr, it doesn't seem to exist in Fedora. The index is out of synch."
134
125
  end
135
126
  end
@@ -141,14 +132,14 @@ module ActiveFedora
141
132
  # option; the default is 1000.
142
133
  #
143
134
  # Returns a solr result matching the supplied conditions
144
- # @param[Hash] conditions solr conditions to match
145
- # @param[Hash] options
135
+ # @param [Hash] conditions solr conditions to match
136
+ # @param [Hash] options
146
137
  # @option opts [Array] :sort a list of fields to sort by
147
138
  # @option opts [Array] :rows number of rows to return
148
139
  #
149
140
  # @example
150
141
  # Person.search_in_batches('age_t'=>'21', {:batch_size=>50}) do |group|
151
- # group.each { |person| puts person['name_t'] }
142
+ # group.each { |person| puts person['name_t'] }
152
143
  # end
153
144
  def search_in_batches(conditions, opts = {})
154
145
  opts[:q] = create_query(conditions)
@@ -169,11 +160,10 @@ module ActiveFedora
169
160
  end
170
161
  end
171
162
 
172
- # Retrieve the Fedora object with the given id, explore the returned object
173
- # Raises a ObjectNotFoundError if the object is not found.
163
+ # Retrieve the Fedora object with the given id
174
164
  # @param [String] id of the object to load
175
165
  # @param [Boolean] cast when true, cast the found object to the class of the first known model defined in it's RELS-EXT
176
- #
166
+ # @raise [ObjectNotFoundError] if the object is not found
177
167
  # @example because the object hydra:dataset1 asserts it is a Dataset (hasModel http://fedora.info/definitions/v4/model#Dataset), return a Dataset object (not a Book).
178
168
  # Book.find_one("hydra:dataset1")
179
169
  def find_one(id, cast = nil)
@@ -190,37 +180,27 @@ module ActiveFedora
190
180
 
191
181
  def load_from_fedora(id, cast)
192
182
  raise ActiveFedora::ObjectNotFoundError, "No ID provided for #{klass.name}." if id.empty?
193
-
194
183
  resource = ActiveFedora.fedora.ldp_resource_service.build(klass, id)
195
184
  raise_record_not_found_exception!(id) if resource.new?
196
185
  class_to_load(resource, cast).allocate.init_with_resource(resource) # Triggers the find callback
197
186
  end
198
187
 
199
188
  def raise_record_not_found_exception!(id)
200
- name = @klass.name
201
- raise ActiveFedora::ObjectNotFoundError, "Couldn't find #{name} with 'id'=#{id}"
189
+ raise ActiveFedora::ObjectNotFoundError, "Couldn't find #{@klass.name} with 'id'=#{id}"
202
190
  end
203
191
 
204
192
  def class_to_load(resource, cast)
205
193
  if @klass == ActiveFedora::Base && cast == false
206
194
  ActiveFedora::Base
207
195
  else
208
- resource_class = has_model_value(resource)
209
- unless equivalent_class?(resource_class)
210
- raise ActiveFedora::ActiveFedoraError, "Model mismatch. Expected #{@klass}. Got: #{resource_class}"
196
+ resource_class = ActiveFedora.model_mapper.classifier(resource).best_model
197
+ unless resource_class <= @klass
198
+ raise ActiveFedora::ModelMismatch, "Expected #{@klass}. Got: #{resource_class}"
211
199
  end
212
200
  resource_class
213
201
  end
214
202
  end
215
203
 
216
- def has_model_value(resource)
217
- ActiveFedora.model_mapper.classifier(resource).best_model
218
- end
219
-
220
- def equivalent_class?(other_class)
221
- other_class <= @klass
222
- end
223
-
224
204
  def find_with_ids(ids, cast)
225
205
  expects_array = ids.first.is_a?(Array)
226
206
  return ids.first if expects_array && ids.first.empty?
@@ -245,7 +225,7 @@ module ActiveFedora
245
225
  private
246
226
 
247
227
  # Returns a solr query for the supplied conditions
248
- # @param[Hash,String,Array] conditions solr conditions to match
228
+ # @param [Hash, String, Array] conditions solr conditions to match
249
229
  # @return [String]
250
230
  def create_query(conditions)
251
231
  build_query(build_where(conditions))
@@ -1,3 +1,3 @@
1
1
  module ActiveFedora
2
- VERSION = '11.5.6'.freeze
2
+ VERSION = "12.0.0".freeze
3
3
  end
@@ -1,4 +1,4 @@
1
- # Place any default configuration for solr_wrapper here
1
+ # Place any default configuration for fcrepo_wrapper here
2
2
  port: 8984
3
3
  enable_jms: false
4
4
  fcrepo_home_dir: tmp/fcrepo4-development-data
@@ -1,7 +1,7 @@
1
1
  # This is a sample config file that points to a solr server for each environment
2
2
  development:
3
- url: http://127.0.0.1:<%= ENV['SOLR_TEST_PORT'] || 8983 %>/solr/hydra-development
3
+ url: <%= ENV['SOLR_URL'] || "http://127.0.0.1:#{ENV.fetch('SOLR_DEVELOPMENT_PORT', 8983)}/solr/hydra-development" %>
4
4
  test:
5
- url: http://127.0.0.1:<%= ENV['SOLR_TEST_PORT'] || 8985 %>/solr/hydra-test
5
+ url: <%= ENV['SOLR_URL'] || "http://127.0.0.1:#{ENV.fetch('SOLR_TEST_PORT', 8985)}/solr/hydra-test" %>
6
6
  production:
7
- url: http://your.production.server:8080/bl_solr/core0
7
+ url: <%= ENV['SOLR_URL'] || "http://your.production.server:8080/bl_solr/core0" %>
@@ -59,32 +59,32 @@
59
59
 
60
60
  <types>
61
61
  <fieldType name="string" class="solr.StrField" sortMissingLast="true" />
62
- <fieldType name="boolean" class="solr.BoolField" sortMissingLast="true"/>
62
+ <fieldType name="boolean" class="solr.BoolField" sortMissingLast="true"/>
63
63
  <fieldType name="rand" class="solr.RandomSortField" omitNorms="true"/>
64
-
64
+
65
65
  <!-- Default numeric field types. -->
66
66
  <fieldType name="int" class="solr.TrieIntField" precisionStep="0" positionIncrementGap="0"/>
67
67
  <fieldType name="float" class="solr.TrieFloatField" precisionStep="0" positionIncrementGap="0"/>
68
68
  <fieldType name="long" class="solr.TrieLongField" precisionStep="0" positionIncrementGap="0"/>
69
69
  <fieldType name="double" class="solr.TrieDoubleField" precisionStep="0" positionIncrementGap="0"/>
70
-
70
+
71
71
  <!-- trie numeric field types for faster range queries -->
72
72
  <fieldType name="tint" class="solr.TrieIntField" precisionStep="8" positionIncrementGap="0"/>
73
73
  <fieldType name="tfloat" class="solr.TrieFloatField" precisionStep="8" positionIncrementGap="0"/>
74
74
  <fieldType name="tlong" class="solr.TrieLongField" precisionStep="8" positionIncrementGap="0"/>
75
75
  <fieldType name="tdouble" class="solr.TrieDoubleField" precisionStep="8" positionIncrementGap="0"/>
76
-
76
+
77
77
  <!-- The format for this date field is of the form 1995-12-31T23:59:59Z
78
78
  Optional fractional seconds are allowed: 1995-12-31T23:59:59.999Z
79
79
  -->
80
80
  <fieldType name="date" class="solr.TrieDateField" precisionStep="0" positionIncrementGap="0"/>
81
81
  <!-- A Trie based date field for faster date range queries and date faceting. -->
82
82
  <fieldType name="tdate" class="solr.TrieDateField" precisionStep="6" positionIncrementGap="0"/>
83
-
84
-
83
+
84
+
85
85
  <!-- This point type indexes the coordinates as separate fields (subFields)
86
86
  If subFieldType is defined, it references a type, and a dynamic field
87
- definition is created matching *___<typename>. Alternately, if
87
+ definition is created matching *___<typename>. Alternately, if
88
88
  subFieldSuffix is defined, that is used to create the subFields.
89
89
  Example: if subFieldType="double", then the coordinates would be
90
90
  indexed in fields myloc_0___double,myloc_1___double.
@@ -94,17 +94,17 @@
94
94
  users normally should not need to know about them.
95
95
  -->
96
96
  <fieldType name="point" class="solr.PointType" dimension="2" subFieldSuffix="_d"/>
97
-
97
+
98
98
  <!-- A specialized field for geospatial search. If indexed, this fieldType must not be multivalued. -->
99
99
  <fieldType name="location" class="solr.LatLonType" subFieldSuffix="_coordinate"/>
100
-
100
+
101
101
  <!-- An alternative geospatial field type new to Solr 4. It supports multiValued and polygon shapes.
102
102
  For more information about this and other Spatial fields new to Solr 4, see:
103
103
  http://wiki.apache.org/solr/SolrAdaptersForLuceneSpatial4
104
104
  -->
105
105
  <fieldType name="location_rpt" class="solr.SpatialRecursivePrefixTreeFieldType"
106
106
  geo="true" distErrPct="0.025" maxDistErr="0.000009" distanceUnits="degrees" />
107
-
107
+
108
108
  <fieldType name="text" class="solr.TextField" omitNorms="false">
109
109
  <analyzer>
110
110
  <tokenizer class="solr.ICUTokenizerFactory"/>
@@ -112,7 +112,7 @@
112
112
  <filter class="solr.TrimFilterFactory"/>
113
113
  </analyzer>
114
114
  </fieldType>
115
-
115
+
116
116
  <!-- A text field that only splits on whitespace for exact matching of words -->
117
117
  <fieldType name="text_ws" class="solr.TextField" positionIncrementGap="100">
118
118
  <analyzer>
@@ -120,7 +120,7 @@
120
120
  <filter class="solr.TrimFilterFactory"/>
121
121
  </analyzer>
122
122
  </fieldType>
123
-
123
+
124
124
  <!-- single token analyzed text, for sorting. Punctuation is significant. -->
125
125
  <fieldtype name="alphaSort" class="solr.TextField" sortMissingLast="true" omitNorms="true">
126
126
  <analyzer>
@@ -129,7 +129,7 @@
129
129
  <filter class="solr.TrimFilterFactory" />
130
130
  </analyzer>
131
131
  </fieldtype>
132
-
132
+
133
133
  <!-- A text field with defaults appropriate for English -->
134
134
  <fieldType name="text_en" class="solr.TextField" positionIncrementGap="100">
135
135
  <analyzer>
@@ -144,7 +144,7 @@
144
144
  <filter class="solr.TrimFilterFactory"/>
145
145
  </analyzer>
146
146
  </fieldType>
147
-
147
+
148
148
  <!-- queries for paths match documents at that path, or in descendent paths -->
149
149
  <fieldType name="descendent_path" class="solr.TextField">
150
150
  <analyzer type="index">
@@ -154,7 +154,7 @@
154
154
  <tokenizer class="solr.KeywordTokenizerFactory" />
155
155
  </analyzer>
156
156
  </fieldType>
157
-
157
+
158
158
  <!-- queries for paths match documents at that path, or in ancestor paths -->
159
159
  <fieldType name="ancestor_path" class="solr.TextField">
160
160
  <analyzer type="index">
@@ -168,6 +168,7 @@
168
168
  <fieldType class="solr.TextField" name="textSuggest" positionIncrementGap="100">
169
169
  <analyzer>
170
170
  <tokenizer class="solr.KeywordTokenizerFactory"/>
171
+ <filter class="solr.StandardFilterFactory"/>
171
172
  <filter class="solr.LowerCaseFilterFactory"/>
172
173
  <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
173
174
  </analyzer>
@@ -178,12 +179,12 @@
178
179
  <fields>
179
180
  <!-- If you remove this field, you must _also_ disable the update log in solrconfig.xml
180
181
  or Solr won't start. _version_ and update log are required for SolrCloud
181
- -->
182
+ -->
182
183
  <field name="_version_" type="long" indexed="true" stored="true"/>
183
-
184
+
184
185
  <field name="id" type="string" stored="true" indexed="true" multiValued="false" required="true"/>
185
186
  <field name="timestamp" type="date" indexed="true" stored="true" default="NOW" multiValued="false"/>
186
-
187
+
187
188
  <field name="lat" type="tdouble" stored="true" indexed="true" multiValued="false"/>
188
189
  <field name="lng" type="tdouble" stored="true" indexed="true" multiValued="false"/>
189
190
 
@@ -200,7 +201,7 @@
200
201
  <dynamicField name="*_timv" type="text" stored="false" indexed="true" multiValued="true" termVectors="true" termPositions="true" termOffsets="true"/>
201
202
  <dynamicField name="*_tsiv" type="text" stored="true" indexed="true" multiValued="false" termVectors="true" termPositions="true" termOffsets="true"/>
202
203
  <dynamicField name="*_tsimv" type="text" stored="true" indexed="true" multiValued="true" termVectors="true" termPositions="true" termOffsets="true"/>
203
-
204
+
204
205
  <!-- English text (_te...) -->
205
206
  <dynamicField name="*_tei" type="text_en" stored="false" indexed="true" multiValued="false"/>
206
207
  <dynamicField name="*_teim" type="text_en" stored="false" indexed="true" multiValued="true"/>
@@ -212,7 +213,7 @@
212
213
  <dynamicField name="*_teimv" type="text_en" stored="false" indexed="true" multiValued="true" termVectors="true" termPositions="true" termOffsets="true"/>
213
214
  <dynamicField name="*_tesiv" type="text_en" stored="true" indexed="true" multiValued="false" termVectors="true" termPositions="true" termOffsets="true"/>
214
215
  <dynamicField name="*_tesimv" type="text_en" stored="true" indexed="true" multiValued="true" termVectors="true" termPositions="true" termOffsets="true"/>
215
-
216
+
216
217
  <!-- string (_s...) -->
217
218
  <dynamicField name="*_si" type="string" stored="false" indexed="true" multiValued="false"/>
218
219
  <dynamicField name="*_sim" type="string" stored="false" indexed="true" multiValued="true"/>
@@ -221,7 +222,7 @@
221
222
  <dynamicField name="*_ssi" type="string" stored="true" indexed="true" multiValued="false"/>
222
223
  <dynamicField name="*_ssim" type="string" stored="true" indexed="true" multiValued="true"/>
223
224
  <dynamicField name="*_ssort" type="alphaSort" stored="false" indexed="true" multiValued="false"/>
224
-
225
+
225
226
  <!-- integer (_i...) -->
226
227
  <dynamicField name="*_ii" type="int" stored="false" indexed="true" multiValued="false"/>
227
228
  <dynamicField name="*_iim" type="int" stored="false" indexed="true" multiValued="true"/>
@@ -229,7 +230,7 @@
229
230
  <dynamicField name="*_ism" type="int" stored="true" indexed="false" multiValued="true"/>
230
231
  <dynamicField name="*_isi" type="int" stored="true" indexed="true" multiValued="false"/>
231
232
  <dynamicField name="*_isim" type="int" stored="true" indexed="true" multiValued="true"/>
232
-
233
+
233
234
  <!-- trie integer (_it...) (for faster range queries) -->
234
235
  <dynamicField name="*_iti" type="tint" stored="false" indexed="true" multiValued="false"/>
235
236
  <dynamicField name="*_itim" type="tint" stored="false" indexed="true" multiValued="true"/>
@@ -237,7 +238,7 @@
237
238
  <dynamicField name="*_itsm" type="tint" stored="true" indexed="false" multiValued="true"/>
238
239
  <dynamicField name="*_itsi" type="tint" stored="true" indexed="true" multiValued="false"/>
239
240
  <dynamicField name="*_itsim" type="tint" stored="true" indexed="true" multiValued="true"/>
240
-
241
+
241
242
  <!-- date (_dt...) -->
242
243
  <!-- The format for this date field is of the form 1995-12-31T23:59:59Z
243
244
  Optional fractional seconds are allowed: 1995-12-31T23:59:59.999Z -->
@@ -247,7 +248,7 @@
247
248
  <dynamicField name="*_dtsm" type="date" stored="true" indexed="false" multiValued="true"/>
248
249
  <dynamicField name="*_dtsi" type="date" stored="true" indexed="true" multiValued="false"/>
249
250
  <dynamicField name="*_dtsim" type="date" stored="true" indexed="true" multiValued="true"/>
250
-
251
+
251
252
  <!-- trie date (_dtt...) (for faster range queries) -->
252
253
  <dynamicField name="*_dtti" type="tdate" stored="false" indexed="true" multiValued="false"/>
253
254
  <dynamicField name="*_dttim" type="tdate" stored="false" indexed="true" multiValued="true"/>
@@ -255,7 +256,7 @@
255
256
  <dynamicField name="*_dttsm" type="tdate" stored="true" indexed="false" multiValued="true"/>
256
257
  <dynamicField name="*_dttsi" type="tdate" stored="true" indexed="true" multiValued="false"/>
257
258
  <dynamicField name="*_dttsim" type="tdate" stored="true" indexed="true" multiValued="true"/>
258
-
259
+
259
260
  <!-- long (_l...) -->
260
261
  <dynamicField name="*_li" type="long" stored="false" indexed="true" multiValued="false"/>
261
262
  <dynamicField name="*_lim" type="long" stored="false" indexed="true" multiValued="true"/>
@@ -263,7 +264,7 @@
263
264
  <dynamicField name="*_lsm" type="long" stored="true" indexed="false" multiValued="true"/>
264
265
  <dynamicField name="*_lsi" type="long" stored="true" indexed="true" multiValued="false"/>
265
266
  <dynamicField name="*_lsim" type="long" stored="true" indexed="true" multiValued="true"/>
266
-
267
+
267
268
  <!-- trie long (_lt...) (for faster range queries) -->
268
269
  <dynamicField name="*_lti" type="tlong" stored="false" indexed="true" multiValued="false"/>
269
270
  <dynamicField name="*_ltim" type="tlong" stored="false" indexed="true" multiValued="true"/>
@@ -271,7 +272,7 @@
271
272
  <dynamicField name="*_ltsm" type="tlong" stored="true" indexed="false" multiValued="true"/>
272
273
  <dynamicField name="*_ltsi" type="tlong" stored="true" indexed="true" multiValued="false"/>
273
274
  <dynamicField name="*_ltsim" type="tlong" stored="true" indexed="true" multiValued="true"/>
274
-
275
+
275
276
  <!-- double (_db...) -->
276
277
  <dynamicField name="*_dbi" type="double" stored="false" indexed="true" multiValued="false"/>
277
278
  <dynamicField name="*_dbim" type="double" stored="false" indexed="true" multiValued="true"/>
@@ -279,7 +280,7 @@
279
280
  <dynamicField name="*_dbsm" type="double" stored="true" indexed="false" multiValued="true"/>
280
281
  <dynamicField name="*_dbsi" type="double" stored="true" indexed="true" multiValued="false"/>
281
282
  <dynamicField name="*_dbsim" type="double" stored="true" indexed="true" multiValued="true"/>
282
-
283
+
283
284
  <!-- trie double (_dbt...) (for faster range queries) -->
284
285
  <dynamicField name="*_dbti" type="tdouble" stored="false" indexed="true" multiValued="false"/>
285
286
  <dynamicField name="*_dbtim" type="tdouble" stored="false" indexed="true" multiValued="true"/>
@@ -287,7 +288,7 @@
287
288
  <dynamicField name="*_dbtsm" type="tdouble" stored="true" indexed="false" multiValued="true"/>
288
289
  <dynamicField name="*_dbtsi" type="tdouble" stored="true" indexed="true" multiValued="false"/>
289
290
  <dynamicField name="*_dbtsim" type="tdouble" stored="true" indexed="true" multiValued="true"/>
290
-
291
+
291
292
  <!-- float (_f...) -->
292
293
  <dynamicField name="*_fi" type="float" stored="false" indexed="true" multiValued="false"/>
293
294
  <dynamicField name="*_fim" type="float" stored="false" indexed="true" multiValued="true"/>
@@ -295,7 +296,7 @@
295
296
  <dynamicField name="*_fsm" type="float" stored="true" indexed="false" multiValued="true"/>
296
297
  <dynamicField name="*_fsi" type="float" stored="true" indexed="true" multiValued="false"/>
297
298
  <dynamicField name="*_fsim" type="float" stored="true" indexed="true" multiValued="true"/>
298
-
299
+
299
300
  <!-- trie float (_ft...) (for faster range queries) -->
300
301
  <dynamicField name="*_fti" type="tfloat" stored="false" indexed="true" multiValued="false"/>
301
302
  <dynamicField name="*_ftim" type="tfloat" stored="false" indexed="true" multiValued="true"/>
@@ -303,12 +304,12 @@
303
304
  <dynamicField name="*_ftsm" type="tfloat" stored="true" indexed="false" multiValued="true"/>
304
305
  <dynamicField name="*_ftsi" type="tfloat" stored="true" indexed="true" multiValued="false"/>
305
306
  <dynamicField name="*_ftsim" type="tfloat" stored="true" indexed="true" multiValued="true"/>
306
-
307
+
307
308
  <!-- boolean (_b...) -->
308
309
  <dynamicField name="*_bi" type="boolean" stored="false" indexed="true" multiValued="false"/>
309
310
  <dynamicField name="*_bs" type="boolean" stored="true" indexed="false" multiValued="false"/>
310
311
  <dynamicField name="*_bsi" type="boolean" stored="true" indexed="true" multiValued="false"/>
311
-
312
+
312
313
  <!-- Type used to index the lat and lon components for the "location" FieldType -->
313
314
  <dynamicField name="*_coordinate" type="tdouble" indexed="true" stored="false" />
314
315
 
@@ -328,7 +329,7 @@
328
329
 
329
330
  </fields>
330
331
 
331
- <!-- Field to use to determine and enforce document uniqueness.
332
+ <!-- Field to use to determine and enforce document uniqueness.
332
333
  Unless this field is marked with required="false", it will be a required field
333
334
  -->
334
335
  <uniqueKey>id</uniqueKey>