ddr-models 2.4.0.rc2 → 2.4.0.rc3
Sign up to get free protection for your applications and to get access to all the features.
- 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
|