ddr-models 2.4.0.rc2 → 2.4.0.rc3
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.
- checksums.yaml +4 -4
- data/config/locales/ddr-models.en.yml +74 -0
- data/ddr-models.gemspec +1 -0
- data/lib/ddr/index.rb +4 -1
- data/lib/ddr/index/csv_query_result.rb +1 -1
- data/lib/ddr/index/field.rb +11 -1
- data/lib/ddr/index/fields.rb +15 -11
- data/lib/ddr/index/filter.rb +27 -15
- data/lib/ddr/index/filters.rb +28 -8
- data/lib/ddr/index/queries.rb +20 -0
- data/lib/ddr/index/query.rb +12 -8
- data/lib/ddr/index/query_builder.rb +68 -31
- data/lib/ddr/index/query_clause.rb +38 -8
- data/lib/ddr/index/query_params.rb +24 -0
- data/lib/ddr/index/query_value.rb +5 -0
- data/lib/ddr/index/sort_order.rb +20 -0
- data/lib/ddr/models/version.rb +1 -1
- data/spec/index/fields_spec.rb +175 -0
- data/spec/index/filter_spec.rb +86 -30
- data/spec/index/filters_spec.rb +25 -8
- data/spec/index/queries_spec.rb +21 -0
- data/spec/index/query_builder_spec.rb +95 -0
- data/spec/index/query_clause_spec.rb +46 -0
- data/spec/index/query_spec.rb +19 -15
- metadata +28 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 80b4bf4ac88afd31bc2ec1941a081a7e5002928e
|
4
|
+
data.tar.gz: 3454977d7ae1e765bebf7454d3957d4e57e7ff79
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 56a5f5fca3277ea75bbba6766b6b14b570b059cb889e6511abd27a085cf56daf7430dac82afb005806a208ae7a11ff6716cebaee543733a6fd6d4969c08e73fd
|
7
|
+
data.tar.gz: 9b5f82ad467a6b6fdec25048c3a70e01c4a2ccb7ddc6ebbae8652e112d9ee4bdaac48ece550dc6059b45efe0efa7f659d2d0241e880a9dfaf791e1bd2619bdf4
|
@@ -0,0 +1,74 @@
|
|
1
|
+
en:
|
2
|
+
ddr:
|
3
|
+
index:
|
4
|
+
fields:
|
5
|
+
id:
|
6
|
+
label: "Fedora PID"
|
7
|
+
heading: pid
|
8
|
+
active_fedora_model:
|
9
|
+
label: Model
|
10
|
+
heading: model
|
11
|
+
aspace_id:
|
12
|
+
label: "ArchivesSpace ID"
|
13
|
+
doi:
|
14
|
+
label: DOI
|
15
|
+
ead_id:
|
16
|
+
label: "EAD ID"
|
17
|
+
local_id:
|
18
|
+
label: "Local ID"
|
19
|
+
system_create:
|
20
|
+
label: "Creation Date"
|
21
|
+
heading: creation_date
|
22
|
+
system_modified:
|
23
|
+
label: "Modification Date"
|
24
|
+
heading: modification_date
|
25
|
+
permanent_id:
|
26
|
+
label: "Permanent ID"
|
27
|
+
permanent_url:
|
28
|
+
label: "Permanent URL"
|
29
|
+
techmd_color_space:
|
30
|
+
label: "Color Space"
|
31
|
+
heading: color_space
|
32
|
+
techmd_creating_application:
|
33
|
+
label: "Creating Application"
|
34
|
+
heading: creating_application
|
35
|
+
techmd_creation_time:
|
36
|
+
label: "Creation Time"
|
37
|
+
heading: creation_time
|
38
|
+
techmd_file_size:
|
39
|
+
label: "File Size"
|
40
|
+
heading: "file_size"
|
41
|
+
techmd_fits_version:
|
42
|
+
label: "FITS Version"
|
43
|
+
heading: fits_version
|
44
|
+
techmd_fits_datetime:
|
45
|
+
label: "FITS Run At"
|
46
|
+
heading: fits_datetime
|
47
|
+
techmd_format_label:
|
48
|
+
label: "Format Label"
|
49
|
+
heading: format_label
|
50
|
+
techmd_format_version:
|
51
|
+
label: "Format Version"
|
52
|
+
heading: format_version
|
53
|
+
techmd_image_height:
|
54
|
+
label: "Image Height"
|
55
|
+
heading: image_height
|
56
|
+
techmd_image_width:
|
57
|
+
label: "Image Width"
|
58
|
+
heading: image_width
|
59
|
+
techmd_media_type:
|
60
|
+
label: "Media Type"
|
61
|
+
heading: media_type
|
62
|
+
techmd_modification_time:
|
63
|
+
label: "Modification Time"
|
64
|
+
heading: modification_time
|
65
|
+
techmd_pronom_identifier:
|
66
|
+
label: "PRONOM Unique ID"
|
67
|
+
heading: "pronom_uid"
|
68
|
+
techmd_valid:
|
69
|
+
label: Valid
|
70
|
+
heading: valid
|
71
|
+
techmd_well_formed:
|
72
|
+
label: "Well-formed"
|
73
|
+
heading: well_formed
|
74
|
+
|
data/ddr-models.gemspec
CHANGED
@@ -32,6 +32,7 @@ Gem::Specification.new do |s|
|
|
32
32
|
s.add_dependency "net-ldap", "~> 0.11"
|
33
33
|
s.add_dependency "cancancan", "~> 1.12"
|
34
34
|
s.add_dependency "ddr-antivirus", "~> 2.1.1"
|
35
|
+
s.add_dependency "virtus", "~> 1.0.5"
|
35
36
|
|
36
37
|
s.add_development_dependency "bundler", "~> 1.7"
|
37
38
|
s.add_development_dependency "rake"
|
data/lib/ddr/index.rb
CHANGED
@@ -11,16 +11,19 @@ module Ddr
|
|
11
11
|
autoload :Filter
|
12
12
|
autoload :Filters
|
13
13
|
autoload :LegacyLicenseFields
|
14
|
+
autoload :Queries
|
14
15
|
autoload :Query
|
15
16
|
autoload :QueryBuilder
|
16
17
|
autoload :QueryClause
|
18
|
+
autoload :QueryParams
|
17
19
|
autoload :QueryResult
|
18
20
|
autoload :QueryValue
|
19
21
|
autoload :Response
|
22
|
+
autoload :SortOrder
|
20
23
|
autoload :UniqueKeyField
|
21
24
|
|
22
25
|
def self.pids
|
23
|
-
builder = QueryBuilder.new
|
26
|
+
builder = QueryBuilder.new { field UniqueKeyField.instance }
|
24
27
|
query = builder.query
|
25
28
|
query.pids
|
26
29
|
end
|
data/lib/ddr/index/field.rb
CHANGED
@@ -16,7 +16,17 @@ module Ddr::Index
|
|
16
16
|
end
|
17
17
|
|
18
18
|
def label
|
19
|
-
I18n.t "
|
19
|
+
I18n.t "#{i18n_base}.label", default: base.titleize
|
20
|
+
end
|
21
|
+
|
22
|
+
def heading
|
23
|
+
I18n.t "#{i18n_base}.heading", default: base
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def i18n_base
|
29
|
+
"ddr.index.fields.#{base}"
|
20
30
|
end
|
21
31
|
|
22
32
|
end
|
data/lib/ddr/index/fields.rb
CHANGED
@@ -2,16 +2,6 @@ module Ddr::Index
|
|
2
2
|
module Fields
|
3
3
|
extend Deprecation
|
4
4
|
|
5
|
-
def self.const_missing(name)
|
6
|
-
if const = LegacyLicenseFields.const_get(name)
|
7
|
-
Deprecation.warn(Ddr::Index::Fields,
|
8
|
-
"The constant `#{name}` is deprecated and will be removed in ddr-models 3.0.")
|
9
|
-
const
|
10
|
-
else
|
11
|
-
super
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
5
|
def self.get(name)
|
16
6
|
const_get(name.to_s.upcase, false)
|
17
7
|
end
|
@@ -23,7 +13,6 @@ module Ddr::Index
|
|
23
13
|
end
|
24
14
|
|
25
15
|
ID = UniqueKeyField.instance
|
26
|
-
PID = UniqueKeyField.instance
|
27
16
|
|
28
17
|
ACCESS_ROLE = Field.new :access_role, :stored_sortable
|
29
18
|
ACTIVE_FEDORA_MODEL = Field.new :active_fedora_model, :stored_sortable
|
@@ -96,5 +85,20 @@ module Ddr::Index
|
|
96
85
|
WORKFLOW_STATE = Field.new :workflow_state, :stored_sortable
|
97
86
|
YEAR_FACET = Field.new :year_facet, solr_name: "year_facet_iim"
|
98
87
|
|
88
|
+
def self.const_missing(name)
|
89
|
+
if name == :PID
|
90
|
+
Deprecation.warn(Ddr::Index::Fields,
|
91
|
+
"`Ddr::Index::Fields::#{name}` is deprecated." \
|
92
|
+
" Use `Ddr::Index::Fields::ID` instead.")
|
93
|
+
return ID
|
94
|
+
end
|
95
|
+
if const = LegacyLicenseFields.const_get(name)
|
96
|
+
Deprecation.warn(Ddr::Index::Fields,
|
97
|
+
"`Ddr::Index::Fields::#{name}` is deprecated and will be removed in ddr-models 3.0.")
|
98
|
+
return const
|
99
|
+
end
|
100
|
+
super
|
101
|
+
end
|
102
|
+
|
99
103
|
end
|
100
104
|
end
|
data/lib/ddr/index/filter.rb
CHANGED
@@ -1,14 +1,24 @@
|
|
1
|
+
require "forwardable"
|
2
|
+
|
1
3
|
module Ddr::Index
|
2
4
|
class Filter
|
3
5
|
|
4
6
|
class << self
|
5
|
-
|
7
|
+
extend Forwardable
|
8
|
+
|
9
|
+
def_delegators :new, :raw, :where, :absent, :present, :negative, :before, :before_days
|
6
10
|
end
|
7
11
|
|
8
12
|
attr_accessor :clauses
|
9
13
|
|
10
|
-
def initialize
|
11
|
-
@clauses =
|
14
|
+
def initialize(clauses = nil)
|
15
|
+
@clauses = Array(clauses)
|
16
|
+
end
|
17
|
+
|
18
|
+
# Adds clause (String) w/o escaping
|
19
|
+
def raw(*clauses)
|
20
|
+
self.clauses.push *clauses
|
21
|
+
self
|
12
22
|
end
|
13
23
|
|
14
24
|
def where(conditions)
|
@@ -23,26 +33,28 @@ module Ddr::Index
|
|
23
33
|
raw *clauses
|
24
34
|
end
|
25
35
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
36
|
+
def absent(*args)
|
37
|
+
raw QueryClause.absent(*args)
|
38
|
+
end
|
39
|
+
|
40
|
+
def present(*args)
|
41
|
+
raw QueryClause.present(*args)
|
30
42
|
end
|
31
43
|
|
32
|
-
def
|
33
|
-
raw QueryClause.
|
44
|
+
def negative(*args)
|
45
|
+
raw QueryClause.negative(*args)
|
34
46
|
end
|
35
47
|
|
36
|
-
def
|
37
|
-
raw QueryClause.
|
48
|
+
def before(*args)
|
49
|
+
raw QueryClause.before(*args)
|
38
50
|
end
|
39
51
|
|
40
|
-
def
|
41
|
-
raw QueryClause.
|
52
|
+
def before_days(*args)
|
53
|
+
raw QueryClause.before_days(*args)
|
42
54
|
end
|
43
55
|
|
44
|
-
def
|
45
|
-
|
56
|
+
def ==(other)
|
57
|
+
other.instance_of?(self.class) && (other.clauses == self.clauses)
|
46
58
|
end
|
47
59
|
|
48
60
|
end
|
data/lib/ddr/index/filters.rb
CHANGED
@@ -1,19 +1,39 @@
|
|
1
1
|
module Ddr::Index
|
2
2
|
module Filters
|
3
|
+
extend Deprecation
|
3
4
|
|
4
|
-
|
5
|
+
def self.has_content
|
6
|
+
Filter.where(Fields::ACTIVE_FEDORA_MODEL => ["Component", "Attachment", "Target"])
|
7
|
+
end
|
5
8
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
9
|
+
def self.is_governed_by(object_or_id)
|
10
|
+
Filter.where(Fields::IS_GOVERNED_BY => internal_uri(object_or_id))
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.is_member_of_collection(object_or_id)
|
14
|
+
Filter.where(Fields::IS_MEMBER_OF_COLLECTION => internal_uri(object_or_id))
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
10
18
|
|
11
|
-
|
12
|
-
|
19
|
+
def self.const_missing(name)
|
20
|
+
if name == :HAS_CONTENT
|
21
|
+
Deprecation.warn(self,
|
22
|
+
"`Ddr::Index::Filters::#{name}` is deprecated and will be removed in ddr-models 3.0." \
|
23
|
+
" Use `Ddr::Index::Filters.has_content` instead.")
|
24
|
+
has_content
|
25
|
+
else
|
26
|
+
super
|
13
27
|
end
|
14
28
|
end
|
15
29
|
|
16
|
-
|
30
|
+
def self.internal_uri(object_or_id)
|
31
|
+
if object_or_id.respond_to?(:internal_uri)
|
32
|
+
object_or_id.internal_uri
|
33
|
+
else
|
34
|
+
ActiveFedora::Base.internal_uri(object_or_id)
|
35
|
+
end
|
36
|
+
end
|
17
37
|
|
18
38
|
end
|
19
39
|
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Ddr::Index
|
2
|
+
module Queries
|
3
|
+
|
4
|
+
# Returns a query for a single index document.
|
5
|
+
# @param doc_id [String] the index document id
|
6
|
+
# @return [Query] the query
|
7
|
+
def self.id(doc_id)
|
8
|
+
builder = QueryBuilder.new { id doc_id }
|
9
|
+
builder.query
|
10
|
+
end
|
11
|
+
|
12
|
+
# Returns a query for the index document for an object.
|
13
|
+
# @param obj [ActiveFedora::Base] the object
|
14
|
+
# @return [Query] the query
|
15
|
+
def self.object(obj)
|
16
|
+
id(obj.pid)
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
data/lib/ddr/index/query.rb
CHANGED
@@ -1,9 +1,18 @@
|
|
1
|
+
require "virtus"
|
2
|
+
require "forwardable"
|
3
|
+
|
1
4
|
module Ddr::Index
|
2
5
|
class Query
|
6
|
+
include Virtus.model
|
7
|
+
extend Forwardable
|
3
8
|
|
4
|
-
|
9
|
+
attribute :q, String
|
10
|
+
attribute :fields, Array[String], default: [ ]
|
11
|
+
attribute :filters, Array[Filter], default: [ ]
|
12
|
+
attribute :sort, Array[String], default: [ ]
|
13
|
+
attribute :rows, Integer
|
5
14
|
|
6
|
-
|
15
|
+
def_delegators :result, :count, :docs, :pids, :each_pid, :all
|
7
16
|
|
8
17
|
def inspect
|
9
18
|
"#<#{self.class.name} q=#{q.inspect}, filters=#{filters.inspect}," \
|
@@ -15,12 +24,7 @@ module Ddr::Index
|
|
15
24
|
end
|
16
25
|
|
17
26
|
def params
|
18
|
-
|
19
|
-
fq: filters.map(&:clauses).flatten,
|
20
|
-
fl: fields.join(","),
|
21
|
-
sort: sort.join(","),
|
22
|
-
rows: rows,
|
23
|
-
}.select { |k, v| v.present? }
|
27
|
+
QueryParams.new(self).params
|
24
28
|
end
|
25
29
|
|
26
30
|
def result
|
@@ -1,25 +1,28 @@
|
|
1
1
|
module Ddr::Index
|
2
|
+
#
|
3
|
+
# QueryBuilder - Provides a DSL for building a Query.
|
4
|
+
#
|
2
5
|
class QueryBuilder
|
6
|
+
extend Deprecation
|
3
7
|
|
8
|
+
# Builds a Query object
|
9
|
+
# @yield [builder] a new QueryBuilder instance.
|
10
|
+
# @return [Query]
|
4
11
|
def self.build
|
12
|
+
Deprecation.warn(self,
|
13
|
+
"`Ddr::Index::QueryBuilder.build` is deprecated and will be removed in ddr-models 3.0." \
|
14
|
+
" Use `Ddr::Index::QueryBuilder.new` instead.")
|
5
15
|
builder = new
|
6
16
|
yield builder
|
7
17
|
builder.query
|
8
18
|
end
|
9
19
|
|
10
|
-
|
11
|
-
@q = nil
|
12
|
-
@fields = [ ]
|
13
|
-
@filters = [ ]
|
14
|
-
@sort = [ ]
|
15
|
-
@rows = nil
|
16
|
-
end
|
20
|
+
attr_reader :query
|
17
21
|
|
18
|
-
def
|
19
|
-
Query.new
|
20
|
-
|
21
|
-
|
22
|
-
end
|
22
|
+
def initialize(&block)
|
23
|
+
@query = Query.new
|
24
|
+
if block_given?
|
25
|
+
instance_eval &block
|
23
26
|
end
|
24
27
|
end
|
25
28
|
|
@@ -28,47 +31,81 @@ module Ddr::Index
|
|
28
31
|
limit 1
|
29
32
|
end
|
30
33
|
|
31
|
-
def filter(*
|
32
|
-
|
34
|
+
def filter(*filters)
|
35
|
+
query.filters.push(*filters)
|
33
36
|
self
|
34
37
|
end
|
38
|
+
alias_method :filters, :filter
|
39
|
+
|
40
|
+
def raw(*args)
|
41
|
+
filter Filter.raw(*args)
|
42
|
+
end
|
43
|
+
|
44
|
+
def where(*args)
|
45
|
+
filter Filter.where(*args)
|
46
|
+
end
|
47
|
+
|
48
|
+
def absent(*args)
|
49
|
+
filter Filter.absent(*args)
|
50
|
+
end
|
51
|
+
|
52
|
+
def present(*args)
|
53
|
+
filter Filter.present(*args)
|
54
|
+
end
|
55
|
+
|
56
|
+
def negative(*args)
|
57
|
+
filter Filter.negative(*args)
|
58
|
+
end
|
59
|
+
|
60
|
+
def before(*args)
|
61
|
+
filter Filter.before(*args)
|
62
|
+
end
|
63
|
+
|
64
|
+
def before_days(*args)
|
65
|
+
filter Filter.before_days(*args)
|
66
|
+
end
|
35
67
|
|
36
|
-
def
|
37
|
-
|
68
|
+
def field(*fields)
|
69
|
+
query.fields.push(*fields)
|
38
70
|
self
|
39
71
|
end
|
72
|
+
alias_method :fields, :field
|
40
73
|
|
41
74
|
def limit(num)
|
42
|
-
|
75
|
+
query.rows = num
|
43
76
|
self
|
44
77
|
end
|
78
|
+
alias_method :rows, :limit
|
45
79
|
|
46
|
-
def order_by(
|
47
|
-
|
80
|
+
def order_by(*args)
|
81
|
+
unless args.first.is_a? Hash
|
82
|
+
Deprecation.warn(QueryBuilder, "`order_by` will require a hash of orderings in ddr-models 3.0.")
|
83
|
+
field, order = args
|
84
|
+
return order_by(field => order)
|
85
|
+
end
|
86
|
+
query.sort += args.first.map { |field, order| SortOrder.new(field: field, order: order) }
|
48
87
|
self
|
49
88
|
end
|
89
|
+
alias_method :sort, :order_by
|
50
90
|
|
51
91
|
def asc(field)
|
52
|
-
|
92
|
+
Deprecation.warn(QueryBuilder,
|
93
|
+
"`asc(field)` is deprecated and will be removed from ddr-models 3.0." \
|
94
|
+
" Use `order_by(field => \"asc\")` instead.")
|
95
|
+
order_by(field => SortOrder::ASC)
|
53
96
|
end
|
54
97
|
|
55
98
|
def desc(field)
|
56
|
-
|
99
|
+
Deprecation.warn(QueryBuilder,
|
100
|
+
"`desc(field)` is deprecated and will be removed from ddr-models 3.0." \
|
101
|
+
" Use `order_by(field => \"desc\")` instead.")
|
102
|
+
order_by(field => SortOrder::DESC)
|
57
103
|
end
|
58
104
|
|
59
105
|
def q(q)
|
60
|
-
|
106
|
+
query.q = q
|
61
107
|
self
|
62
108
|
end
|
63
109
|
|
64
|
-
protected
|
65
|
-
|
66
|
-
def method_missing(name, *args, &block)
|
67
|
-
if Filter.respond_to? name
|
68
|
-
return filter Filter.send(name, *args, &block)
|
69
|
-
end
|
70
|
-
super
|
71
|
-
end
|
72
|
-
|
73
110
|
end
|
74
111
|
end
|