mark_mapper 0.0.1
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/LICENSE +21 -0
- data/README.rdoc +39 -0
- data/examples/attr_accessible.rb +24 -0
- data/examples/attr_protected.rb +24 -0
- data/examples/cache_key.rb +26 -0
- data/examples/custom_types.rb +26 -0
- data/examples/identity_map.rb +30 -0
- data/examples/identity_map/automatic.rb +2 -0
- data/examples/keys.rb +42 -0
- data/examples/modifiers/set.rb +27 -0
- data/examples/plugins.rb +40 -0
- data/examples/querying.rb +39 -0
- data/examples/sample_app.rb +43 -0
- data/examples/scopes.rb +56 -0
- data/examples/validating/embedded_docs.rb +31 -0
- data/lib/mark_mapper.rb +125 -0
- data/lib/mark_mapper/config.rb +90 -0
- data/lib/mark_mapper/connection.rb +60 -0
- data/lib/mark_mapper/criteria_hash.rb +194 -0
- data/lib/mark_mapper/document.rb +46 -0
- data/lib/mark_mapper/embedded_document.rb +32 -0
- data/lib/mark_mapper/exceptions.rb +33 -0
- data/lib/mark_mapper/extensions/array.rb +27 -0
- data/lib/mark_mapper/extensions/boolean.rb +45 -0
- data/lib/mark_mapper/extensions/date.rb +29 -0
- data/lib/mark_mapper/extensions/duplicable.rb +86 -0
- data/lib/mark_mapper/extensions/float.rb +18 -0
- data/lib/mark_mapper/extensions/hash.rb +26 -0
- data/lib/mark_mapper/extensions/integer.rb +27 -0
- data/lib/mark_mapper/extensions/kernel.rb +11 -0
- data/lib/mark_mapper/extensions/nil_class.rb +18 -0
- data/lib/mark_mapper/extensions/object.rb +30 -0
- data/lib/mark_mapper/extensions/object_id.rb +18 -0
- data/lib/mark_mapper/extensions/set.rb +20 -0
- data/lib/mark_mapper/extensions/string.rb +31 -0
- data/lib/mark_mapper/extensions/symbol.rb +87 -0
- data/lib/mark_mapper/extensions/time.rb +29 -0
- data/lib/mark_mapper/locale/en.yml +5 -0
- data/lib/mark_mapper/middleware/identity_map.rb +41 -0
- data/lib/mark_mapper/normalizers/criteria_hash_key.rb +17 -0
- data/lib/mark_mapper/normalizers/criteria_hash_value.rb +66 -0
- data/lib/mark_mapper/normalizers/fields_value.rb +26 -0
- data/lib/mark_mapper/normalizers/hash_key.rb +19 -0
- data/lib/mark_mapper/normalizers/integer.rb +19 -0
- data/lib/mark_mapper/normalizers/options_hash_value.rb +83 -0
- data/lib/mark_mapper/normalizers/sort_value.rb +55 -0
- data/lib/mark_mapper/options_hash.rb +103 -0
- data/lib/mark_mapper/pagination.rb +6 -0
- data/lib/mark_mapper/pagination/collection.rb +32 -0
- data/lib/mark_mapper/pagination/paginator.rb +46 -0
- data/lib/mark_mapper/plugins.rb +22 -0
- data/lib/mark_mapper/plugins/accessible.rb +61 -0
- data/lib/mark_mapper/plugins/active_model.rb +18 -0
- data/lib/mark_mapper/plugins/associations.rb +96 -0
- data/lib/mark_mapper/plugins/associations/base.rb +98 -0
- data/lib/mark_mapper/plugins/associations/belongs_to_association.rb +63 -0
- data/lib/mark_mapper/plugins/associations/belongs_to_polymorphic_proxy.rb +35 -0
- data/lib/mark_mapper/plugins/associations/belongs_to_proxy.rb +52 -0
- data/lib/mark_mapper/plugins/associations/collection.rb +29 -0
- data/lib/mark_mapper/plugins/associations/embedded_collection.rb +44 -0
- data/lib/mark_mapper/plugins/associations/in_array_proxy.rb +133 -0
- data/lib/mark_mapper/plugins/associations/many_association.rb +63 -0
- data/lib/mark_mapper/plugins/associations/many_documents_as_proxy.rb +28 -0
- data/lib/mark_mapper/plugins/associations/many_documents_proxy.rb +142 -0
- data/lib/mark_mapper/plugins/associations/many_embedded_polymorphic_proxy.rb +32 -0
- data/lib/mark_mapper/plugins/associations/many_embedded_proxy.rb +24 -0
- data/lib/mark_mapper/plugins/associations/many_polymorphic_proxy.rb +14 -0
- data/lib/mark_mapper/plugins/associations/one_as_proxy.rb +22 -0
- data/lib/mark_mapper/plugins/associations/one_association.rb +48 -0
- data/lib/mark_mapper/plugins/associations/one_embedded_polymorphic_proxy.rb +30 -0
- data/lib/mark_mapper/plugins/associations/one_embedded_proxy.rb +44 -0
- data/lib/mark_mapper/plugins/associations/one_proxy.rb +95 -0
- data/lib/mark_mapper/plugins/associations/proxy.rb +138 -0
- data/lib/mark_mapper/plugins/associations/single_association.rb +46 -0
- data/lib/mark_mapper/plugins/caching.rb +21 -0
- data/lib/mark_mapper/plugins/callbacks.rb +42 -0
- data/lib/mark_mapper/plugins/clone.rb +24 -0
- data/lib/mark_mapper/plugins/counter_cache.rb +97 -0
- data/lib/mark_mapper/plugins/dirty.rb +61 -0
- data/lib/mark_mapper/plugins/document.rb +41 -0
- data/lib/mark_mapper/plugins/dumpable.rb +22 -0
- data/lib/mark_mapper/plugins/dynamic_querying.rb +45 -0
- data/lib/mark_mapper/plugins/dynamic_querying/dynamic_finder.rb +44 -0
- data/lib/mark_mapper/plugins/embedded_callbacks.rb +81 -0
- data/lib/mark_mapper/plugins/embedded_document.rb +53 -0
- data/lib/mark_mapper/plugins/equality.rb +23 -0
- data/lib/mark_mapper/plugins/identity_map.rb +144 -0
- data/lib/mark_mapper/plugins/indexable.rb +86 -0
- data/lib/mark_mapper/plugins/inspect.rb +16 -0
- data/lib/mark_mapper/plugins/keys.rb +470 -0
- data/lib/mark_mapper/plugins/keys/key.rb +134 -0
- data/lib/mark_mapper/plugins/keys/static.rb +45 -0
- data/lib/mark_mapper/plugins/logger.rb +18 -0
- data/lib/mark_mapper/plugins/modifiers.rb +140 -0
- data/lib/mark_mapper/plugins/pagination.rb +16 -0
- data/lib/mark_mapper/plugins/partial_updates.rb +77 -0
- data/lib/mark_mapper/plugins/persistence.rb +79 -0
- data/lib/mark_mapper/plugins/protected.rb +45 -0
- data/lib/mark_mapper/plugins/querying.rb +173 -0
- data/lib/mark_mapper/plugins/querying/decorated_markmapper_query.rb +75 -0
- data/lib/mark_mapper/plugins/rails.rb +79 -0
- data/lib/mark_mapper/plugins/rails/active_record_association_adapter.rb +33 -0
- data/lib/mark_mapper/plugins/sci.rb +82 -0
- data/lib/mark_mapper/plugins/scopes.rb +28 -0
- data/lib/mark_mapper/plugins/serialization.rb +109 -0
- data/lib/mark_mapper/plugins/timestamps.rb +29 -0
- data/lib/mark_mapper/plugins/touch.rb +18 -0
- data/lib/mark_mapper/plugins/userstamps.rb +18 -0
- data/lib/mark_mapper/plugins/validations.rb +96 -0
- data/lib/mark_mapper/query.rb +278 -0
- data/lib/mark_mapper/railtie.rb +52 -0
- data/lib/mark_mapper/railtie/database.rake +65 -0
- data/lib/mark_mapper/translation.rb +10 -0
- data/lib/mark_mapper/version.rb +4 -0
- data/lib/rails/generators/mark_mapper/config/config_generator.rb +37 -0
- data/lib/rails/generators/mark_mapper/config/templates/marklogic.yml +19 -0
- data/lib/rails/generators/mark_mapper/model/model_generator.rb +40 -0
- data/lib/rails/generators/mark_mapper/model/templates/model.rb +17 -0
- data/spec/config/mark_mapper.yml +6 -0
- data/spec/examples_spec.rb +25 -0
- data/spec/functional/accessible_spec.rb +198 -0
- data/spec/functional/associations/belongs_to_polymorphic_proxy_spec.rb +64 -0
- data/spec/functional/associations/belongs_to_proxy_spec.rb +255 -0
- data/spec/functional/associations/in_array_proxy_spec.rb +349 -0
- data/spec/functional/associations/many_documents_as_proxy_spec.rb +230 -0
- data/spec/functional/associations/many_documents_proxy_spec.rb +968 -0
- data/spec/functional/associations/many_embedded_polymorphic_proxy_spec.rb +238 -0
- data/spec/functional/associations/many_embedded_proxy_spec.rb +288 -0
- data/spec/functional/associations/many_polymorphic_proxy_spec.rb +302 -0
- data/spec/functional/associations/one_as_proxy_spec.rb +489 -0
- data/spec/functional/associations/one_embedded_polymorphic_proxy_spec.rb +207 -0
- data/spec/functional/associations/one_embedded_proxy_spec.rb +100 -0
- data/spec/functional/associations/one_proxy_spec.rb +406 -0
- data/spec/functional/associations_spec.rb +48 -0
- data/spec/functional/caching_spec.rb +75 -0
- data/spec/functional/callbacks_spec.rb +330 -0
- data/spec/functional/counter_cache_spec.rb +235 -0
- data/spec/functional/dirty_spec.rb +316 -0
- data/spec/functional/document_spec.rb +310 -0
- data/spec/functional/dumpable_spec.rb +24 -0
- data/spec/functional/dynamic_querying_spec.rb +75 -0
- data/spec/functional/embedded_document_spec.rb +316 -0
- data/spec/functional/equality_spec.rb +20 -0
- data/spec/functional/extensions_spec.rb +16 -0
- data/spec/functional/identity_map_spec.rb +483 -0
- data/spec/functional/keys_spec.rb +339 -0
- data/spec/functional/logger_spec.rb +20 -0
- data/spec/functional/modifiers_spec.rb +446 -0
- data/spec/functional/options_hash_spec.rb +41 -0
- data/spec/functional/pagination_spec.rb +89 -0
- data/spec/functional/partial_updates_spec.rb +530 -0
- data/spec/functional/protected_spec.rb +199 -0
- data/spec/functional/querying_spec.rb +984 -0
- data/spec/functional/rails_spec.rb +55 -0
- data/spec/functional/sci_spec.rb +374 -0
- data/spec/functional/scopes_spec.rb +204 -0
- data/spec/functional/static_keys_spec.rb +153 -0
- data/spec/functional/timestamps_spec.rb +97 -0
- data/spec/functional/touch_spec.rb +125 -0
- data/spec/functional/userstamps_spec.rb +46 -0
- data/spec/functional/validations_spec.rb +416 -0
- data/spec/quality_spec.rb +51 -0
- data/spec/spec_helper.rb +150 -0
- data/spec/support/matchers.rb +15 -0
- data/spec/support/models.rb +256 -0
- data/spec/symbol_operator_spec.rb +70 -0
- data/spec/symbol_spec.rb +9 -0
- data/spec/unit/associations/base_spec.rb +146 -0
- data/spec/unit/associations/belongs_to_association_spec.rb +30 -0
- data/spec/unit/associations/many_association_spec.rb +64 -0
- data/spec/unit/associations/one_association_spec.rb +48 -0
- data/spec/unit/associations/proxy_spec.rb +103 -0
- data/spec/unit/clone_spec.rb +79 -0
- data/spec/unit/config_generator_spec.rb +24 -0
- data/spec/unit/criteria_hash_spec.rb +218 -0
- data/spec/unit/document_spec.rb +251 -0
- data/spec/unit/dynamic_finder_spec.rb +125 -0
- data/spec/unit/embedded_document_spec.rb +676 -0
- data/spec/unit/equality_spec.rb +38 -0
- data/spec/unit/exceptions_spec.rb +12 -0
- data/spec/unit/extensions_spec.rb +368 -0
- data/spec/unit/identity_map_middleware_spec.rb +134 -0
- data/spec/unit/inspect_spec.rb +47 -0
- data/spec/unit/key_spec.rb +276 -0
- data/spec/unit/keys_spec.rb +155 -0
- data/spec/unit/mark_mapper_spec.rb +37 -0
- data/spec/unit/model_generator_spec.rb +45 -0
- data/spec/unit/normalizers/criteria_hash_key_spec.rb +37 -0
- data/spec/unit/normalizers/criteria_hash_value_spec.rb +200 -0
- data/spec/unit/normalizers/fields_value_spec.rb +45 -0
- data/spec/unit/normalizers/hash_key_spec.rb +15 -0
- data/spec/unit/normalizers/integer_spec.rb +24 -0
- data/spec/unit/normalizers/options_hash_value_spec.rb +99 -0
- data/spec/unit/normalizers/sort_value_spec.rb +98 -0
- data/spec/unit/options_hash_spec.rb +64 -0
- data/spec/unit/pagination/collection_spec.rb +30 -0
- data/spec/unit/pagination/paginator_spec.rb +118 -0
- data/spec/unit/pagination_spec.rb +11 -0
- data/spec/unit/plugins_spec.rb +89 -0
- data/spec/unit/query_spec.rb +837 -0
- data/spec/unit/rails_compatibility_spec.rb +40 -0
- data/spec/unit/rails_reflect_on_association_spec.rb +118 -0
- data/spec/unit/rails_spec.rb +188 -0
- data/spec/unit/serialization_spec.rb +169 -0
- data/spec/unit/serializers/json_serializer_spec.rb +218 -0
- data/spec/unit/serializers/xml_serializer_spec.rb +198 -0
- data/spec/unit/time_zones_spec.rb +44 -0
- data/spec/unit/translation_spec.rb +27 -0
- data/spec/unit/validations_spec.rb +588 -0
- metadata +307 -0
@@ -0,0 +1,18 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
module MarkMapper
|
3
|
+
module Extensions
|
4
|
+
module ObjectId
|
5
|
+
def to_marklogic(value)
|
6
|
+
MarkMapper.to_object_id(value)
|
7
|
+
end
|
8
|
+
|
9
|
+
def from_marklogic(value)
|
10
|
+
value
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
class ObjectId
|
17
|
+
extend MarkMapper::Extensions::ObjectId
|
18
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
require 'set'
|
3
|
+
|
4
|
+
module MarkMapper
|
5
|
+
module Extensions
|
6
|
+
module Set
|
7
|
+
def to_marklogic(value)
|
8
|
+
value.to_a
|
9
|
+
end
|
10
|
+
|
11
|
+
def from_marklogic(value)
|
12
|
+
(value || []).to_set
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
class Set
|
19
|
+
extend MarkMapper::Extensions::Set
|
20
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
module MarkMapper
|
3
|
+
module Extensions
|
4
|
+
module String
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
module ClassMethods
|
8
|
+
def to_marklogic(value)
|
9
|
+
value && value.to_s
|
10
|
+
end
|
11
|
+
|
12
|
+
def from_marklogic(value)
|
13
|
+
value && value.to_s
|
14
|
+
end
|
15
|
+
|
16
|
+
def xs_type
|
17
|
+
"string"
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
|
22
|
+
def _mark_mapper_deep_copy_
|
23
|
+
self.dup
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
class String
|
30
|
+
include MarkMapper::Extensions::String
|
31
|
+
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
module MarkMapper
|
3
|
+
module Extensions
|
4
|
+
module SymbolClassMethods
|
5
|
+
def to_marklogic(value)
|
6
|
+
value && value.to_s.to_sym
|
7
|
+
end
|
8
|
+
|
9
|
+
def from_marklogic(value)
|
10
|
+
value && value.to_s.to_sym
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
module SymbolnstanceMethods
|
15
|
+
def gt
|
16
|
+
SymbolOperator.new(self, 'gt')
|
17
|
+
end
|
18
|
+
|
19
|
+
def lt
|
20
|
+
SymbolOperator.new(self, 'lt')
|
21
|
+
end
|
22
|
+
|
23
|
+
def ge
|
24
|
+
SymbolOperator.new(self, 'ge')
|
25
|
+
end
|
26
|
+
|
27
|
+
def le
|
28
|
+
SymbolOperator.new(self, 'le')
|
29
|
+
end
|
30
|
+
|
31
|
+
def eq
|
32
|
+
SymbolOperator.new(self, 'eq')
|
33
|
+
end
|
34
|
+
|
35
|
+
def ne
|
36
|
+
SymbolOperator.new(self, 'ne')
|
37
|
+
end
|
38
|
+
|
39
|
+
def asc
|
40
|
+
SymbolOperator.new(self, 'asc')
|
41
|
+
end
|
42
|
+
|
43
|
+
def desc
|
44
|
+
SymbolOperator.new(self, 'desc')
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
class SymbolOperator
|
51
|
+
include Comparable
|
52
|
+
|
53
|
+
attr_reader :field, :operator
|
54
|
+
|
55
|
+
def initialize(field, operator)
|
56
|
+
@field, @operator = field, operator
|
57
|
+
end unless method_defined?(:initialize)
|
58
|
+
|
59
|
+
def <=>(other)
|
60
|
+
if field == other.field
|
61
|
+
operator <=> other.operator
|
62
|
+
else
|
63
|
+
field.to_s <=> other.field.to_s
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def hash
|
68
|
+
field.hash + operator.hash
|
69
|
+
end
|
70
|
+
|
71
|
+
def eql?(other)
|
72
|
+
self == other
|
73
|
+
end
|
74
|
+
|
75
|
+
def ==(other)
|
76
|
+
other.class == self.class && field == other.field && operator == other.operator
|
77
|
+
end
|
78
|
+
|
79
|
+
# def to_sym
|
80
|
+
# field
|
81
|
+
# end
|
82
|
+
end
|
83
|
+
|
84
|
+
class Symbol
|
85
|
+
extend MarkMapper::Extensions::SymbolClassMethods
|
86
|
+
include MarkMapper::Extensions::SymbolnstanceMethods
|
87
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'active_support/core_ext/time/zones'
|
2
|
+
|
3
|
+
# encoding: UTF-8
|
4
|
+
module MarkMapper
|
5
|
+
module Extensions
|
6
|
+
module Time
|
7
|
+
def to_marklogic(value)
|
8
|
+
if !value || '' == value
|
9
|
+
nil
|
10
|
+
else
|
11
|
+
time_class = ::Time.zone || ::Time
|
12
|
+
time = value.is_a?(::Time) ? value : time_class.parse(value.to_s, time_class.now)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def from_marklogic(value)
|
17
|
+
to_marklogic(value)
|
18
|
+
end
|
19
|
+
|
20
|
+
def xs_type
|
21
|
+
"dateTime"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
class Time
|
28
|
+
extend MarkMapper::Extensions::Time
|
29
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module MarkMapper
|
2
|
+
module Middleware
|
3
|
+
# Usage:
|
4
|
+
#
|
5
|
+
# config.middleware.insert_after \
|
6
|
+
# ActionDispatch::Callbacks,
|
7
|
+
# MarkMapper::Middleware::IdentityMap
|
8
|
+
#
|
9
|
+
# You have to insert after callbacks so the entire request is wrapped.
|
10
|
+
class IdentityMap
|
11
|
+
class Body
|
12
|
+
extend Forwardable
|
13
|
+
def_delegator :@target, :each
|
14
|
+
|
15
|
+
def initialize(target, original)
|
16
|
+
@target = target
|
17
|
+
@original = original
|
18
|
+
end
|
19
|
+
|
20
|
+
def close
|
21
|
+
@target.close if @target.respond_to?(:close)
|
22
|
+
ensure
|
23
|
+
MarkMapper::Plugins::IdentityMap.enabled = @original
|
24
|
+
MarkMapper::Plugins::IdentityMap.clear
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def initialize(app)
|
29
|
+
@app = app
|
30
|
+
end
|
31
|
+
|
32
|
+
def call(env)
|
33
|
+
MarkMapper::Plugins::IdentityMap.clear
|
34
|
+
enabled = MarkMapper::Plugins::IdentityMap.enabled
|
35
|
+
MarkMapper::Plugins::IdentityMap.enabled = true
|
36
|
+
status, headers, body = @app.call(env)
|
37
|
+
[status, headers, Body.new(body, enabled)]
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module MarkMapper
|
2
|
+
module Normalizers
|
3
|
+
class CriteriaHashKey
|
4
|
+
# Public: Returns key normalized for MarkLogic
|
5
|
+
#
|
6
|
+
# key - The key to normalize
|
7
|
+
#
|
8
|
+
# Returns key as Symbol if possible, else key with no changes
|
9
|
+
def call(key)
|
10
|
+
key = key.to_sym if key.respond_to?(:to_sym)
|
11
|
+
return call(key.field) if key.respond_to?(:field)
|
12
|
+
return :_id if key == :id
|
13
|
+
key
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
module MarkMapper
|
2
|
+
module Normalizers
|
3
|
+
class CriteriaHashValue
|
4
|
+
|
5
|
+
# Internal: Used by normalized_value to determine if we need to run the
|
6
|
+
# value through another criteria hash to normalize it.
|
7
|
+
NestingOperators = [:$or, :$and, :$nor]
|
8
|
+
|
9
|
+
def initialize(criteria_hash)
|
10
|
+
@criteria_hash = criteria_hash
|
11
|
+
end
|
12
|
+
|
13
|
+
# Public: Returns value normalized for MarkLogic
|
14
|
+
#
|
15
|
+
# parent_key - The parent key if nested, otherwise same as key
|
16
|
+
# key - The key we are currently normalizing
|
17
|
+
# value - The value that should be normalized
|
18
|
+
#
|
19
|
+
# Returns value normalized for MarkLogic
|
20
|
+
def call(parent_key, key, value)
|
21
|
+
case value
|
22
|
+
when Array, Set
|
23
|
+
if nesting_operator?(key)
|
24
|
+
value.map { |v| criteria_hash_class.new(v, options).to_hash }
|
25
|
+
elsif parent_key == key && !modifier?(key) && !value.empty?
|
26
|
+
# we're not nested and not the value for a symbol operator
|
27
|
+
{:$eq => value.to_a}
|
28
|
+
else
|
29
|
+
# we are a value for a symbol operator or nested hash
|
30
|
+
value.to_a
|
31
|
+
end
|
32
|
+
when Time
|
33
|
+
value.utc
|
34
|
+
when String
|
35
|
+
value
|
36
|
+
when Hash
|
37
|
+
value.each { |k, v| value[k] = call(key, k, v) }
|
38
|
+
value
|
39
|
+
when Regexp
|
40
|
+
Regexp.new(value)
|
41
|
+
else
|
42
|
+
value
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
# Private: Returns class of provided criteria hash
|
47
|
+
def criteria_hash_class
|
48
|
+
@criteria_hash.class
|
49
|
+
end
|
50
|
+
|
51
|
+
# Private: Returns options of provided criteria hash
|
52
|
+
def options
|
53
|
+
@criteria_hash.options
|
54
|
+
end
|
55
|
+
|
56
|
+
# Private: Returns true or false if key is a nesting operator
|
57
|
+
def nesting_operator?(key)
|
58
|
+
NestingOperators.include?(key)
|
59
|
+
end
|
60
|
+
|
61
|
+
def modifier?(key)
|
62
|
+
MarkMapper.modifier?(key)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module MarkMapper
|
2
|
+
module Normalizers
|
3
|
+
class FieldsValue
|
4
|
+
|
5
|
+
# Public: Given a value returns it normalized for MarkLogic's fields option
|
6
|
+
def call(value)
|
7
|
+
return nil if value.respond_to?(:empty?) && value.empty?
|
8
|
+
|
9
|
+
case value
|
10
|
+
when Array
|
11
|
+
if value.size == 1 && value.first.is_a?(Hash)
|
12
|
+
value.first
|
13
|
+
else
|
14
|
+
value.flatten
|
15
|
+
end
|
16
|
+
when Symbol
|
17
|
+
[value]
|
18
|
+
when String
|
19
|
+
value.split(',').map { |v| v.strip }
|
20
|
+
else
|
21
|
+
value
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module MarkMapper
|
2
|
+
module Normalizers
|
3
|
+
class HashKey
|
4
|
+
|
5
|
+
def initialize(keys)
|
6
|
+
@keys = keys
|
7
|
+
end
|
8
|
+
|
9
|
+
# Public: Normalizes an options hash key
|
10
|
+
#
|
11
|
+
# key - The key to normalize
|
12
|
+
#
|
13
|
+
# Returns a Symbol.
|
14
|
+
def call(key)
|
15
|
+
@keys.fetch key.to_sym, key
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module MarkMapper
|
2
|
+
module Normalizers
|
3
|
+
class Integer
|
4
|
+
|
5
|
+
# Public: Returns value coerced to integer or nil
|
6
|
+
#
|
7
|
+
# value - The value to normalize to an integer
|
8
|
+
#
|
9
|
+
# Returns an Integer or nil
|
10
|
+
def call(value)
|
11
|
+
if value.nil?
|
12
|
+
nil
|
13
|
+
else
|
14
|
+
value.to_i
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
require 'mark_mapper/normalizers/integer'
|
2
|
+
require 'mark_mapper/normalizers/fields_value'
|
3
|
+
require 'mark_mapper/normalizers/sort_value'
|
4
|
+
|
5
|
+
module MarkMapper
|
6
|
+
module Normalizers
|
7
|
+
class OptionsHashValue
|
8
|
+
|
9
|
+
# Public: Initialize an OptionsHashValue.
|
10
|
+
#
|
11
|
+
# args - The hash of arguments (default: {})
|
12
|
+
# :key_normalizer - The key normalizer to use, must respond to call
|
13
|
+
# :value_normalizers - Hash where key is name of options hash key
|
14
|
+
# to normalize and value is what should be used
|
15
|
+
# to normalize the value accordingly (must respond
|
16
|
+
# to call). Allows adding normalizers for new keys
|
17
|
+
# and overriding existing default normalizers.
|
18
|
+
#
|
19
|
+
#
|
20
|
+
# Examples
|
21
|
+
#
|
22
|
+
# MarkMapper::Normalizers::OptionsHashValue.new({
|
23
|
+
# :key_normalizer => lambda { |key| key}, # key normalizer must responds to call
|
24
|
+
# :value_normalizers => {
|
25
|
+
# :new_key => lambda { |key| key.to_s.upcase }, # add normalizer for :new_key
|
26
|
+
# :fields => lambda { |key| key }, # override normalizer for fields to one that does nothing
|
27
|
+
# }
|
28
|
+
# })
|
29
|
+
#
|
30
|
+
# Returns the duplicated String.
|
31
|
+
def initialize(args = {})
|
32
|
+
@key_normalizer = args.fetch(:key_normalizer) {
|
33
|
+
raise ArgumentError, "Missing required key :key_normalizer"
|
34
|
+
}
|
35
|
+
|
36
|
+
@value_normalizers = {
|
37
|
+
:fields => default_fields_value_normalizer,
|
38
|
+
:sort => default_sort_value_normalizer,
|
39
|
+
:limit => default_limit_value_normalizer,
|
40
|
+
:skip => default_skip_value_normalizer,
|
41
|
+
}
|
42
|
+
|
43
|
+
if (value_normalizers = args[:value_normalizers])
|
44
|
+
@value_normalizers.update(value_normalizers)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
# Public: Returns value normalized for MarkLogic
|
49
|
+
#
|
50
|
+
# key - The name of the key whose value is being normalized
|
51
|
+
# value - The value to normalize
|
52
|
+
#
|
53
|
+
# Returns value normalized for MarkLogic.
|
54
|
+
def call(key, value)
|
55
|
+
if (value_normalizer = @value_normalizers[key])
|
56
|
+
value_normalizer.call(value)
|
57
|
+
else
|
58
|
+
value
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
# Private
|
63
|
+
def default_fields_value_normalizer
|
64
|
+
Normalizers::FieldsValue.new
|
65
|
+
end
|
66
|
+
|
67
|
+
# Private
|
68
|
+
def default_sort_value_normalizer
|
69
|
+
Normalizers::SortValue.new(:key_normalizer => Normalizers::HashKey.new({:id => :_id}))
|
70
|
+
end
|
71
|
+
|
72
|
+
# Private
|
73
|
+
def default_limit_value_normalizer
|
74
|
+
Normalizers::Integer.new
|
75
|
+
end
|
76
|
+
|
77
|
+
# Private
|
78
|
+
def default_skip_value_normalizer
|
79
|
+
Normalizers::Integer.new
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|