active-fedora 12.0.3 → 12.2.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (76) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +23 -7
  3. data/.rubocop.yml +7 -7
  4. data/.rubocop_todo.yml +10 -100
  5. data/.solr_wrapper +1 -1
  6. data/CODE_OF_CONDUCT.md +36 -0
  7. data/CONTRIBUTING.md +23 -21
  8. data/Gemfile +1 -1
  9. data/History.txt +29 -29
  10. data/LICENSE +16 -14
  11. data/README.md +40 -29
  12. data/SUPPORT.md +5 -0
  13. data/active-fedora.gemspec +8 -8
  14. data/lib/active_fedora.rb +1 -1
  15. data/lib/active_fedora/aggregation/list_source.rb +13 -2
  16. data/lib/active_fedora/associations/builder/collection_association.rb +1 -0
  17. data/lib/active_fedora/associations/collection_association.rb +3 -0
  18. data/lib/active_fedora/associations/collection_proxy.rb +2 -0
  19. data/lib/active_fedora/associations/directly_contains_one_association.rb +1 -0
  20. data/lib/active_fedora/associations/indirectly_contains_association.rb +2 -0
  21. data/lib/active_fedora/associations/singular_association.rb +1 -0
  22. data/lib/active_fedora/attribute_methods.rb +1 -1
  23. data/lib/active_fedora/attribute_methods/read.rb +1 -1
  24. data/lib/active_fedora/attribute_methods/write.rb +1 -1
  25. data/lib/active_fedora/attributes.rb +1 -1
  26. data/lib/active_fedora/attributes/property_builder.rb +1 -0
  27. data/lib/active_fedora/callbacks.rb +7 -2
  28. data/lib/active_fedora/fedora.rb +8 -0
  29. data/lib/active_fedora/file.rb +4 -4
  30. data/lib/active_fedora/indexing.rb +3 -0
  31. data/lib/active_fedora/indexing/descendant_fetcher.rb +1 -1
  32. data/lib/active_fedora/indexing/descriptor.rb +1 -1
  33. data/lib/active_fedora/indexing/field_mapper.rb +4 -2
  34. data/lib/active_fedora/indexing/suffix.rb +7 -3
  35. data/lib/active_fedora/inheritable_accessors.rb +1 -0
  36. data/lib/active_fedora/loadable_from_json.rb +1 -0
  37. data/lib/active_fedora/nested_attributes.rb +1 -0
  38. data/lib/active_fedora/persistence.rb +14 -1
  39. data/lib/active_fedora/persistence/null_identifier_service.rb +11 -0
  40. data/lib/active_fedora/rake_support.rb +2 -2
  41. data/lib/active_fedora/reflection.rb +1 -1
  42. data/lib/active_fedora/relation.rb +14 -0
  43. data/lib/active_fedora/relation/delegation.rb +2 -1
  44. data/lib/active_fedora/relation/finder_methods.rb +1 -0
  45. data/lib/active_fedora/relation/merger.rb +1 -0
  46. data/lib/active_fedora/validations.rb +7 -0
  47. data/lib/active_fedora/version.rb +1 -1
  48. data/lib/active_fedora/with_metadata.rb +1 -0
  49. data/lib/active_fedora/with_metadata/metadata_node.rb +2 -1
  50. data/lib/generators/active_fedora/config/solr/templates/.solr_wrapper.yml +1 -1
  51. data/lib/generators/active_fedora/config/solr/templates/solr/{config → conf}/_rest_managed.json +0 -0
  52. data/lib/generators/active_fedora/config/solr/templates/solr/{config → conf}/admin-extra.html +0 -0
  53. data/lib/generators/active_fedora/config/solr/templates/solr/{config → conf}/elevate.xml +0 -0
  54. data/lib/generators/active_fedora/config/solr/templates/solr/{config → conf}/mapping-ISOLatin1Accent.txt +0 -0
  55. data/lib/generators/active_fedora/config/solr/templates/solr/{config → conf}/protwords.txt +0 -0
  56. data/lib/generators/active_fedora/config/solr/templates/solr/{config → conf}/schema.xml +64 -63
  57. data/lib/generators/active_fedora/config/solr/templates/solr/{config → conf}/scripts.conf +0 -0
  58. data/lib/generators/active_fedora/config/solr/templates/solr/{config → conf}/solrconfig.xml +4 -1
  59. data/lib/generators/active_fedora/config/solr/templates/solr/{config → conf}/spellings.txt +0 -0
  60. data/lib/generators/active_fedora/config/solr/templates/solr/{config → conf}/stopwords.txt +0 -0
  61. data/lib/generators/active_fedora/config/solr/templates/solr/{config → conf}/stopwords_en.txt +0 -0
  62. data/lib/generators/active_fedora/config/solr/templates/solr/{config → conf}/synonyms.txt +0 -0
  63. data/lib/generators/active_fedora/config/solr/templates/solr/{config → conf}/xslt/example.xsl +0 -0
  64. data/lib/generators/active_fedora/config/solr/templates/solr/{config → conf}/xslt/example_atom.xsl +0 -0
  65. data/lib/generators/active_fedora/config/solr/templates/solr/{config → conf}/xslt/example_rss.xsl +0 -0
  66. data/lib/generators/active_fedora/config/solr/templates/solr/{config → conf}/xslt/luke.xsl +0 -0
  67. data/lib/generators/active_fedora/config/solr/templates/solr_wrapper_test.yml +1 -1
  68. data/lib/generators/active_fedora/model/templates/datastream.rb.erb +1 -1
  69. data/spec/integration/file_spec.rb +1 -1
  70. data/spec/integration/relation_spec.rb +43 -0
  71. data/spec/spec_helper.rb +10 -8
  72. data/spec/support/an_active_model.rb +4 -0
  73. data/spec/unit/active_fedora/indexing/inserter_spec.rb +5 -0
  74. data/spec/unit/callback_spec.rb +8 -1
  75. data/spec/unit/validations_spec.rb +18 -0
  76. metadata +57 -60
@@ -77,7 +77,7 @@ module ActiveFedora
77
77
  protected
78
78
 
79
79
  def rdf_resource
80
- @rdf_resource ||= Ldp::Resource::RdfSource.new(ActiveFedora.fedora.connection, uri)
80
+ @rdf_resource ||= Ldp::Resource::RdfSource.new(ActiveFedora.fedora.build_ntriples_connection, uri)
81
81
  end
82
82
 
83
83
  def rdf_graph
@@ -9,7 +9,7 @@ module ActiveFedora
9
9
  @type_required = opts[:requires_type]
10
10
  end
11
11
  @index_type = args
12
- raise Solrizer::InvalidIndexDescriptor, "Invalid index type passed to Sorizer.solr_name. It should be an array like [:string, :indexed, :stored, :multivalued]. You provided: `#{@index_type}'" unless index_type.is_a? Array
12
+ raise InvalidIndexDescriptor, "Invalid index type passed. It should be an array like [:string, :indexed, :stored, :multivalued]. You provided: `#{@index_type}'" unless index_type.is_a? Array
13
13
  end
14
14
 
15
15
  def name_and_converter(field_name, args = nil)
@@ -22,6 +22,7 @@ module ActiveFedora
22
22
  # @api
23
23
  # Given a field name, index_type, etc., returns the corresponding Solr name.
24
24
  # TODO field type is the input format, maybe we could just detect that?
25
+ # See https://github.com/samvera/active_fedora/issues/1338
25
26
  # @param [String] field_name the ruby (term) name which will get a suffix appended to become a Solr field name
26
27
  # @param opts - index_type is only needed if the FieldDescriptor requires it (e.g. :searcahble)
27
28
  # @return [String] name of the solr field, based on the params
@@ -69,6 +70,7 @@ module ActiveFedora
69
70
 
70
71
  # Is there a custom converter?
71
72
  # TODO instead of a custom converter, look for input data type and output data type. Create a few methods that can do that cast.
73
+ # See https://github.com/samvera/active_fedora/issues/1339
72
74
 
73
75
  value = if converter
74
76
  if converter.arity == 1
@@ -87,7 +89,7 @@ module ActiveFedora
87
89
  values = (results[name] ||= [])
88
90
  values << value unless value.nil? || values.include?(value)
89
91
  else
90
- Solrizer.logger.warn "Setting #{name} to `#{value}', but it already had `#{results[name]}'" if results[name] && Solrizer.logger
92
+ Rails.logger.warn "Setting #{name} to `#{value}', but it already had `#{results[name]}'" if results[name]
91
93
  results[name] = value
92
94
  end
93
95
  end
@@ -109,7 +111,7 @@ module ActiveFedora
109
111
  when Descriptor
110
112
  index_type
111
113
  else
112
- raise Solrizer::InvalidIndexDescriptor, "#{index_type.class} is not a valid indexer_type. Use a String, Symbol or Descriptor."
114
+ raise InvalidIndexDescriptor, "#{index_type.class} is not a valid indexer_type. Use a String, Symbol or Descriptor."
113
115
  end
114
116
 
115
117
  raise InvalidIndexDescriptor, "index type should be an Descriptor, you passed: #{index_type.class}" unless index_type.is_a? Descriptor
@@ -28,7 +28,7 @@ module ActiveFedora
28
28
  end
29
29
 
30
30
  def to_s
31
- raise Solrizer::InvalidIndexDescriptor, "Missing datatype for #{@fields}" unless data_type
31
+ raise InvalidIndexDescriptor, "Missing datatype for #{@fields}" unless data_type
32
32
 
33
33
  field_suffix = [config.suffix_delimiter]
34
34
 
@@ -45,12 +45,14 @@ module ActiveFedora
45
45
  end
46
46
 
47
47
  def self.config
48
+ # TODO: `:symbol' usage ought to be deprecated
49
+ # See https://github.com/samvera/active_fedora/issues/1334
48
50
  @config ||= OpenStruct.new fields: [:type, :stored, :indexed, :multivalued],
49
51
  suffix_delimiter: '_',
50
52
  type_suffix: (lambda do |fields|
51
53
  type = fields.first
52
54
  case type
53
- when :string, :symbol # TODO: `:symbol' usage ought to be deprecated
55
+ when :string, :symbol
54
56
  's'
55
57
  when :text
56
58
  't'
@@ -64,8 +66,10 @@ module ActiveFedora
64
66
  'b'
65
67
  when :long
66
68
  'lt'
69
+ when :float, :big_decimal
70
+ 'f'
67
71
  else
68
- raise Solrizer::InvalidIndexDescriptor, "Invalid datatype `#{type.inspect}'. Must be one of: :date, :time, :text, :text_en, :string, :symbol, :integer, :boolean"
72
+ raise InvalidIndexDescriptor, "Invalid datatype `#{type.inspect}'. Must be one of: :date, :time, :text, :text_en, :string, :symbol, :integer, :boolean"
69
73
  end
70
74
  end),
71
75
  stored_suffix: 's',
@@ -1,5 +1,6 @@
1
1
  # Similar to ActiveSupport.class_attribute but with a setter that doesn't use the #{name}= syntax
2
2
  # This preserves backward compatibility with the API in ActiveTriples
3
+ require "active_support/core_ext/module/remove_method"
3
4
 
4
5
  module ActiveFedora
5
6
  module InheritableAccessors
@@ -131,6 +131,7 @@ module ActiveFedora
131
131
  @resource = SolrBackedResource.new(self.class)
132
132
  self.attributes = adapt_attributes(attrs)
133
133
  # TODO: Should we clear the change tracking, or make this object Read-only?
134
+ # See https://github.com/samvera/active_fedora/issues/1342
134
135
 
135
136
  yield self if block_given?
136
137
 
@@ -64,6 +64,7 @@ module ActiveFedora
64
64
  reflection.autosave = true
65
65
  define_autosave_association_callbacks(reflection)
66
66
  ## TODO this ought to work, but doesn't seem to do the class inheritance right
67
+ # See https://github.com/samvera/active_fedora/issues/1343
67
68
 
68
69
  nested_attributes_options = self.nested_attributes_options.dup
69
70
  nested_attributes_options[association_name.to_sym] = options
@@ -2,6 +2,13 @@ module ActiveFedora
2
2
  # = Active Fedora Persistence
3
3
  module Persistence
4
4
  extend ActiveSupport::Concern
5
+ extend ActiveSupport::Autoload
6
+ autoload :NullIdentifierService
7
+
8
+ included do
9
+ class_attribute :identifier_service_class
10
+ self.identifier_service_class = NullIdentifierService
11
+ end
5
12
 
6
13
  def new_record?
7
14
  return true if @ldp_source.subject.nil?
@@ -209,7 +216,13 @@ module ActiveFedora
209
216
  end
210
217
 
211
218
  # Override to tie in an ID minting service
212
- def assign_id; end
219
+ def assign_id
220
+ identifier_service.mint
221
+ end
222
+
223
+ def identifier_service
224
+ @identifier_service ||= identifier_service_class.new
225
+ end
213
226
 
214
227
  # This is only used when creating a new record. If the object doesn't have an id
215
228
  # and assign_id can mint an id for the object, then assign it to the resource.
@@ -0,0 +1,11 @@
1
+ module ActiveFedora
2
+ module Persistence
3
+ # An identifier service that doesn't mint IDs, so that the autocreated
4
+ # identifiers from Fedora will be used.
5
+ class NullIdentifierService
6
+ # Effectively a no-op
7
+ # @return [NilClass]
8
+ def mint; end
9
+ end
10
+ end
11
+ end
@@ -16,12 +16,12 @@ def with_server(environment)
16
16
 
17
17
  SolrWrapper.wrap(load_config(:solr, environment, solr_defaults)) do |solr|
18
18
  ENV["SOLR_#{environment.upcase}_PORT"] = solr.port.to_s
19
- solr_config_path = File.join('solr', 'config')
19
+ solr_config_path = File.join('solr', 'conf')
20
20
  # Check to see if configs exist in a path relative to the working directory
21
21
  unless Dir.exist?(solr_config_path)
22
22
  $stderr.puts "Solr configuration not found at #{solr_config_path}. Using ActiveFedora defaults"
23
23
  # Otherwise use the configs delivered with ActiveFedora.
24
- solr_config_path = File.join(File.expand_path("../..", File.dirname(__FILE__)), 'lib', 'generators', 'active_fedora', 'config', 'solr', 'templates', 'solr', 'config')
24
+ solr_config_path = File.join(File.expand_path("../..", File.dirname(__FILE__)), 'lib', 'generators', 'active_fedora', 'config', 'solr', 'templates', 'solr', 'conf')
25
25
  end
26
26
  solr.with_collection(name: "hydra-#{environment}", dir: solr_config_path) do
27
27
  FcrepoWrapper.wrap(load_config(:fcrepo, environment, fcrepo_defaults)) do |fcrepo|
@@ -314,7 +314,7 @@ module ActiveFedora
314
314
  def collect_join_chain
315
315
  [self]
316
316
  end
317
- alias chain collect_join_chain # todo
317
+ alias chain collect_join_chain # TODO Remove alias, See https://github.com/samvera/active_fedora/issues/1347
318
318
 
319
319
  def has_inverse?
320
320
  inverse_name
@@ -144,6 +144,20 @@ 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
+
147
161
  private
148
162
 
149
163
  VALID_FIND_OPTIONS = [:order, :limit, :start, :conditions, :cast].freeze
@@ -13,7 +13,8 @@ module ActiveFedora
13
13
  :keep_if, :pop, :shift, :delete_at, :select!
14
14
  ].to_set
15
15
 
16
- delegate :length, :collect, :map, :each, :all?, :include?, :to_ary, to: :to_a
16
+ delegate :length, :map, :to_ary, to: :to_a
17
+ delegate :any?, :all?, :collect, :include?, to: :each
17
18
 
18
19
  protected
19
20
 
@@ -262,6 +262,7 @@ module ActiveFedora
262
262
  def field_name_for(key)
263
263
  if @klass.delegated_attributes.key?(key)
264
264
  # TODO: Check to see if `key' is a possible solr field for this class, if it isn't try :searchable instead
265
+ # See https://github.com/samvera/active_fedora/issues/1344
265
266
  ActiveFedora.index_field_mapper.solr_name(key, :stored_searchable, type: :string)
266
267
  elsif key == :id
267
268
  ActiveFedora.id_field
@@ -14,6 +14,7 @@ module ActiveFedora
14
14
 
15
15
  def merge
16
16
  # TODO: merge order
17
+ # See https://github.com/samvera/active_fedora/issues/1329
17
18
  relation.where_values += other.where_values
18
19
  relation
19
20
  end
@@ -92,5 +92,12 @@ module ActiveFedora
92
92
  def perform_validations(options = {}) # :nodoc:
93
93
  options[:validate] == false || valid?(options[:context])
94
94
  end
95
+
96
+ private
97
+
98
+ # Overwrite run validations to include callbacks.
99
+ def run_validations!
100
+ _run_validation_callbacks { super }
101
+ end
95
102
  end
96
103
  end
@@ -1,3 +1,3 @@
1
1
  module ActiveFedora
2
- VERSION = "12.0.3".freeze
2
+ VERSION = '12.2.3'.freeze
3
3
  end
@@ -20,6 +20,7 @@ module ActiveFedora
20
20
 
21
21
  def create_or_update(*)
22
22
  return unless super && !new_record?
23
+ # TODOs captured as https://github.com/samvera/active_fedora/issues/1331
23
24
  metadata_node.metadata_uri = described_by # TODO: only necessary if the URI was < > before
24
25
  metadata_node.save # TODO if changed?
25
26
  end
@@ -15,6 +15,7 @@ module ActiveFedora
15
15
  @file = file
16
16
  super(file.uri, ldp_source.graph)
17
17
  return unless self.class.type && !type.include?(self.class.type)
18
+ attributes_changed_by_setter[:type] = true if type.present?
18
19
  # Workaround for https://github.com/ActiveTriples/ActiveTriples/issues/123
19
20
  get_values(:type) << self.class.type
20
21
  end
@@ -54,7 +55,7 @@ module ActiveFedora
54
55
 
55
56
  def changed_attributes
56
57
  super.tap do |changed|
57
- changed['type'] = true if type.present? && new_record?
58
+ changed.merge('type' => true) if type.present? && new_record?
58
59
  end
59
60
  end
60
61
 
@@ -4,5 +4,5 @@
4
4
  instance_dir: tmp/solr-development
5
5
  collection:
6
6
  persist: true
7
- dir: solr/config/
7
+ dir: solr/conf/
8
8
  name: hydra-development
@@ -48,43 +48,47 @@
48
48
  <schema name="Hydra Demo Index" version="1.5">
49
49
  <!-- attribute "name" is the name of this schema and is only used for display purposes.
50
50
  Applications should change this to reflect the nature of the search collection.
51
- version="1.4" is Solr's version number for the schema syntax and semantics. It should
51
+ version="1.5" is Solr's version number for the schema syntax and semantics. It should
52
52
  not normally be changed by applications.
53
53
  1.0: multiValued attribute did not exist, all fields are multiValued by nature
54
54
  1.1: multiValued attribute introduced, false by default
55
55
  1.2: omitTermFreqAndPositions attribute introduced, true by default except for text fields.
56
56
  1.3: removed optional field compress feature
57
57
  1.4: default auto-phrase (QueryParser feature) to off
58
+ 1.5: omitNorms defaults to true for primitive field types (int, float, boolean, string...)
59
+ # TODO 1.6: useDocValuesAsStored defaults to true.
60
+ # See https://github.com/samvera/active_fedora/issues/1346
58
61
  -->
59
62
 
60
63
  <types>
61
64
  <fieldType name="string" class="solr.StrField" sortMissingLast="true" />
62
- <fieldType name="boolean" class="solr.BoolField" sortMissingLast="true"/>
65
+ <fieldType name="boolean" class="solr.BoolField" sortMissingLast="true"/>
63
66
  <fieldType name="rand" class="solr.RandomSortField" omitNorms="true"/>
64
-
67
+
65
68
  <!-- Default numeric field types. -->
66
- <fieldType name="int" class="solr.TrieIntField" precisionStep="0" positionIncrementGap="0"/>
67
- <fieldType name="float" class="solr.TrieFloatField" precisionStep="0" positionIncrementGap="0"/>
68
- <fieldType name="long" class="solr.TrieLongField" precisionStep="0" positionIncrementGap="0"/>
69
- <fieldType name="double" class="solr.TrieDoubleField" precisionStep="0" positionIncrementGap="0"/>
70
-
71
- <!-- trie numeric field types for faster range queries -->
72
- <fieldType name="tint" class="solr.TrieIntField" precisionStep="8" positionIncrementGap="0"/>
73
- <fieldType name="tfloat" class="solr.TrieFloatField" precisionStep="8" positionIncrementGap="0"/>
74
- <fieldType name="tlong" class="solr.TrieLongField" precisionStep="8" positionIncrementGap="0"/>
75
- <fieldType name="tdouble" class="solr.TrieDoubleField" precisionStep="8" positionIncrementGap="0"/>
76
-
69
+ <fieldType name="int" class="solr.IntPointField" docValues="true"/>
70
+ <fieldType name="float" class="solr.FloatPointField" docValues="true"/>
71
+ <fieldType name="long" class="solr.LongPointField" docValues="true"/>
72
+ <fieldType name="double" class="solr.DoublePointField" docValues="true"/>
73
+
74
+ <!-- PointField numeric field types for faster range queries -->
75
+ <fieldType name="tint" class="solr.IntPointField" docValues="true"/>
76
+ <fieldType name="tfloat" class="solr.FloatPointField" docValues="true"/>
77
+ <fieldType name="tlong" class="solr.LongPointField" docValues="true"/>
78
+ <fieldType name="tdouble" class="solr.DoublePointField" docValues="true"/>
79
+
77
80
  <!-- The format for this date field is of the form 1995-12-31T23:59:59Z
78
81
  Optional fractional seconds are allowed: 1995-12-31T23:59:59.999Z
79
82
  -->
80
- <fieldType name="date" class="solr.TrieDateField" precisionStep="0" positionIncrementGap="0"/>
81
- <!-- A Trie based date field for faster date range queries and date faceting. -->
82
- <fieldType name="tdate" class="solr.TrieDateField" precisionStep="6" positionIncrementGap="0"/>
83
-
84
-
83
+ <fieldType name="date" class="solr.DatePointField" docValues="true"/>
84
+ <!-- A PointField based date field for faster date range queries and date faceting. -->
85
+ <fieldType name="tdate" class="solr.DatePointField" docValues="true"/>
86
+ <!-- A DateRange based date field for truly faster date range queries. -->
87
+ <fieldType name="dateRange" class="solr.DateRangeField"/>
88
+
85
89
  <!-- This point type indexes the coordinates as separate fields (subFields)
86
90
  If subFieldType is defined, it references a type, and a dynamic field
87
- definition is created matching *___<typename>. Alternately, if
91
+ definition is created matching *___<typename>. Alternately, if
88
92
  subFieldSuffix is defined, that is used to create the subFields.
89
93
  Example: if subFieldType="double", then the coordinates would be
90
94
  indexed in fields myloc_0___double,myloc_1___double.
@@ -94,17 +98,14 @@
94
98
  users normally should not need to know about them.
95
99
  -->
96
100
  <fieldType name="point" class="solr.PointType" dimension="2" subFieldSuffix="_d"/>
97
-
98
- <!-- A specialized field for geospatial search. If indexed, this fieldType must not be multivalued. -->
99
- <fieldType name="location" class="solr.LatLonType" subFieldSuffix="_coordinate"/>
100
-
101
- <!-- An alternative geospatial field type new to Solr 4. It supports multiValued and polygon shapes.
101
+
102
+ <!-- A geospatial field type new to Solr 4. It supports multiValued and polygon shapes.
102
103
  For more information about this and other Spatial fields new to Solr 4, see:
103
104
  http://wiki.apache.org/solr/SolrAdaptersForLuceneSpatial4
104
105
  -->
105
106
  <fieldType name="location_rpt" class="solr.SpatialRecursivePrefixTreeFieldType"
106
107
  geo="true" distErrPct="0.025" maxDistErr="0.000009" distanceUnits="degrees" />
107
-
108
+
108
109
  <fieldType name="text" class="solr.TextField" omitNorms="false">
109
110
  <analyzer>
110
111
  <tokenizer class="solr.ICUTokenizerFactory"/>
@@ -112,7 +113,7 @@
112
113
  <filter class="solr.TrimFilterFactory"/>
113
114
  </analyzer>
114
115
  </fieldType>
115
-
116
+
116
117
  <!-- A text field that only splits on whitespace for exact matching of words -->
117
118
  <fieldType name="text_ws" class="solr.TextField" positionIncrementGap="100">
118
119
  <analyzer>
@@ -120,7 +121,7 @@
120
121
  <filter class="solr.TrimFilterFactory"/>
121
122
  </analyzer>
122
123
  </fieldType>
123
-
124
+
124
125
  <!-- single token analyzed text, for sorting. Punctuation is significant. -->
125
126
  <fieldtype name="alphaSort" class="solr.TextField" sortMissingLast="true" omitNorms="true">
126
127
  <analyzer>
@@ -129,7 +130,7 @@
129
130
  <filter class="solr.TrimFilterFactory" />
130
131
  </analyzer>
131
132
  </fieldtype>
132
-
133
+
133
134
  <!-- A text field with defaults appropriate for English -->
134
135
  <fieldType name="text_en" class="solr.TextField" positionIncrementGap="100">
135
136
  <analyzer>
@@ -144,7 +145,7 @@
144
145
  <filter class="solr.TrimFilterFactory"/>
145
146
  </analyzer>
146
147
  </fieldType>
147
-
148
+
148
149
  <!-- queries for paths match documents at that path, or in descendent paths -->
149
150
  <fieldType name="descendent_path" class="solr.TextField">
150
151
  <analyzer type="index">
@@ -154,7 +155,7 @@
154
155
  <tokenizer class="solr.KeywordTokenizerFactory" />
155
156
  </analyzer>
156
157
  </fieldType>
157
-
158
+
158
159
  <!-- queries for paths match documents at that path, or in ancestor paths -->
159
160
  <fieldType name="ancestor_path" class="solr.TextField">
160
161
  <analyzer type="index">
@@ -168,7 +169,6 @@
168
169
  <fieldType class="solr.TextField" name="textSuggest" positionIncrementGap="100">
169
170
  <analyzer>
170
171
  <tokenizer class="solr.KeywordTokenizerFactory"/>
171
- <filter class="solr.StandardFilterFactory"/>
172
172
  <filter class="solr.LowerCaseFilterFactory"/>
173
173
  <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
174
174
  </analyzer>
@@ -179,12 +179,12 @@
179
179
  <fields>
180
180
  <!-- If you remove this field, you must _also_ disable the update log in solrconfig.xml
181
181
  or Solr won't start. _version_ and update log are required for SolrCloud
182
- -->
182
+ -->
183
183
  <field name="_version_" type="long" indexed="true" stored="true"/>
184
-
184
+
185
185
  <field name="id" type="string" stored="true" indexed="true" multiValued="false" required="true"/>
186
186
  <field name="timestamp" type="date" indexed="true" stored="true" default="NOW" multiValued="false"/>
187
-
187
+
188
188
  <field name="lat" type="tdouble" stored="true" indexed="true" multiValued="false"/>
189
189
  <field name="lng" type="tdouble" stored="true" indexed="true" multiValued="false"/>
190
190
 
@@ -201,7 +201,7 @@
201
201
  <dynamicField name="*_timv" type="text" stored="false" indexed="true" multiValued="true" termVectors="true" termPositions="true" termOffsets="true"/>
202
202
  <dynamicField name="*_tsiv" type="text" stored="true" indexed="true" multiValued="false" termVectors="true" termPositions="true" termOffsets="true"/>
203
203
  <dynamicField name="*_tsimv" type="text" stored="true" indexed="true" multiValued="true" termVectors="true" termPositions="true" termOffsets="true"/>
204
-
204
+
205
205
  <!-- English text (_te...) -->
206
206
  <dynamicField name="*_tei" type="text_en" stored="false" indexed="true" multiValued="false"/>
207
207
  <dynamicField name="*_teim" type="text_en" stored="false" indexed="true" multiValued="true"/>
@@ -213,7 +213,7 @@
213
213
  <dynamicField name="*_teimv" type="text_en" stored="false" indexed="true" multiValued="true" termVectors="true" termPositions="true" termOffsets="true"/>
214
214
  <dynamicField name="*_tesiv" type="text_en" stored="true" indexed="true" multiValued="false" termVectors="true" termPositions="true" termOffsets="true"/>
215
215
  <dynamicField name="*_tesimv" type="text_en" stored="true" indexed="true" multiValued="true" termVectors="true" termPositions="true" termOffsets="true"/>
216
-
216
+
217
217
  <!-- string (_s...) -->
218
218
  <dynamicField name="*_si" type="string" stored="false" indexed="true" multiValued="false"/>
219
219
  <dynamicField name="*_sim" type="string" stored="false" indexed="true" multiValued="true"/>
@@ -222,7 +222,7 @@
222
222
  <dynamicField name="*_ssi" type="string" stored="true" indexed="true" multiValued="false"/>
223
223
  <dynamicField name="*_ssim" type="string" stored="true" indexed="true" multiValued="true"/>
224
224
  <dynamicField name="*_ssort" type="alphaSort" stored="false" indexed="true" multiValued="false"/>
225
-
225
+
226
226
  <!-- integer (_i...) -->
227
227
  <dynamicField name="*_ii" type="int" stored="false" indexed="true" multiValued="false"/>
228
228
  <dynamicField name="*_iim" type="int" stored="false" indexed="true" multiValued="true"/>
@@ -230,15 +230,15 @@
230
230
  <dynamicField name="*_ism" type="int" stored="true" indexed="false" multiValued="true"/>
231
231
  <dynamicField name="*_isi" type="int" stored="true" indexed="true" multiValued="false"/>
232
232
  <dynamicField name="*_isim" type="int" stored="true" indexed="true" multiValued="true"/>
233
-
234
- <!-- trie integer (_it...) (for faster range queries) -->
233
+
234
+ <!-- IntegerPointField (_it...) (for faster range queries) -->
235
235
  <dynamicField name="*_iti" type="tint" stored="false" indexed="true" multiValued="false"/>
236
236
  <dynamicField name="*_itim" type="tint" stored="false" indexed="true" multiValued="true"/>
237
237
  <dynamicField name="*_its" type="tint" stored="true" indexed="false" multiValued="false"/>
238
238
  <dynamicField name="*_itsm" type="tint" stored="true" indexed="false" multiValued="true"/>
239
239
  <dynamicField name="*_itsi" type="tint" stored="true" indexed="true" multiValued="false"/>
240
240
  <dynamicField name="*_itsim" type="tint" stored="true" indexed="true" multiValued="true"/>
241
-
241
+
242
242
  <!-- date (_dt...) -->
243
243
  <!-- The format for this date field is of the form 1995-12-31T23:59:59Z
244
244
  Optional fractional seconds are allowed: 1995-12-31T23:59:59.999Z -->
@@ -248,15 +248,24 @@
248
248
  <dynamicField name="*_dtsm" type="date" stored="true" indexed="false" multiValued="true"/>
249
249
  <dynamicField name="*_dtsi" type="date" stored="true" indexed="true" multiValued="false"/>
250
250
  <dynamicField name="*_dtsim" type="date" stored="true" indexed="true" multiValued="true"/>
251
-
252
- <!-- trie date (_dtt...) (for faster range queries) -->
251
+
252
+ <!-- DatePointField (_dtt...) (for faster range queries) -->
253
253
  <dynamicField name="*_dtti" type="tdate" stored="false" indexed="true" multiValued="false"/>
254
254
  <dynamicField name="*_dttim" type="tdate" stored="false" indexed="true" multiValued="true"/>
255
255
  <dynamicField name="*_dtts" type="tdate" stored="true" indexed="false" multiValued="false"/>
256
256
  <dynamicField name="*_dttsm" type="tdate" stored="true" indexed="false" multiValued="true"/>
257
257
  <dynamicField name="*_dttsi" type="tdate" stored="true" indexed="true" multiValued="false"/>
258
258
  <dynamicField name="*_dttsim" type="tdate" stored="true" indexed="true" multiValued="true"/>
259
-
259
+
260
+
261
+ <!-- date range (_dr...) (for faster AND better range queries) -->
262
+ <dynamicField name="*_dri" type="dateRange" stored="false" indexed="true" multiValued="false"/>
263
+ <dynamicField name="*_drim" type="dateRange" stored="false" indexed="true" multiValued="true"/>
264
+ <dynamicField name="*_drs" type="dateRange" stored="true" indexed="false" multiValued="false"/>
265
+ <dynamicField name="*_drsm" type="dateRange" stored="true" indexed="false" multiValued="true"/>
266
+ <dynamicField name="*_drsi" type="dateRange" stored="true" indexed="true" multiValued="false"/>
267
+ <dynamicField name="*_drsim" type="dateRange" stored="true" indexed="true" multiValued="true"/>
268
+
260
269
  <!-- long (_l...) -->
261
270
  <dynamicField name="*_li" type="long" stored="false" indexed="true" multiValued="false"/>
262
271
  <dynamicField name="*_lim" type="long" stored="false" indexed="true" multiValued="true"/>
@@ -264,15 +273,15 @@
264
273
  <dynamicField name="*_lsm" type="long" stored="true" indexed="false" multiValued="true"/>
265
274
  <dynamicField name="*_lsi" type="long" stored="true" indexed="true" multiValued="false"/>
266
275
  <dynamicField name="*_lsim" type="long" stored="true" indexed="true" multiValued="true"/>
267
-
268
- <!-- trie long (_lt...) (for faster range queries) -->
276
+
277
+ <!-- LongPointField (_lt...) (for faster range queries) -->
269
278
  <dynamicField name="*_lti" type="tlong" stored="false" indexed="true" multiValued="false"/>
270
279
  <dynamicField name="*_ltim" type="tlong" stored="false" indexed="true" multiValued="true"/>
271
280
  <dynamicField name="*_lts" type="tlong" stored="true" indexed="false" multiValued="false"/>
272
281
  <dynamicField name="*_ltsm" type="tlong" stored="true" indexed="false" multiValued="true"/>
273
282
  <dynamicField name="*_ltsi" type="tlong" stored="true" indexed="true" multiValued="false"/>
274
283
  <dynamicField name="*_ltsim" type="tlong" stored="true" indexed="true" multiValued="true"/>
275
-
284
+
276
285
  <!-- double (_db...) -->
277
286
  <dynamicField name="*_dbi" type="double" stored="false" indexed="true" multiValued="false"/>
278
287
  <dynamicField name="*_dbim" type="double" stored="false" indexed="true" multiValued="true"/>
@@ -280,15 +289,15 @@
280
289
  <dynamicField name="*_dbsm" type="double" stored="true" indexed="false" multiValued="true"/>
281
290
  <dynamicField name="*_dbsi" type="double" stored="true" indexed="true" multiValued="false"/>
282
291
  <dynamicField name="*_dbsim" type="double" stored="true" indexed="true" multiValued="true"/>
283
-
284
- <!-- trie double (_dbt...) (for faster range queries) -->
292
+
293
+ <!-- DoublePointField (_dbt...) (for faster range queries) -->
285
294
  <dynamicField name="*_dbti" type="tdouble" stored="false" indexed="true" multiValued="false"/>
286
295
  <dynamicField name="*_dbtim" type="tdouble" stored="false" indexed="true" multiValued="true"/>
287
296
  <dynamicField name="*_dbts" type="tdouble" stored="true" indexed="false" multiValued="false"/>
288
297
  <dynamicField name="*_dbtsm" type="tdouble" stored="true" indexed="false" multiValued="true"/>
289
298
  <dynamicField name="*_dbtsi" type="tdouble" stored="true" indexed="true" multiValued="false"/>
290
299
  <dynamicField name="*_dbtsim" type="tdouble" stored="true" indexed="true" multiValued="true"/>
291
-
300
+
292
301
  <!-- float (_f...) -->
293
302
  <dynamicField name="*_fi" type="float" stored="false" indexed="true" multiValued="false"/>
294
303
  <dynamicField name="*_fim" type="float" stored="false" indexed="true" multiValued="true"/>
@@ -296,31 +305,23 @@
296
305
  <dynamicField name="*_fsm" type="float" stored="true" indexed="false" multiValued="true"/>
297
306
  <dynamicField name="*_fsi" type="float" stored="true" indexed="true" multiValued="false"/>
298
307
  <dynamicField name="*_fsim" type="float" stored="true" indexed="true" multiValued="true"/>
299
-
300
- <!-- trie float (_ft...) (for faster range queries) -->
308
+
309
+ <!-- FloatPointField (_ft...) (for faster range queries) -->
301
310
  <dynamicField name="*_fti" type="tfloat" stored="false" indexed="true" multiValued="false"/>
302
311
  <dynamicField name="*_ftim" type="tfloat" stored="false" indexed="true" multiValued="true"/>
303
312
  <dynamicField name="*_fts" type="tfloat" stored="true" indexed="false" multiValued="false"/>
304
313
  <dynamicField name="*_ftsm" type="tfloat" stored="true" indexed="false" multiValued="true"/>
305
314
  <dynamicField name="*_ftsi" type="tfloat" stored="true" indexed="true" multiValued="false"/>
306
315
  <dynamicField name="*_ftsim" type="tfloat" stored="true" indexed="true" multiValued="true"/>
307
-
316
+
308
317
  <!-- boolean (_b...) -->
309
318
  <dynamicField name="*_bi" type="boolean" stored="false" indexed="true" multiValued="false"/>
310
319
  <dynamicField name="*_bs" type="boolean" stored="true" indexed="false" multiValued="false"/>
311
320
  <dynamicField name="*_bsi" type="boolean" stored="true" indexed="true" multiValued="false"/>
312
-
321
+
313
322
  <!-- Type used to index the lat and lon components for the "location" FieldType -->
314
323
  <dynamicField name="*_coordinate" type="tdouble" indexed="true" stored="false" />
315
324
 
316
- <!-- location (_ll...) -->
317
- <dynamicField name="*_lli" type="location" stored="false" indexed="true" multiValued="false"/>
318
- <dynamicField name="*_llim" type="location" stored="false" indexed="true" multiValued="true"/>
319
- <dynamicField name="*_lls" type="location" stored="true" indexed="false" multiValued="false"/>
320
- <dynamicField name="*_llsm" type="location" stored="true" indexed="false" multiValued="true"/>
321
- <dynamicField name="*_llsi" type="location" stored="true" indexed="true" multiValued="false"/>
322
- <dynamicField name="*_llsim" type="location" stored="true" indexed="true" multiValued="true"/>
323
-
324
325
  <dynamicField name="*suggest" type="textSuggest" indexed="true" stored="false" multiValued="true" />
325
326
 
326
327
  <!-- you must define copyField source and dest fields explicity or schemaBrowser doesn't work -->
@@ -329,7 +330,7 @@
329
330
 
330
331
  </fields>
331
332
 
332
- <!-- Field to use to determine and enforce document uniqueness.
333
+ <!-- Field to use to determine and enforce document uniqueness.
333
334
  Unless this field is marked with required="false", it will be a required field
334
335
  -->
335
336
  <uniqueKey>id</uniqueKey>