sbf-dm-core 1.3.0.beta
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 +7 -0
- data/.autotest +29 -0
- data/.document +5 -0
- data/.gitignore +44 -0
- data/.rspec +1 -0
- data/.rubocop.yml +468 -0
- data/.travis.yml +57 -0
- data/.yardopts +1 -0
- data/Gemfile +70 -0
- data/LICENSE +20 -0
- data/README.md +269 -0
- data/Rakefile +4 -0
- data/dm-core.gemspec +21 -0
- data/lib/dm-core/adapters/abstract_adapter.rb +233 -0
- data/lib/dm-core/adapters/in_memory_adapter.rb +110 -0
- data/lib/dm-core/adapters.rb +249 -0
- data/lib/dm-core/associations/many_to_many.rb +477 -0
- data/lib/dm-core/associations/many_to_one.rb +282 -0
- data/lib/dm-core/associations/one_to_many.rb +332 -0
- data/lib/dm-core/associations/one_to_one.rb +84 -0
- data/lib/dm-core/associations/relationship.rb +650 -0
- data/lib/dm-core/backwards.rb +11 -0
- data/lib/dm-core/collection.rb +1486 -0
- data/lib/dm-core/core_ext/kernel.rb +21 -0
- data/lib/dm-core/core_ext/pathname.rb +4 -0
- data/lib/dm-core/core_ext/symbol.rb +10 -0
- data/lib/dm-core/identity_map.rb +6 -0
- data/lib/dm-core/model/hook.rb +99 -0
- data/lib/dm-core/model/is.rb +30 -0
- data/lib/dm-core/model/property.rb +244 -0
- data/lib/dm-core/model/relationship.rb +366 -0
- data/lib/dm-core/model/scope.rb +87 -0
- data/lib/dm-core/model.rb +876 -0
- data/lib/dm-core/property/binary.rb +19 -0
- data/lib/dm-core/property/boolean.rb +35 -0
- data/lib/dm-core/property/class.rb +23 -0
- data/lib/dm-core/property/date.rb +45 -0
- data/lib/dm-core/property/date_time.rb +44 -0
- data/lib/dm-core/property/decimal.rb +47 -0
- data/lib/dm-core/property/discriminator.rb +40 -0
- data/lib/dm-core/property/float.rb +27 -0
- data/lib/dm-core/property/integer.rb +32 -0
- data/lib/dm-core/property/invalid_value_error.rb +17 -0
- data/lib/dm-core/property/lookup.rb +26 -0
- data/lib/dm-core/property/numeric.rb +35 -0
- data/lib/dm-core/property/object.rb +33 -0
- data/lib/dm-core/property/serial.rb +13 -0
- data/lib/dm-core/property/string.rb +47 -0
- data/lib/dm-core/property/text.rb +12 -0
- data/lib/dm-core/property/time.rb +46 -0
- data/lib/dm-core/property/typecast/numeric.rb +32 -0
- data/lib/dm-core/property/typecast/time.rb +33 -0
- data/lib/dm-core/property.rb +856 -0
- data/lib/dm-core/property_set.rb +177 -0
- data/lib/dm-core/query/conditions/comparison.rb +886 -0
- data/lib/dm-core/query/conditions/operation.rb +710 -0
- data/lib/dm-core/query/direction.rb +33 -0
- data/lib/dm-core/query/operator.rb +34 -0
- data/lib/dm-core/query/path.rb +113 -0
- data/lib/dm-core/query/sort.rb +38 -0
- data/lib/dm-core/query.rb +1352 -0
- data/lib/dm-core/relationship_set.rb +69 -0
- data/lib/dm-core/repository.rb +226 -0
- data/lib/dm-core/resource/persistence_state/clean.rb +36 -0
- data/lib/dm-core/resource/persistence_state/deleted.rb +26 -0
- data/lib/dm-core/resource/persistence_state/dirty.rb +91 -0
- data/lib/dm-core/resource/persistence_state/immutable.rb +32 -0
- data/lib/dm-core/resource/persistence_state/persisted.rb +25 -0
- data/lib/dm-core/resource/persistence_state/transient.rb +87 -0
- data/lib/dm-core/resource/persistence_state.rb +70 -0
- data/lib/dm-core/resource.rb +1220 -0
- data/lib/dm-core/spec/lib/adapter_helpers.rb +63 -0
- data/lib/dm-core/spec/lib/collection_helpers.rb +21 -0
- data/lib/dm-core/spec/lib/counter_adapter.rb +38 -0
- data/lib/dm-core/spec/lib/pending_helpers.rb +50 -0
- data/lib/dm-core/spec/lib/spec_helper.rb +74 -0
- data/lib/dm-core/spec/setup.rb +164 -0
- data/lib/dm-core/spec/shared/adapter_spec.rb +366 -0
- data/lib/dm-core/spec/shared/public/property_spec.rb +229 -0
- data/lib/dm-core/spec/shared/resource_spec.rb +1221 -0
- data/lib/dm-core/spec/shared/sel_spec.rb +111 -0
- data/lib/dm-core/spec/shared/semipublic/property_spec.rb +184 -0
- data/lib/dm-core/spec/shared/semipublic/query/conditions/abstract_comparison_spec.rb +261 -0
- data/lib/dm-core/support/assertions.rb +8 -0
- data/lib/dm-core/support/chainable.rb +18 -0
- data/lib/dm-core/support/deprecate.rb +12 -0
- data/lib/dm-core/support/descendant_set.rb +89 -0
- data/lib/dm-core/support/equalizer.rb +48 -0
- data/lib/dm-core/support/ext/array.rb +22 -0
- data/lib/dm-core/support/ext/blank.rb +25 -0
- data/lib/dm-core/support/ext/hash.rb +67 -0
- data/lib/dm-core/support/ext/module.rb +47 -0
- data/lib/dm-core/support/ext/object.rb +57 -0
- data/lib/dm-core/support/ext/string.rb +24 -0
- data/lib/dm-core/support/ext/try_dup.rb +12 -0
- data/lib/dm-core/support/hook.rb +388 -0
- data/lib/dm-core/support/inflections.rb +60 -0
- data/lib/dm-core/support/inflector/inflections.rb +211 -0
- data/lib/dm-core/support/inflector/methods.rb +151 -0
- data/lib/dm-core/support/lazy_array.rb +451 -0
- data/lib/dm-core/support/local_object_space.rb +13 -0
- data/lib/dm-core/support/logger.rb +201 -0
- data/lib/dm-core/support/mash.rb +176 -0
- data/lib/dm-core/support/naming_conventions.rb +109 -0
- data/lib/dm-core/support/ordered_set.rb +381 -0
- data/lib/dm-core/support/subject.rb +33 -0
- data/lib/dm-core/support/subject_set.rb +251 -0
- data/lib/dm-core/version.rb +3 -0
- data/lib/dm-core.rb +274 -0
- data/script/performance.rb +275 -0
- data/script/profile.rb +218 -0
- data/spec/lib/rspec_immediate_feedback_formatter.rb +54 -0
- data/spec/public/associations/many_to_many/read_multiple_join_spec.rb +69 -0
- data/spec/public/associations/many_to_many_spec.rb +197 -0
- data/spec/public/associations/many_to_one_spec.rb +83 -0
- data/spec/public/associations/many_to_one_with_boolean_cpk_spec.rb +40 -0
- data/spec/public/associations/many_to_one_with_custom_fk_spec.rb +49 -0
- data/spec/public/associations/one_to_many_spec.rb +81 -0
- data/spec/public/associations/one_to_one_spec.rb +176 -0
- data/spec/public/associations/one_to_one_with_boolean_cpk_spec.rb +46 -0
- data/spec/public/collection_spec.rb +69 -0
- data/spec/public/finalize_spec.rb +77 -0
- data/spec/public/model/hook_spec.rb +245 -0
- data/spec/public/model/property_spec.rb +91 -0
- data/spec/public/model/relationship_spec.rb +1040 -0
- data/spec/public/model_spec.rb +456 -0
- data/spec/public/property/binary_spec.rb +43 -0
- data/spec/public/property/boolean_spec.rb +21 -0
- data/spec/public/property/class_spec.rb +27 -0
- data/spec/public/property/date_spec.rb +21 -0
- data/spec/public/property/date_time_spec.rb +21 -0
- data/spec/public/property/decimal_spec.rb +23 -0
- data/spec/public/property/discriminator_spec.rb +134 -0
- data/spec/public/property/float_spec.rb +22 -0
- data/spec/public/property/integer_spec.rb +22 -0
- data/spec/public/property/object_spec.rb +117 -0
- data/spec/public/property/serial_spec.rb +22 -0
- data/spec/public/property/string_spec.rb +21 -0
- data/spec/public/property/text_spec.rb +62 -0
- data/spec/public/property/time_spec.rb +21 -0
- data/spec/public/property_spec.rb +333 -0
- data/spec/public/resource/state_spec.rb +72 -0
- data/spec/public/resource_spec.rb +289 -0
- data/spec/public/sel_spec.rb +53 -0
- data/spec/public/setup_spec.rb +145 -0
- data/spec/public/shared/association_collection_shared_spec.rb +309 -0
- data/spec/public/shared/collection_finder_shared_spec.rb +267 -0
- data/spec/public/shared/collection_shared_spec.rb +1637 -0
- data/spec/public/shared/finder_shared_spec.rb +1647 -0
- data/spec/semipublic/adapters/abstract_adapter_spec.rb +30 -0
- data/spec/semipublic/adapters/in_memory_adapter_spec.rb +13 -0
- data/spec/semipublic/associations/many_to_many_spec.rb +94 -0
- data/spec/semipublic/associations/many_to_one_spec.rb +63 -0
- data/spec/semipublic/associations/one_to_many_spec.rb +55 -0
- data/spec/semipublic/associations/one_to_one_spec.rb +53 -0
- data/spec/semipublic/associations/relationship_spec.rb +200 -0
- data/spec/semipublic/associations_spec.rb +177 -0
- data/spec/semipublic/collection_spec.rb +110 -0
- data/spec/semipublic/model_spec.rb +96 -0
- data/spec/semipublic/property/binary_spec.rb +13 -0
- data/spec/semipublic/property/boolean_spec.rb +47 -0
- data/spec/semipublic/property/class_spec.rb +33 -0
- data/spec/semipublic/property/date_spec.rb +43 -0
- data/spec/semipublic/property/date_time_spec.rb +46 -0
- data/spec/semipublic/property/decimal_spec.rb +83 -0
- data/spec/semipublic/property/discriminator_spec.rb +19 -0
- data/spec/semipublic/property/float_spec.rb +82 -0
- data/spec/semipublic/property/integer_spec.rb +82 -0
- data/spec/semipublic/property/lookup_spec.rb +29 -0
- data/spec/semipublic/property/serial_spec.rb +13 -0
- data/spec/semipublic/property/string_spec.rb +13 -0
- data/spec/semipublic/property/text_spec.rb +31 -0
- data/spec/semipublic/property/time_spec.rb +50 -0
- data/spec/semipublic/property_spec.rb +114 -0
- data/spec/semipublic/query/conditions/comparison_spec.rb +1502 -0
- data/spec/semipublic/query/conditions/operation_spec.rb +1296 -0
- data/spec/semipublic/query/path_spec.rb +471 -0
- data/spec/semipublic/query_spec.rb +3665 -0
- data/spec/semipublic/resource/state/clean_spec.rb +89 -0
- data/spec/semipublic/resource/state/deleted_spec.rb +79 -0
- data/spec/semipublic/resource/state/dirty_spec.rb +163 -0
- data/spec/semipublic/resource/state/immutable_spec.rb +107 -0
- data/spec/semipublic/resource/state/transient_spec.rb +163 -0
- data/spec/semipublic/resource/state_spec.rb +230 -0
- data/spec/semipublic/resource_spec.rb +23 -0
- data/spec/semipublic/shared/condition_shared_spec.rb +9 -0
- data/spec/semipublic/shared/resource_shared_spec.rb +198 -0
- data/spec/semipublic/shared/resource_state_shared_spec.rb +91 -0
- data/spec/semipublic/shared/subject_shared_spec.rb +79 -0
- data/spec/spec_helper.rb +34 -0
- data/spec/support/core_ext/hash.rb +10 -0
- data/spec/support/core_ext/inheritable_attributes.rb +46 -0
- data/spec/support/properties/huge_integer.rb +17 -0
- data/spec/unit/array_spec.rb +23 -0
- data/spec/unit/blank_spec.rb +73 -0
- data/spec/unit/data_mapper/ordered_set/append_spec.rb +26 -0
- data/spec/unit/data_mapper/ordered_set/clear_spec.rb +24 -0
- data/spec/unit/data_mapper/ordered_set/delete_spec.rb +28 -0
- data/spec/unit/data_mapper/ordered_set/each_spec.rb +19 -0
- data/spec/unit/data_mapper/ordered_set/empty_spec.rb +20 -0
- data/spec/unit/data_mapper/ordered_set/entries_spec.rb +22 -0
- data/spec/unit/data_mapper/ordered_set/eql_spec.rb +51 -0
- data/spec/unit/data_mapper/ordered_set/equal_value_spec.rb +84 -0
- data/spec/unit/data_mapper/ordered_set/hash_spec.rb +12 -0
- data/spec/unit/data_mapper/ordered_set/include_spec.rb +23 -0
- data/spec/unit/data_mapper/ordered_set/index_spec.rb +28 -0
- data/spec/unit/data_mapper/ordered_set/initialize_spec.rb +32 -0
- data/spec/unit/data_mapper/ordered_set/merge_spec.rb +36 -0
- data/spec/unit/data_mapper/ordered_set/shared/append_spec.rb +24 -0
- data/spec/unit/data_mapper/ordered_set/shared/clear_spec.rb +9 -0
- data/spec/unit/data_mapper/ordered_set/shared/delete_spec.rb +25 -0
- data/spec/unit/data_mapper/ordered_set/shared/each_spec.rb +17 -0
- data/spec/unit/data_mapper/ordered_set/shared/empty_spec.rb +9 -0
- data/spec/unit/data_mapper/ordered_set/shared/entries_spec.rb +9 -0
- data/spec/unit/data_mapper/ordered_set/shared/include_spec.rb +9 -0
- data/spec/unit/data_mapper/ordered_set/shared/index_spec.rb +13 -0
- data/spec/unit/data_mapper/ordered_set/shared/initialize_spec.rb +28 -0
- data/spec/unit/data_mapper/ordered_set/shared/merge_spec.rb +28 -0
- data/spec/unit/data_mapper/ordered_set/shared/size_spec.rb +13 -0
- data/spec/unit/data_mapper/ordered_set/shared/to_ary_spec.rb +11 -0
- data/spec/unit/data_mapper/ordered_set/size_spec.rb +27 -0
- data/spec/unit/data_mapper/ordered_set/to_ary_spec.rb +23 -0
- data/spec/unit/data_mapper/subject_set/append_spec.rb +47 -0
- data/spec/unit/data_mapper/subject_set/clear_spec.rb +34 -0
- data/spec/unit/data_mapper/subject_set/delete_spec.rb +40 -0
- data/spec/unit/data_mapper/subject_set/each_spec.rb +30 -0
- data/spec/unit/data_mapper/subject_set/empty_spec.rb +31 -0
- data/spec/unit/data_mapper/subject_set/entries_spec.rb +31 -0
- data/spec/unit/data_mapper/subject_set/get_spec.rb +34 -0
- data/spec/unit/data_mapper/subject_set/include_spec.rb +32 -0
- data/spec/unit/data_mapper/subject_set/named_spec.rb +33 -0
- data/spec/unit/data_mapper/subject_set/shared/append_spec.rb +18 -0
- data/spec/unit/data_mapper/subject_set/shared/clear_spec.rb +9 -0
- data/spec/unit/data_mapper/subject_set/shared/delete_spec.rb +9 -0
- data/spec/unit/data_mapper/subject_set/shared/each_spec.rb +9 -0
- data/spec/unit/data_mapper/subject_set/shared/empty_spec.rb +9 -0
- data/spec/unit/data_mapper/subject_set/shared/entries_spec.rb +9 -0
- data/spec/unit/data_mapper/subject_set/shared/get_spec.rb +9 -0
- data/spec/unit/data_mapper/subject_set/shared/include_spec.rb +9 -0
- data/spec/unit/data_mapper/subject_set/shared/named_spec.rb +9 -0
- data/spec/unit/data_mapper/subject_set/shared/size_spec.rb +13 -0
- data/spec/unit/data_mapper/subject_set/shared/to_ary_spec.rb +9 -0
- data/spec/unit/data_mapper/subject_set/shared/values_at_spec.rb +44 -0
- data/spec/unit/data_mapper/subject_set/size_spec.rb +42 -0
- data/spec/unit/data_mapper/subject_set/to_ary_spec.rb +34 -0
- data/spec/unit/data_mapper/subject_set/values_at_spec.rb +57 -0
- data/spec/unit/hash_spec.rb +27 -0
- data/spec/unit/hook_spec.rb +1216 -0
- data/spec/unit/inflections_spec.rb +14 -0
- data/spec/unit/lazy_array_spec.rb +1949 -0
- data/spec/unit/mash_spec.rb +289 -0
- data/spec/unit/module_spec.rb +70 -0
- data/spec/unit/object_spec.rb +38 -0
- data/spec/unit/try_dup_spec.rb +46 -0
- data/tasks/ci.rake +1 -0
- data/tasks/spec.rake +18 -0
- data/tasks/yard.rake +9 -0
- data/tasks/yardstick.rake +19 -0
- metadata +323 -0
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# TODO: rename this DM::Symbol::Direction
|
|
2
|
+
|
|
3
|
+
# TODO: add a method to convert it into a DM::Query::Sort object, eg:
|
|
4
|
+
# operator.sort_for(model)
|
|
5
|
+
|
|
6
|
+
# TODO: rename #target to #property_name
|
|
7
|
+
|
|
8
|
+
# TODO: make sure Query converts this into a DM::Query::Sort object
|
|
9
|
+
# immediately and passes that down to the Adapter
|
|
10
|
+
|
|
11
|
+
# TODO: remove #get method
|
|
12
|
+
|
|
13
|
+
module DataMapper
|
|
14
|
+
class Query
|
|
15
|
+
class Direction < Operator
|
|
16
|
+
# @api private
|
|
17
|
+
def reverse!
|
|
18
|
+
@operator = (@operator == :asc) ? :desc : :asc
|
|
19
|
+
self
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# @api private
|
|
23
|
+
def get(resource)
|
|
24
|
+
Sort.new(target.get(resource), @operator == :asc)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# @api private
|
|
28
|
+
private def initialize(target, operator = :asc)
|
|
29
|
+
super
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# TODO: rename this DM::Symbol::Operator
|
|
2
|
+
|
|
3
|
+
# TODO: add a method to convert it into a DM::Query::AbstractComparison object, eg:
|
|
4
|
+
# operator.comparison_for(repository, model)
|
|
5
|
+
|
|
6
|
+
# TODO: rename #target to #property_name
|
|
7
|
+
|
|
8
|
+
module DataMapper
|
|
9
|
+
class Query
|
|
10
|
+
class Operator
|
|
11
|
+
include DataMapper::Assertions
|
|
12
|
+
extend Equalizer
|
|
13
|
+
|
|
14
|
+
equalize :target, :operator
|
|
15
|
+
|
|
16
|
+
# @api private
|
|
17
|
+
attr_reader :target
|
|
18
|
+
|
|
19
|
+
# @api private
|
|
20
|
+
attr_reader :operator
|
|
21
|
+
|
|
22
|
+
# @api private
|
|
23
|
+
def inspect
|
|
24
|
+
"#<#{self.class.name} @target=#{target.inspect} @operator=#{operator.inspect}>"
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# @api private
|
|
28
|
+
private def initialize(target, operator)
|
|
29
|
+
@target = target
|
|
30
|
+
@operator = operator.to_sym
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
# TODO: instead of an Array of Path objects, create a Relationship
|
|
2
|
+
# on the fly using :through on the previous relationship, creating a
|
|
3
|
+
# chain. Query::Path could then be a thin wrapper that specifies extra
|
|
4
|
+
# conditions on the Relationships, like the target property o match
|
|
5
|
+
# on.
|
|
6
|
+
|
|
7
|
+
module DataMapper
|
|
8
|
+
class Query
|
|
9
|
+
class Path
|
|
10
|
+
# TODO: replace this with BasicObject
|
|
11
|
+
instance_methods.each do |method|
|
|
12
|
+
next if method =~ /\A__/ ||
|
|
13
|
+
%w(send class dup object_id kind_of? instance_of? respond_to? respond_to_missing? equal? freeze frozen? should should_not
|
|
14
|
+
instance_variables instance_variable_set instance_variable_get instance_variable_defined? remove_instance_variable extend
|
|
15
|
+
hash inspect to_s copy_object initialize_dup).include?(method.to_s)
|
|
16
|
+
|
|
17
|
+
undef_method method
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
include DataMapper::Assertions
|
|
21
|
+
extend Equalizer
|
|
22
|
+
|
|
23
|
+
equalize :relationships, :property
|
|
24
|
+
|
|
25
|
+
# @api semipublic
|
|
26
|
+
attr_reader :repository_name
|
|
27
|
+
|
|
28
|
+
# @api semipublic
|
|
29
|
+
attr_reader :relationships
|
|
30
|
+
|
|
31
|
+
# @api semipublic
|
|
32
|
+
attr_reader :model
|
|
33
|
+
|
|
34
|
+
# @api semipublic
|
|
35
|
+
attr_reader :property
|
|
36
|
+
|
|
37
|
+
(Conditions::Comparison.slugs | [:not]).each do |slug|
|
|
38
|
+
class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
|
39
|
+
def #{slug} # def eql
|
|
40
|
+
#{if %i(eql in).include?(slug)
|
|
41
|
+
"raise \"explicit use of '#{slug}' operator is deprecated (#{caller.first})\""
|
|
42
|
+
end} # raise "explicit use of 'eql' operator is deprecated (#{caller.first})"
|
|
43
|
+
Operator.new(self, #{slug.inspect}) # Operator.new(self, :eql)
|
|
44
|
+
end # end
|
|
45
|
+
RUBY
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# @api public
|
|
49
|
+
def kind_of?(klass)
|
|
50
|
+
super || (defined?(@property) ? @property.is_a?(klass) : false)
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# @api public
|
|
54
|
+
def instance_of?(klass)
|
|
55
|
+
super || (defined?(@property) ? @property.instance_of?(klass) : false)
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# Used for creating :order options. This technique may be deprecated,
|
|
59
|
+
# so marking as semipublic until the issue is resolved.
|
|
60
|
+
#
|
|
61
|
+
# @api semipublic
|
|
62
|
+
def asc
|
|
63
|
+
Operator.new(property, :asc)
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
# Used for creating :order options. This technique may be deprecated,
|
|
67
|
+
# so marking as semipublic until the issue is resolved.
|
|
68
|
+
#
|
|
69
|
+
# @api semipublic
|
|
70
|
+
def desc
|
|
71
|
+
Operator.new(property, :desc)
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
# @api semipublic
|
|
75
|
+
def respond_to?(method, include_private = false)
|
|
76
|
+
super ||
|
|
77
|
+
(defined?(@property) && @property.respond_to?(method, include_private)) ||
|
|
78
|
+
@model.relationships(@repository_name).named?(method) ||
|
|
79
|
+
@model.properties(@repository_name).named?(method)
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
# @api semipublic
|
|
83
|
+
private def initialize(relationships, property_name = nil)
|
|
84
|
+
@relationships = relationships.to_ary.dup
|
|
85
|
+
|
|
86
|
+
last_relationship = @relationships.last
|
|
87
|
+
@repository_name = last_relationship.relative_target_repository_name
|
|
88
|
+
@model = last_relationship.target_model
|
|
89
|
+
|
|
90
|
+
return unless property_name
|
|
91
|
+
|
|
92
|
+
property_name = property_name.to_sym
|
|
93
|
+
@property = @model.properties(@repository_name)[property_name] ||
|
|
94
|
+
raise(ArgumentError, "Unknown property '#{property_name}' in #{@model}")
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
# @api semipublic
|
|
98
|
+
private def method_missing(method, *args)
|
|
99
|
+
return @property.send(method, *args) if @property
|
|
100
|
+
|
|
101
|
+
path_class = self.class
|
|
102
|
+
|
|
103
|
+
if (relationship = @model.relationships(@repository_name)[method])
|
|
104
|
+
return path_class.new(@relationships.dup << relationship)
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
return path_class.new(@relationships, method) if @model.properties(@repository_name).named?(method)
|
|
108
|
+
|
|
109
|
+
raise NoMethodError, "undefined property or relationship '#{method}' on #{@model}"
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
end
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# TODO: add #reverse and #reverse! methods
|
|
2
|
+
|
|
3
|
+
module DataMapper
|
|
4
|
+
class Query
|
|
5
|
+
class Sort
|
|
6
|
+
# @api semipublic
|
|
7
|
+
attr_reader :value
|
|
8
|
+
|
|
9
|
+
# @api semipublic
|
|
10
|
+
def direction
|
|
11
|
+
@ascending ? :ascending : :descending
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
# @api private
|
|
15
|
+
def <=>(other)
|
|
16
|
+
other_value = other.value
|
|
17
|
+
value_nil = @value.nil?
|
|
18
|
+
other_nil = other_value.nil?
|
|
19
|
+
|
|
20
|
+
cmp = if value_nil
|
|
21
|
+
other_nil ? 0 : 1
|
|
22
|
+
elsif other_nil
|
|
23
|
+
-1
|
|
24
|
+
else
|
|
25
|
+
@value <=> other_value
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
@ascending ? cmp : cmp * -1
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# @api private
|
|
32
|
+
private def initialize(value, ascending = true)
|
|
33
|
+
@value = value
|
|
34
|
+
@ascending = ascending
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|