active-fedora 11.5.6 → 12.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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>