ddr-models 2.4.0.rc4 → 2.4.0.rc5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2406a157a006c5fff980da281a457b140c467e27
4
- data.tar.gz: ca9c89caf184aa999333ef3781373fa71137c408
3
+ metadata.gz: a57bdb43e8f09d8bba57f543fa677e6f584d49e0
4
+ data.tar.gz: aaf3160fc9732099da710cff89d874701f2c9432
5
5
  SHA512:
6
- metadata.gz: 82dfb88bdb1cdb4cde005ce04ad8153ae2742638d8eb4a79f697d68f8fb4a4b7524b1885c105257a0036a2da50dc66741bf0f37dbea64ac447f2f536977dd209
7
- data.tar.gz: 1441428287cdcdb26c8a9e8337520e15b5b384974da1acd7ae525a21c8f09da06172ebe37222b18fa99e420c4e31fd7d4e875977ff419da31a6ca28ac7ce4033
6
+ metadata.gz: dbb52a96b1ea4168b8bc8a0d7cc813b425b3e407f9ce5a13d1a330a176c1684e039c3195182bf615f3199d13fc8465b3765dbc97c95bc6be47822feba9fbb7a1
7
+ data.tar.gz: d8f17c7f174c712105de7c53a6107fafb216fb6121655b9e439adeb886cf359f8c524edd06a7a9e2123e252ee0a05a2408fba4da5e2ee66762c3fc4561ce2bbc
@@ -1,11 +1,11 @@
1
1
  language: ruby
2
2
  before_install:
3
+ - sudo apt-get update -qq
3
4
  - sudo apt-get install libvips-dev
5
+ - gem install bundler
6
+ bundler_args: --without production
4
7
  rvm:
5
- - 2.1
8
+ - 2.1.5
6
9
  script: "bundle exec rake ci"
7
- cache:
8
- - bundler
9
- - apt
10
10
  env:
11
11
  - DDR_AUX_API_URL=http://localhost:3000/api
@@ -34,7 +34,7 @@ Gem::Specification.new do |s|
34
34
  s.add_dependency "ddr-antivirus", "~> 2.1.1"
35
35
  s.add_dependency "virtus", "~> 1.0.5"
36
36
 
37
- s.add_development_dependency "bundler", "~> 1.7"
37
+ s.add_development_dependency "bundler", "~> 1.11"
38
38
  s.add_development_dependency "rake"
39
39
  s.add_development_dependency "sqlite3"
40
40
  s.add_development_dependency "rspec-rails", "~> 3.1"
@@ -7,17 +7,16 @@ module Ddr
7
7
  autoload :CSVQueryResult
8
8
  autoload :DocumentBuilder
9
9
  autoload :Field
10
+ autoload :FieldAttribute
10
11
  autoload :Fields
11
12
  autoload :Filter
12
13
  autoload :Filters
13
14
  autoload :LegacyLicenseFields
14
- autoload :Queries
15
15
  autoload :Query
16
16
  autoload :QueryBuilder
17
17
  autoload :QueryClause
18
18
  autoload :QueryParams
19
19
  autoload :QueryResult
20
- autoload :QueryValue
21
20
  autoload :Response
22
21
  autoload :SortOrder
23
22
  autoload :UniqueKeyField
@@ -0,0 +1,18 @@
1
+ require "virtus"
2
+
3
+ module Ddr::Index
4
+ class FieldAttribute < Virtus::Attribute
5
+
6
+ def coerce(value)
7
+ case value
8
+ when Field
9
+ value
10
+ when String
11
+ Field.new(value)
12
+ when Symbol
13
+ Fields.get(value)
14
+ end
15
+ end
16
+
17
+ end
18
+ end
@@ -1,61 +1,93 @@
1
1
  require "forwardable"
2
+ require "virtus"
2
3
 
3
4
  module Ddr::Index
4
5
  class Filter
6
+ include Virtus.model
5
7
 
6
- class << self
7
- extend Forwardable
8
+ attribute :clauses, Array, default: [ ]
8
9
 
9
- def_delegators :new, :raw, :where, :absent, :present, :negative, :before, :before_days
10
+ def ==(other)
11
+ other.instance_of?(self.class) && (other.clauses == self.clauses)
10
12
  end
11
13
 
12
- attr_accessor :clauses
14
+ module Api
15
+ def raw(*clauses)
16
+ self.clauses += clauses
17
+ self
18
+ end
13
19
 
14
- def initialize(clauses = nil)
15
- @clauses = Array(clauses)
16
- end
20
+ def term(conditions)
21
+ self.clauses += conditions.map { |f, v| QueryClause.term(f, v) }
22
+ self
23
+ end
17
24
 
18
- # Adds clause (String) w/o escaping
19
- def raw(*clauses)
20
- self.clauses.push *clauses
21
- self
22
- end
25
+ def where(conditions)
26
+ self.clauses += conditions.map { |f, v| QueryClause.where(f, v) }
27
+ self
28
+ end
23
29
 
24
- def where(conditions)
25
- clauses = conditions.map do |field, value|
26
- values = Array(value)
27
- if values.size > 1
28
- QueryClause.or_values(field, values)
29
- else
30
- QueryClause.term(field, values.first)
31
- end
30
+ def absent(field)
31
+ self.clauses << QueryClause.absent(field)
32
+ self
32
33
  end
33
- raw *clauses
34
- end
35
34
 
36
- def absent(*args)
37
- raw QueryClause.absent(*args)
38
- end
35
+ def present(field)
36
+ self.clauses << QueryClause.present(field)
37
+ self
38
+ end
39
39
 
40
- def present(*args)
41
- raw QueryClause.present(*args)
42
- end
40
+ def negative(field, value)
41
+ self.clauses << QueryClause.negative(field, value)
42
+ self
43
+ end
43
44
 
44
- def negative(*args)
45
- raw QueryClause.negative(*args)
46
- end
45
+ def before(field, value)
46
+ self.clauses << QueryClause.before(field, value)
47
+ self
48
+ end
47
49
 
48
- def before(*args)
49
- raw QueryClause.before(*args)
50
+ def before_days(field, value)
51
+ self.clauses << QueryClause.before_days(field, value)
52
+ self
53
+ end
50
54
  end
51
55
 
52
- def before_days(*args)
53
- raw QueryClause.before_days(*args)
54
- end
56
+ module ClassMethods
57
+ extend Forwardable
58
+
59
+ delegate Api.public_instance_methods => :new_filter
60
+
61
+ def has_content
62
+ where active_fedora_model: [ "Component", "Attachment", "Target" ]
63
+ end
64
+
65
+ def is_governed_by(object_or_id)
66
+ term is_governed_by: internal_uri(object_or_id)
67
+ end
68
+
69
+ def is_member_of_collection(object_or_id)
70
+ term is_member_of_collection: internal_uri(object_or_id)
71
+ end
72
+
73
+ private
74
+
75
+ def internal_uri(object_or_id)
76
+ if object_or_id.respond_to?(:internal_uri)
77
+ object_or_id.internal_uri
78
+ else
79
+ ActiveFedora::Base.internal_uri(object_or_id)
80
+ end
81
+ end
82
+
83
+ def new_filter
84
+ Filter.new
85
+ end
55
86
 
56
- def ==(other)
57
- other.instance_of?(self.class) && (other.clauses == self.clauses)
58
87
  end
59
88
 
89
+ include Api
90
+ extend ClassMethods
91
+
60
92
  end
61
93
  end
@@ -2,16 +2,11 @@ module Ddr::Index
2
2
  module Filters
3
3
  extend Deprecation
4
4
 
5
- def self.has_content
6
- Filter.where(Fields::ACTIVE_FEDORA_MODEL => ["Component", "Attachment", "Target"])
7
- end
8
-
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))
5
+ def self.is_governed_by(pid)
6
+ Deprecation.warn(self,
7
+ "`Ddr::Index:Filters.is_governed_by` is deprecated and will be removed in ddr-models 3.0." \
8
+ " Use `Ddr::Index::Filter.is_governed_by` instead.")
9
+ Filter.is_governed_by(pid)
15
10
  end
16
11
 
17
12
  private
@@ -20,20 +15,12 @@ module Ddr::Index
20
15
  if name == :HAS_CONTENT
21
16
  Deprecation.warn(self,
22
17
  "`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
18
+ " Use `Ddr::Index::Filter.has_content` instead.")
19
+ Filter.has_content
25
20
  else
26
21
  super
27
22
  end
28
23
  end
29
24
 
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
37
-
38
25
  end
39
26
  end
@@ -7,12 +7,13 @@ module Ddr::Index
7
7
  extend Forwardable
8
8
 
9
9
  attribute :q, String
10
- attribute :fields, Array[String], default: [ ]
11
- attribute :filters, Array[Filter], default: [ ]
12
- attribute :sort, Array[String], default: [ ]
10
+ attribute :fields, Array[FieldAttribute], default: [ ]
11
+ attribute :filters, Array[Filter], default: [ ]
12
+ attribute :sort, Array[String], default: [ ]
13
13
  attribute :rows, Integer
14
14
 
15
- def_delegators :result, :count, :docs, :pids, :each_pid, :all
15
+ delegate [:count, :docs, :pids, :each_pid, :all] => :result
16
+ delegate :params => :query_params
16
17
 
17
18
  def inspect
18
19
  "#<#{self.class.name} q=#{q.inspect}, filters=#{filters.inspect}," \
@@ -23,10 +24,6 @@ module Ddr::Index
23
24
  URI.encode_www_form(params)
24
25
  end
25
26
 
26
- def params
27
- QueryParams.new(self).params
28
- end
29
-
30
27
  def result
31
28
  QueryResult.new(self)
32
29
  end
@@ -35,5 +32,13 @@ module Ddr::Index
35
32
  CSVQueryResult.new(self, **opts)
36
33
  end
37
34
 
35
+ def filter_clauses
36
+ filters.map(&:clauses).flatten
37
+ end
38
+
39
+ def query_params
40
+ QueryParams.new(self)
41
+ end
42
+
38
43
  end
39
44
  end
@@ -2,8 +2,84 @@ module Ddr::Index
2
2
  #
3
3
  # QueryBuilder - Provides a DSL for building a Query.
4
4
  #
5
+ # Note: Where a method receives a [field] parameter, the parameter value is
6
+ # coerced to a Field instance. See FieldAttribute#coerce for details.
7
+ #
8
+ # *** DSL METHODS ***
9
+ #
10
+ # absent [field]
11
+ # Adds a filter selecting documents where the field is not present (no values).
12
+ #
13
+ # asc [field], ...
14
+ # Adds ascending orderings by the fields specified.
15
+ # See also: desc, order_by
16
+ #
17
+ # before [field], [date_time]
18
+ # Adds a filter selecting documents where the field has a date/time before
19
+ # (earlier than) the value.
20
+ #
21
+ # before_days [field], [int]
22
+ # Adds a filter selecting documents where the field has a date/time the
23
+ # specified number of days before today (now) or earlier.
24
+ #
25
+ # desc [field], ...
26
+ # Adds descending orderings by the fields specified.
27
+ # See also: asc, order_by
28
+ #
29
+ # id [doc_id]
30
+ # For selecting a single document by ID.
31
+ #
32
+ # filter [filter1], ...
33
+ # Adds filters to the query.
34
+ # Aliased as: filters
35
+ #
36
+ # filters [filter], ...
37
+ # Alias for: filter
38
+ #
39
+ # field [field1], ...
40
+ # Adds fields to result documents.
41
+ # Note that all fields are returned when none is specified.
42
+ # Aliased as: fields
43
+ #
44
+ # fields [field], ...
45
+ # Alias for: field
46
+ #
47
+ # limit [int]
48
+ # Limits the number of documents returned by the query.
49
+ # Aliased as: rows
50
+ #
51
+ # negative [field], [value]
52
+ # Adds a filter selecting document where field does not have the value.
53
+ #
54
+ # order_by [{field => order, ...}], ...
55
+ # Adds ordering(s) to the query.
56
+ # Aliased as: sort
57
+ #
58
+ # present [field]
59
+ # Adds a filter selecting document where the field has any value.
60
+ #
61
+ # q [query_clause]
62
+ # Sets a query clause for the `q` parameter.
63
+ #
64
+ # raw [clause1], ...
65
+ # Adds a filter of "raw" query clauses (i.e., pre-constructed).
66
+ #
67
+ # rows [int]
68
+ # Alias for: limit
69
+ #
70
+ # sort [{field => order, ...}]
71
+ # Alias for: order_by
72
+ #
73
+ # term [{field => value, ...}]
74
+ # Adds a filter of "term" query clauses for the fields and values.
75
+ #
76
+ # where [{field => value, ...}]
77
+ # Adds a filter of "standard" query clauses.
78
+ # Values will be escaped when the filter is serialized.
79
+ # If a hash value is an array, that query clause will select documents
80
+ # where the field matches any array entry.
81
+ #
5
82
  class QueryBuilder
6
- extend Deprecation
7
83
 
8
84
  # Builds a Query object
9
85
  # @yield [builder] a new QueryBuilder instance.
@@ -26,86 +102,83 @@ module Ddr::Index
26
102
  end
27
103
  end
28
104
 
105
+ # @param pid [String]
106
+ # @return [QueryBuilder]
29
107
  def id(pid)
30
108
  q QueryClause.id(pid)
31
109
  limit 1
32
110
  end
33
111
 
112
+ # @param filters [Array<Filter>]
113
+ # @return [QueryBuilder]
34
114
  def filter(*filters)
35
- query.filters.push(*filters)
115
+ query.filters += filters
36
116
  self
37
117
  end
38
118
  alias_method :filters, :filter
39
119
 
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
67
-
120
+ # @param fields [Array<Field>]
121
+ # @return [QueryBuilder] self
68
122
  def field(*fields)
69
- query.fields.push(*fields)
123
+ query.fields += fields
70
124
  self
71
125
  end
72
126
  alias_method :fields, :field
73
127
 
128
+ # @param num [Integer]
129
+ # @return [QueryBuilder] self
74
130
  def limit(num)
75
- query.rows = num
131
+ query.rows = num.to_i
76
132
  self
77
133
  end
78
134
  alias_method :rows, :limit
79
135
 
80
- def order_by(*args)
81
- unless args.first.is_a? Hash
136
+ # @param orderings [Hash<Field, String>]
137
+ # @return [QueryBuilder] self
138
+ def order_by(*orderings)
139
+ unless orderings.first.is_a? Hash
82
140
  Deprecation.warn(QueryBuilder, "`order_by` will require a hash of orderings in ddr-models 3.0.")
83
- field, order = args
141
+ field, order = orderings
84
142
  return order_by(field => order)
85
143
  end
86
- query.sort += args.first.map { |field, order| SortOrder.new(field: field, order: order) }
144
+ query.sort += orderings.first.map { |field, order| SortOrder.new(field: field, order: order) }
87
145
  self
88
146
  end
89
147
  alias_method :sort, :order_by
90
148
 
91
- def asc(field)
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)
149
+ # @param fields [Array<Field, Symbol, String>]
150
+ # @return [QueryBuilder] self
151
+ def asc(*fields)
152
+ query.sort += fields.map { |field| SortOrder.asc(field) }
153
+ self
96
154
  end
97
-
98
- def desc(field)
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)
155
+ # @param fields [Array<Field, Symbol, String>]
156
+ # @return [QueryBuilder] self
157
+ def desc(*fields)
158
+ query.sort += fields.map { |field| SortOrder.desc(field) }
159
+ self
103
160
  end
104
161
 
105
- def q(q)
106
- query.q = q
162
+ # @param query_clause [QueryClause, String]
163
+ # @return [QueryBuilder] self
164
+ def q(query_clause)
165
+ query.q = query_clause
107
166
  self
108
167
  end
109
168
 
169
+ private
170
+
171
+ def respond_to_missing?(name, include_all)
172
+ Filter::ClassMethods.public_instance_methods.include?(name)
173
+ end
174
+
175
+ def method_missing(name, *args, &block)
176
+ if respond_to?(name)
177
+ filter Filter.send(name, *args)
178
+ else
179
+ super
180
+ end
181
+ end
182
+
110
183
  end
111
184
  end