mongo 1.12.5 → 2.0.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 +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/CONTRIBUTING.md +64 -0
- data/LICENSE +1 -1
- data/README.md +23 -125
- data/Rakefile +26 -21
- data/bin/mongo_console +6 -38
- data/lib/mongo.rb +23 -82
- data/lib/mongo/address.rb +111 -0
- data/lib/mongo/address/ipv4.rb +85 -0
- data/lib/mongo/address/ipv6.rb +85 -0
- data/lib/mongo/address/unix.rb +76 -0
- data/lib/mongo/auth.rb +108 -0
- data/lib/mongo/auth/cr.rb +44 -0
- data/lib/mongo/auth/cr/conversation.rb +119 -0
- data/lib/mongo/auth/executable.rb +52 -0
- data/lib/mongo/auth/ldap.rb +48 -0
- data/lib/mongo/auth/ldap/conversation.rb +92 -0
- data/lib/mongo/auth/roles.rb +104 -0
- data/lib/mongo/auth/scram.rb +53 -0
- data/lib/mongo/auth/scram/conversation.rb +450 -0
- data/lib/mongo/auth/user.rb +159 -0
- data/lib/mongo/auth/user/view.rb +102 -0
- data/lib/mongo/auth/x509.rb +48 -0
- data/lib/mongo/auth/x509/conversation.rb +92 -0
- data/lib/mongo/{gridfs.rb → bulk.rb} +2 -5
- data/lib/mongo/bulk/bulk_write.rb +307 -0
- data/lib/mongo/client.rb +233 -0
- data/lib/mongo/cluster.rb +203 -0
- data/lib/mongo/cluster/topology.rb +60 -0
- data/lib/mongo/cluster/topology/replica_set.rb +160 -0
- data/lib/mongo/cluster/topology/sharded.rb +132 -0
- data/lib/mongo/cluster/topology/standalone.rb +132 -0
- data/lib/mongo/cluster/topology/unknown.rb +155 -0
- data/lib/mongo/collection.rb +130 -1101
- data/lib/mongo/collection/view.rb +169 -0
- data/lib/mongo/collection/view/aggregation.rb +108 -0
- data/lib/mongo/collection/view/explainable.rb +49 -0
- data/lib/mongo/collection/view/immutable.rb +43 -0
- data/lib/mongo/collection/view/iterable.rb +48 -0
- data/lib/mongo/collection/view/map_reduce.rb +191 -0
- data/lib/mongo/collection/view/readable.rb +363 -0
- data/lib/mongo/collection/view/writable.rb +169 -0
- data/lib/mongo/cursor.rb +79 -680
- data/lib/mongo/database.rb +224 -0
- data/lib/mongo/database/view.rb +101 -0
- data/lib/mongo/error.rb +81 -0
- data/lib/mongo/error/bulk_write_failure.rb +41 -0
- data/lib/mongo/{utils/thread_local_variable_manager.rb → error/empty_batch.rb} +22 -8
- data/{test/functional/db_connection_test.rb → lib/mongo/error/invalid_bulk_operation.rb} +19 -8
- data/lib/mongo/error/invalid_collection_name.rb +39 -0
- data/lib/mongo/error/invalid_database_name.rb +39 -0
- data/{test/replica_set/ssl_test.rb → lib/mongo/error/invalid_document.rb} +21 -14
- data/lib/mongo/error/invalid_file.rb +38 -0
- data/lib/mongo/error/invalid_nonce.rb +46 -0
- data/lib/mongo/error/invalid_replacement_document.rb +39 -0
- data/lib/mongo/error/invalid_signature.rb +47 -0
- data/{test/functional/ssl_test.rb → lib/mongo/error/invalid_update_document.rb} +22 -12
- data/lib/mongo/error/max_bson_size.rb +40 -0
- data/lib/mongo/error/max_message_size.rb +42 -0
- data/lib/mongo/{utils.rb → error/need_primary_server.rb} +10 -6
- data/lib/mongo/{connection.rb → error/operation_failure.rb} +10 -6
- data/lib/mongo/error/parser.rb +77 -0
- data/lib/mongo/{connection/socket.rb → error/socket_error.rb} +10 -5
- data/lib/mongo/error/socket_timeout_error.rb +23 -0
- data/lib/mongo/error/unsupported_features.rb +43 -0
- data/lib/mongo/event.rb +40 -0
- data/lib/mongo/event/listeners.rb +63 -0
- data/lib/mongo/event/primary_elected.rb +53 -0
- data/lib/mongo/event/publisher.rb +42 -0
- data/lib/mongo/event/server_added.rb +53 -0
- data/lib/mongo/event/server_removed.rb +53 -0
- data/lib/mongo/event/subscriber.rb +41 -0
- data/lib/mongo/grid.rb +16 -0
- data/lib/mongo/grid/file.rb +94 -0
- data/lib/mongo/grid/file/chunk.rb +184 -0
- data/lib/mongo/grid/file/metadata.rb +223 -0
- data/lib/mongo/grid/fs.rb +149 -0
- data/lib/mongo/index.rb +64 -0
- data/lib/mongo/index/view.rb +205 -0
- data/lib/mongo/loggable.rb +126 -0
- data/lib/mongo/logger.rb +132 -0
- data/lib/mongo/operation.rb +26 -0
- data/lib/mongo/operation/aggregate.rb +100 -0
- data/lib/mongo/operation/aggregate/result.rb +84 -0
- data/lib/mongo/operation/batchable.rb +103 -0
- data/lib/mongo/operation/bulk_delete/result.rb +197 -0
- data/lib/mongo/operation/bulk_insert/result.rb +195 -0
- data/lib/mongo/operation/bulk_update/result.rb +295 -0
- data/lib/mongo/operation/command.rb +62 -0
- data/lib/mongo/operation/executable.rb +105 -0
- data/lib/mongo/operation/kill_cursors.rb +39 -0
- data/lib/mongo/operation/limited.rb +37 -0
- data/lib/mongo/operation/list_collections/result.rb +116 -0
- data/lib/mongo/operation/list_indexes/result.rb +118 -0
- data/lib/mongo/operation/map_reduce.rb +96 -0
- data/lib/mongo/operation/map_reduce/result.rb +122 -0
- data/lib/mongo/{functional.rb → operation/read.rb} +7 -7
- data/lib/mongo/operation/read/collections_info.rb +67 -0
- data/lib/mongo/operation/read/get_more.rb +71 -0
- data/lib/mongo/operation/read/indexes.rb +68 -0
- data/lib/mongo/operation/read/list_collections.rb +75 -0
- data/lib/mongo/operation/read/list_indexes.rb +77 -0
- data/lib/mongo/operation/read/query.rb +71 -0
- data/lib/mongo/operation/read_preferrable.rb +34 -0
- data/lib/mongo/operation/result.rb +259 -0
- data/lib/mongo/operation/specifiable.rb +380 -0
- data/lib/mongo/operation/write.rb +25 -0
- data/lib/mongo/operation/write/bulk_delete.rb +158 -0
- data/lib/mongo/operation/write/bulk_insert.rb +160 -0
- data/lib/mongo/operation/write/bulk_update.rb +167 -0
- data/lib/mongo/{connection/socket/socket_util.rb → operation/write/command.rb} +9 -24
- data/lib/mongo/operation/write/command/create_user.rb +43 -0
- data/lib/mongo/operation/write/command/delete.rb +56 -0
- data/lib/mongo/operation/write/command/drop_index.rb +51 -0
- data/lib/mongo/operation/write/command/ensure_index.rb +55 -0
- data/lib/mongo/operation/write/command/insert.rb +55 -0
- data/lib/mongo/operation/write/command/remove_user.rb +42 -0
- data/lib/mongo/operation/write/command/update.rb +60 -0
- data/lib/mongo/operation/write/command/writable.rb +61 -0
- data/lib/mongo/operation/write/create_index.rb +84 -0
- data/lib/mongo/operation/write/create_user.rb +75 -0
- data/lib/mongo/operation/write/delete.rb +91 -0
- data/lib/mongo/operation/write/drop_index.rb +62 -0
- data/lib/mongo/operation/write/insert.rb +88 -0
- data/lib/mongo/operation/write/remove_user.rb +70 -0
- data/lib/mongo/operation/write/update.rb +98 -0
- data/lib/mongo/protocol.rb +15 -0
- data/lib/mongo/protocol/bit_vector.rb +61 -0
- data/lib/mongo/protocol/delete.rb +94 -0
- data/lib/mongo/protocol/get_more.rb +99 -0
- data/lib/mongo/protocol/insert.rb +99 -0
- data/lib/mongo/protocol/kill_cursors.rb +74 -0
- data/lib/mongo/protocol/message.rb +252 -0
- data/lib/mongo/protocol/query.rb +147 -0
- data/lib/mongo/protocol/reply.rb +72 -0
- data/lib/mongo/protocol/serializers.rb +180 -0
- data/lib/mongo/protocol/update.rb +111 -0
- data/lib/mongo/server.rb +163 -0
- data/lib/mongo/server/connectable.rb +99 -0
- data/lib/mongo/server/connection.rb +133 -0
- data/lib/mongo/server/connection_pool.rb +141 -0
- data/lib/mongo/server/connection_pool/queue.rb +182 -0
- data/lib/mongo/server/context.rb +66 -0
- data/lib/mongo/server/description.rb +450 -0
- data/lib/mongo/server/description/features.rb +85 -0
- data/lib/mongo/server/description/inspector.rb +79 -0
- data/lib/mongo/server/description/inspector/primary_elected.rb +58 -0
- data/lib/mongo/server/description/inspector/server_added.rb +59 -0
- data/lib/mongo/server/description/inspector/server_removed.rb +59 -0
- data/lib/mongo/server/monitor.rb +160 -0
- data/lib/mongo/server/monitor/connection.rb +88 -0
- data/lib/mongo/server_selector.rb +81 -0
- data/lib/mongo/server_selector/nearest.rb +94 -0
- data/lib/mongo/server_selector/primary.rb +88 -0
- data/lib/mongo/server_selector/primary_preferred.rb +94 -0
- data/lib/mongo/server_selector/secondary.rb +91 -0
- data/lib/mongo/server_selector/secondary_preferred.rb +96 -0
- data/lib/mongo/server_selector/selectable.rb +209 -0
- data/lib/mongo/socket.rb +179 -0
- data/lib/mongo/socket/ssl.rb +108 -0
- data/lib/mongo/socket/tcp.rb +69 -0
- data/lib/mongo/socket/unix.rb +66 -0
- data/lib/mongo/uri.rb +504 -0
- data/lib/mongo/version.rb +21 -0
- data/lib/mongo/write_concern.rb +99 -0
- data/lib/mongo/write_concern/acknowledged.rb +38 -0
- data/lib/mongo/write_concern/normalizable.rb +73 -0
- data/lib/mongo/write_concern/unacknowledged.rb +43 -0
- data/mongo.gemspec +17 -14
- data/spec/mongo/address/ipv4_spec.rb +74 -0
- data/spec/mongo/address/ipv6_spec.rb +74 -0
- data/spec/mongo/address/unix_spec.rb +30 -0
- data/spec/mongo/address_spec.rb +206 -0
- data/spec/mongo/auth/cr_spec.rb +59 -0
- data/spec/mongo/auth/ldap_spec.rb +40 -0
- data/spec/mongo/auth/scram/conversation_spec.rb +197 -0
- data/spec/mongo/auth/scram_spec.rb +55 -0
- data/spec/mongo/auth/user/view_spec.rb +76 -0
- data/spec/mongo/auth/user_spec.rb +190 -0
- data/spec/mongo/auth/x509_spec.rb +40 -0
- data/spec/mongo/auth_spec.rb +65 -0
- data/spec/mongo/bulk/bulk_write_spec.rb +175 -0
- data/spec/mongo/client_spec.rb +564 -0
- data/spec/mongo/cluster/topology/replica_set_spec.rb +101 -0
- data/spec/mongo/cluster/topology/sharded_spec.rb +74 -0
- data/spec/mongo/cluster/topology/standalone_spec.rb +79 -0
- data/spec/mongo/cluster/topology_spec.rb +65 -0
- data/spec/mongo/cluster_spec.rb +129 -0
- data/spec/mongo/collection/view/aggregation_spec.rb +135 -0
- data/spec/mongo/collection/view/explainable_spec.rb +32 -0
- data/spec/mongo/collection/view/map_reduce_spec.rb +242 -0
- data/spec/mongo/collection/view/readable_spec.rb +603 -0
- data/spec/mongo/collection/view/writable_spec.rb +504 -0
- data/spec/mongo/collection/view_spec.rb +521 -0
- data/spec/mongo/collection_spec.rb +362 -0
- data/spec/mongo/cursor_spec.rb +295 -0
- data/spec/mongo/database_spec.rb +306 -0
- data/spec/mongo/error/parser_spec.rb +119 -0
- data/spec/mongo/event/publisher_spec.rb +50 -0
- data/spec/mongo/event/subscriber_spec.rb +34 -0
- data/spec/mongo/grid/file/chunk_spec.rb +226 -0
- data/spec/mongo/grid/file/metadata_spec.rb +69 -0
- data/spec/mongo/grid/file_spec.rb +138 -0
- data/spec/mongo/grid/fs_spec.rb +129 -0
- data/spec/mongo/index/view_spec.rb +226 -0
- data/spec/mongo/loggable_spec.rb +62 -0
- data/spec/mongo/logger_spec.rb +97 -0
- data/spec/mongo/operation/aggregate/result_spec.rb +80 -0
- data/spec/mongo/operation/aggregate_spec.rb +135 -0
- data/spec/mongo/operation/command_spec.rb +106 -0
- data/spec/mongo/operation/kill_cursors_spec.rb +66 -0
- data/spec/mongo/operation/limited_spec.rb +50 -0
- data/spec/mongo/operation/map_reduce_spec.rb +143 -0
- data/spec/mongo/operation/read/collections_info_spec.rb +40 -0
- data/spec/mongo/operation/read/get_more_spec.rb +81 -0
- data/spec/mongo/operation/read/indexes_spec.rb +31 -0
- data/spec/mongo/operation/read/query_spec.rb +84 -0
- data/spec/mongo/operation/result_spec.rb +275 -0
- data/spec/mongo/operation/specifiable_spec.rb +53 -0
- data/spec/mongo/operation/write/bulk_delete_spec.rb +473 -0
- data/spec/mongo/operation/write/bulk_insert_spec.rb +466 -0
- data/spec/mongo/operation/write/bulk_update_spec.rb +524 -0
- data/spec/mongo/operation/write/command/delete_spec.rb +116 -0
- data/spec/mongo/operation/write/command/insert_spec.rb +117 -0
- data/spec/mongo/operation/write/command/update_spec.rb +123 -0
- data/spec/mongo/operation/write/create_user_spec.rb +44 -0
- data/spec/mongo/operation/write/delete_spec.rb +178 -0
- data/spec/mongo/operation/write/drop_index_spec.rb +51 -0
- data/spec/mongo/operation/write/ensure_index_spec.rb +81 -0
- data/spec/mongo/operation/write/insert_spec.rb +231 -0
- data/spec/mongo/operation/write/remove_user_spec.rb +46 -0
- data/spec/mongo/operation/write/response_spec.rb +85 -0
- data/spec/mongo/operation/write/update_spec.rb +177 -0
- data/spec/mongo/protocol/delete_spec.rb +167 -0
- data/spec/mongo/protocol/get_more_spec.rb +146 -0
- data/spec/mongo/protocol/insert_spec.rb +161 -0
- data/spec/mongo/protocol/kill_cursors_spec.rb +101 -0
- data/spec/mongo/protocol/query_spec.rb +285 -0
- data/spec/mongo/protocol/reply_spec.rb +157 -0
- data/spec/mongo/protocol/update_spec.rb +186 -0
- data/spec/mongo/server/connection_pool/queue_spec.rb +170 -0
- data/spec/mongo/server/connection_pool_spec.rb +120 -0
- data/spec/mongo/server/connection_spec.rb +289 -0
- data/spec/mongo/server/description/features_spec.rb +138 -0
- data/spec/mongo/server/description/inspector/primary_elected_spec.rb +94 -0
- data/spec/mongo/server/description/inspector/server_added_spec.rb +92 -0
- data/spec/mongo/server/description/inspector/server_removed_spec.rb +95 -0
- data/spec/mongo/server/description_spec.rb +510 -0
- data/spec/mongo/server/monitor_spec.rb +130 -0
- data/spec/mongo/server_discovery_and_monitoring_spec.rb +103 -0
- data/spec/mongo/server_selection_rtt_spec.rb +104 -0
- data/spec/mongo/server_selection_spec.rb +89 -0
- data/spec/mongo/server_selector/nearest_spec.rb +250 -0
- data/spec/mongo/server_selector/primary_preferred_spec.rb +290 -0
- data/spec/mongo/server_selector/primary_spec.rb +114 -0
- data/spec/mongo/server_selector/secondary_preferred_spec.rb +252 -0
- data/spec/mongo/server_selector/secondary_spec.rb +196 -0
- data/spec/mongo/server_selector_spec.rb +101 -0
- data/spec/mongo/server_spec.rb +131 -0
- data/spec/mongo/uri_spec.rb +517 -0
- data/spec/mongo/write_concern/acknowledged_spec.rb +44 -0
- data/spec/mongo/write_concern/unacknowledged_spec.rb +15 -0
- data/spec/mongo_orchestration_spec.rb +70 -0
- data/spec/spec_helper.rb +148 -0
- data/spec/support/authorization.rb +245 -0
- data/spec/support/helpers.rb +140 -0
- data/spec/support/matchers.rb +37 -0
- data/spec/support/mongo_orchestration.rb +61 -0
- data/spec/support/mongo_orchestration/requestable.rb +109 -0
- data/spec/support/mongo_orchestration/standalone.rb +57 -0
- data/spec/support/sdam/rs/discover_arbiters.yml +41 -0
- data/spec/support/sdam/rs/discover_passives.yml +41 -0
- data/spec/support/sdam/rs/discover_primary.yml +40 -0
- data/spec/support/sdam/rs/discover_secondary.yml +41 -0
- data/spec/support/sdam/rs/discovery.yml +195 -0
- data/spec/support/sdam/rs/ghost_discovered.yml +39 -0
- data/spec/support/sdam/rs/hosts_differ_from_seeds.yml +34 -0
- data/spec/support/sdam/rs/member_reconfig.yml +68 -0
- data/spec/support/sdam/rs/member_standalone.yml +60 -0
- data/spec/support/sdam/rs/new_primary.yml +74 -0
- data/spec/support/sdam/rs/new_primary_wrong_set_name.yml +71 -0
- data/spec/support/sdam/rs/non_rs_member.yml +31 -0
- data/spec/support/sdam/rs/normalize_case.yml +49 -0
- data/spec/support/sdam/rs/primary_becomes_standalone.yml +52 -0
- data/spec/support/sdam/rs/primary_changes_set_name.yml +57 -0
- data/spec/support/sdam/rs/primary_disconnect.yml +56 -0
- data/spec/support/sdam/rs/primary_wrong_set_name.yml +27 -0
- data/spec/support/sdam/rs/response_from_removed.yml +63 -0
- data/spec/support/sdam/rs/rsother_discovered.yml +41 -0
- data/spec/support/sdam/rs/sec_not_auth.yml +49 -0
- data/spec/support/sdam/rs/secondary_wrong_set_name.yml +28 -0
- data/spec/support/sdam/rs/secondary_wrong_set_name_with_primary.yml +69 -0
- data/spec/support/sdam/rs/unexpected_mongos.yml +26 -0
- data/spec/support/sdam/rs/wrong_set_name.yml +35 -0
- data/spec/support/sdam/sharded/multiple_mongoses.yml +46 -0
- data/spec/support/sdam/sharded/non_mongos_removed.yml +41 -0
- data/spec/support/sdam/sharded/normalize_uri_case.yml +32 -0
- data/spec/support/sdam/single/direct_connection_external_ip.yml +34 -0
- data/spec/support/sdam/single/direct_connection_mongos.yml +33 -0
- data/spec/support/sdam/single/direct_connection_rsarbiter.yml +35 -0
- data/spec/support/sdam/single/direct_connection_rsprimary.yml +34 -0
- data/spec/support/sdam/single/direct_connection_rssecondary.yml +35 -0
- data/spec/support/sdam/single/direct_connection_slave.yml +32 -0
- data/spec/support/sdam/single/direct_connection_standalone.yml +32 -0
- data/spec/support/sdam/single/not_ok_response.yml +39 -0
- data/spec/support/sdam/single/standalone_removed.yml +32 -0
- data/spec/support/sdam/single/unavailable_seed.yml +28 -0
- data/spec/support/server_discovery_and_monitoring.rb +167 -0
- data/spec/support/server_selection.rb +140 -0
- data/spec/support/server_selection/rtt/first_value.yml +4 -0
- data/spec/support/server_selection/rtt/first_value_zero.yml +4 -0
- data/spec/support/server_selection/rtt/value_test_1.yml +4 -0
- data/spec/support/server_selection/rtt/value_test_2.yml +4 -0
- data/spec/support/server_selection/rtt/value_test_3.yml +4 -0
- data/spec/support/server_selection/rtt/value_test_4.yml +4 -0
- data/spec/support/server_selection/rtt/value_test_5.yml +4 -0
- data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Nearest.yml +32 -0
- data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Nearest_non_matching.yml +27 -0
- data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Primary.yml +23 -0
- data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/PrimaryPreferred.yml +32 -0
- data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/PrimaryPreferred_non_matching.yml +27 -0
- data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Secondary.yml +32 -0
- data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/SecondaryPreferred.yml +32 -0
- data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/SecondaryPreferred_non_matching.yml +27 -0
- data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Secondary_non_matching.yml +27 -0
- data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Nearest.yml +41 -0
- data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Nearest_non_matching.yml +34 -0
- data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Primary.yml +33 -0
- data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/PrimaryPreferred.yml +39 -0
- data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/PrimaryPreferred_non_matching.yml +36 -0
- data/spec/support/server_selection/selection/Sharded/read/SecondaryPreferred.yml +32 -0
- data/spec/support/server_selection/selection/Single/read/SecondaryPreferred.yml +23 -0
- data/spec/support/server_selection/selection/Unknown/read/SecondaryPreferred.yml +13 -0
- data/spec/support/server_selection_rtt.rb +41 -0
- data/spec/support/shared/bulk_write.rb +498 -0
- data/spec/support/shared/cursor.rb +38 -0
- data/spec/support/shared/operation.rb +77 -0
- data/spec/support/shared/protocol.rb +31 -0
- data/spec/support/shared/server_selector.rb +111 -0
- data/spec/support/shared/socket.rb +82 -0
- data/spec/support/travis.rb +14 -0
- metadata +523 -189
- metadata.gz.sig +0 -0
- data/VERSION +0 -1
- data/lib/mongo/bulk_write_collection_view.rb +0 -387
- data/lib/mongo/collection_writer.rb +0 -364
- data/lib/mongo/connection/node.rb +0 -249
- data/lib/mongo/connection/pool.rb +0 -340
- data/lib/mongo/connection/pool_manager.rb +0 -320
- data/lib/mongo/connection/sharding_pool_manager.rb +0 -67
- data/lib/mongo/connection/socket/ssl_socket.rb +0 -95
- data/lib/mongo/connection/socket/tcp_socket.rb +0 -87
- data/lib/mongo/connection/socket/unix_socket.rb +0 -39
- data/lib/mongo/db.rb +0 -808
- data/lib/mongo/exception.rb +0 -145
- data/lib/mongo/functional/authentication.rb +0 -455
- data/lib/mongo/functional/logging.rb +0 -85
- data/lib/mongo/functional/read_preference.rb +0 -183
- data/lib/mongo/functional/scram.rb +0 -556
- data/lib/mongo/functional/uri_parser.rb +0 -409
- data/lib/mongo/functional/write_concern.rb +0 -66
- data/lib/mongo/gridfs/grid.rb +0 -112
- data/lib/mongo/gridfs/grid_ext.rb +0 -53
- data/lib/mongo/gridfs/grid_file_system.rb +0 -163
- data/lib/mongo/gridfs/grid_io.rb +0 -484
- data/lib/mongo/legacy.rb +0 -140
- data/lib/mongo/mongo_client.rb +0 -697
- data/lib/mongo/mongo_replica_set_client.rb +0 -535
- data/lib/mongo/mongo_sharded_client.rb +0 -159
- data/lib/mongo/networking.rb +0 -372
- data/lib/mongo/utils/conversions.rb +0 -110
- data/lib/mongo/utils/core_ext.rb +0 -70
- data/lib/mongo/utils/server_version.rb +0 -69
- data/lib/mongo/utils/support.rb +0 -80
- data/test/functional/authentication_test.rb +0 -39
- data/test/functional/bulk_api_stress_test.rb +0 -133
- data/test/functional/bulk_write_collection_view_test.rb +0 -1198
- data/test/functional/client_test.rb +0 -627
- data/test/functional/collection_test.rb +0 -2175
- data/test/functional/collection_writer_test.rb +0 -83
- data/test/functional/conversions_test.rb +0 -163
- data/test/functional/cursor_fail_test.rb +0 -57
- data/test/functional/cursor_message_test.rb +0 -56
- data/test/functional/cursor_test.rb +0 -683
- data/test/functional/db_api_test.rb +0 -835
- data/test/functional/db_test.rb +0 -348
- data/test/functional/grid_file_system_test.rb +0 -285
- data/test/functional/grid_io_test.rb +0 -252
- data/test/functional/grid_test.rb +0 -273
- data/test/functional/pool_test.rb +0 -136
- data/test/functional/safe_test.rb +0 -98
- data/test/functional/support_test.rb +0 -62
- data/test/functional/timeout_test.rb +0 -60
- data/test/functional/uri_test.rb +0 -446
- data/test/functional/write_concern_test.rb +0 -118
- data/test/helpers/general.rb +0 -50
- data/test/helpers/test_unit.rb +0 -476
- data/test/replica_set/authentication_test.rb +0 -37
- data/test/replica_set/basic_test.rb +0 -189
- data/test/replica_set/client_test.rb +0 -393
- data/test/replica_set/connection_test.rb +0 -138
- data/test/replica_set/count_test.rb +0 -66
- data/test/replica_set/cursor_test.rb +0 -220
- data/test/replica_set/insert_test.rb +0 -157
- data/test/replica_set/max_values_test.rb +0 -151
- data/test/replica_set/pinning_test.rb +0 -105
- data/test/replica_set/query_test.rb +0 -73
- data/test/replica_set/read_preference_test.rb +0 -219
- data/test/replica_set/refresh_test.rb +0 -211
- data/test/replica_set/replication_ack_test.rb +0 -95
- data/test/sharded_cluster/basic_test.rb +0 -203
- data/test/shared/authentication/basic_auth_shared.rb +0 -260
- data/test/shared/authentication/bulk_api_auth_shared.rb +0 -249
- data/test/shared/authentication/gssapi_shared.rb +0 -176
- data/test/shared/authentication/sasl_plain_shared.rb +0 -96
- data/test/shared/authentication/scram_shared.rb +0 -92
- data/test/shared/ssl_shared.rb +0 -235
- data/test/test_helper.rb +0 -61
- data/test/threading/basic_test.rb +0 -120
- data/test/tools/mongo_config.rb +0 -708
- data/test/tools/mongo_config_test.rb +0 -160
- data/test/unit/client_test.rb +0 -381
- data/test/unit/collection_test.rb +0 -166
- data/test/unit/connection_test.rb +0 -335
- data/test/unit/cursor_test.rb +0 -307
- data/test/unit/db_test.rb +0 -136
- data/test/unit/grid_test.rb +0 -76
- data/test/unit/mongo_sharded_client_test.rb +0 -48
- data/test/unit/node_test.rb +0 -93
- data/test/unit/pool_manager_test.rb +0 -111
- data/test/unit/read_pref_test.rb +0 -406
- data/test/unit/read_test.rb +0 -159
- data/test/unit/safe_test.rb +0 -158
- data/test/unit/sharding_pool_manager_test.rb +0 -84
- data/test/unit/write_concern_test.rb +0 -175
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
# Copyright (C) 2014-2015 MongoDB, Inc.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
require 'mongo/collection/view/immutable'
|
|
16
|
+
require 'mongo/collection/view/iterable'
|
|
17
|
+
require 'mongo/collection/view/explainable'
|
|
18
|
+
require 'mongo/collection/view/aggregation'
|
|
19
|
+
require 'mongo/collection/view/map_reduce'
|
|
20
|
+
require 'mongo/collection/view/readable'
|
|
21
|
+
require 'mongo/collection/view/writable'
|
|
22
|
+
|
|
23
|
+
module Mongo
|
|
24
|
+
class Collection
|
|
25
|
+
|
|
26
|
+
# Representation of a query and options producing a result set of documents.
|
|
27
|
+
#
|
|
28
|
+
# A +View+ can be modified using helpers. Helpers can be chained,
|
|
29
|
+
# as each one returns a +View+ if arguments are provided.
|
|
30
|
+
#
|
|
31
|
+
# The query message is sent to the server when a "terminator" is called.
|
|
32
|
+
# For example, when #each is called on a +View+, a Cursor object is
|
|
33
|
+
# created, which then sends the query to the server.
|
|
34
|
+
#
|
|
35
|
+
# A +View+ is not created directly by a user. Rather, +View+
|
|
36
|
+
# creates a +View+ when a CRUD operation is called and returns it to
|
|
37
|
+
# the user to interact with.
|
|
38
|
+
#
|
|
39
|
+
# @note The +View+ API is semipublic.
|
|
40
|
+
# @api semipublic
|
|
41
|
+
class View
|
|
42
|
+
extend Forwardable
|
|
43
|
+
include Enumerable
|
|
44
|
+
include Immutable
|
|
45
|
+
include Iterable
|
|
46
|
+
include Readable
|
|
47
|
+
include Explainable
|
|
48
|
+
include Writable
|
|
49
|
+
|
|
50
|
+
# @return [ View ] The +View+ to query.
|
|
51
|
+
attr_reader :collection
|
|
52
|
+
# @return [ Hash ] The query selector.
|
|
53
|
+
attr_reader :selector
|
|
54
|
+
|
|
55
|
+
# Delegate necessary operations to the collection.
|
|
56
|
+
def_delegators :collection, :client, :cluster, :database, :read_preference, :write_concern
|
|
57
|
+
|
|
58
|
+
# Delegate to the cluster for the next primary.
|
|
59
|
+
def_delegators :cluster, :next_primary
|
|
60
|
+
|
|
61
|
+
# Compare two +View+ objects.
|
|
62
|
+
#
|
|
63
|
+
# @example Compare the view with another object.
|
|
64
|
+
# view == other
|
|
65
|
+
#
|
|
66
|
+
# @return [ true, false ] Equal if collection, selector, and options of two
|
|
67
|
+
# +View+ match.
|
|
68
|
+
#
|
|
69
|
+
# @since 2.0.0
|
|
70
|
+
def ==(other)
|
|
71
|
+
return false unless other.is_a?(View)
|
|
72
|
+
collection == other.collection &&
|
|
73
|
+
selector == other.selector &&
|
|
74
|
+
options == other.options
|
|
75
|
+
end
|
|
76
|
+
alias_method :eql?, :==
|
|
77
|
+
|
|
78
|
+
# A hash value for the +View+ composed of the collection namespace,
|
|
79
|
+
# hash of the options and hash of the selector.
|
|
80
|
+
#
|
|
81
|
+
# @example Get the hash value.
|
|
82
|
+
# view.hash
|
|
83
|
+
#
|
|
84
|
+
# @return [ Integer ] A hash value of the +View+ object.
|
|
85
|
+
#
|
|
86
|
+
# @since 2.0.0
|
|
87
|
+
def hash
|
|
88
|
+
[ collection.namespace, options.hash, selector.hash ].hash
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
# Creates a new +View+.
|
|
92
|
+
#
|
|
93
|
+
# @example Find all users named Emily.
|
|
94
|
+
# View.new(collection, {:name => 'Emily'})
|
|
95
|
+
#
|
|
96
|
+
# @example Find all users named Emily skipping 5 and returning 10.
|
|
97
|
+
# View.new(collection, {:name => 'Emily'}, :skip => 5, :limit => 10)
|
|
98
|
+
#
|
|
99
|
+
# @example Find all users named Emily using a specific read preference.
|
|
100
|
+
# View.new(collection, {:name => 'Emily'}, :read => :secondary_preferred)
|
|
101
|
+
#
|
|
102
|
+
# @param [ Collection ] collection The +Collection+ to query.
|
|
103
|
+
# @param [ Hash ] selector The query selector.
|
|
104
|
+
# @param [ Hash ] options The additional query options.
|
|
105
|
+
#
|
|
106
|
+
# @option options :comment [ String ] Associate a comment with the query.
|
|
107
|
+
# @option options :batch_size [ Integer ] The number of docs to return in
|
|
108
|
+
# each response from MongoDB.
|
|
109
|
+
# @option options :fields [ Hash ] The fields to include or exclude in
|
|
110
|
+
# returned docs.
|
|
111
|
+
# @option options :hint [ Hash ] Override default index selection and force
|
|
112
|
+
# MongoDB to use a specific index for the query.
|
|
113
|
+
# @option options :limit [ Integer ] Max number of docs to return.
|
|
114
|
+
# @option options :max_scan [ Integer ] Constrain the query to only scan the
|
|
115
|
+
# specified number of docs. Use to prevent queries from running too long.
|
|
116
|
+
# @option options :read [ Symbol ] The read preference to use for the query.
|
|
117
|
+
# If none is provided, the collection's default read preference is used.
|
|
118
|
+
# @option options :show_disk_loc [ true, false ] Return disk location info as
|
|
119
|
+
# a field in each doc.
|
|
120
|
+
# @option options :skip [ Integer ] The number of documents to skip.
|
|
121
|
+
# @option options :snapshot [ true, false ] Prevents returning a doc more than
|
|
122
|
+
# once.
|
|
123
|
+
# @option options :sort [ Hash ] The key and direction pairs used to sort the
|
|
124
|
+
# results.
|
|
125
|
+
#
|
|
126
|
+
# @since 2.0.0
|
|
127
|
+
def initialize(collection, selector = {}, options = {})
|
|
128
|
+
@collection = collection
|
|
129
|
+
@selector = selector.dup
|
|
130
|
+
@options = options.dup
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
# Get a human-readable string representation of +View+.
|
|
134
|
+
#
|
|
135
|
+
# @example Get the inspection.
|
|
136
|
+
# view.inspect
|
|
137
|
+
#
|
|
138
|
+
# @return [ String ] A string representation of a +View+ instance.
|
|
139
|
+
#
|
|
140
|
+
# @since 2.0.0
|
|
141
|
+
def inspect
|
|
142
|
+
"<Mongo::Collection::View:0x#{object_id} namespace='#{collection.namespace}" +
|
|
143
|
+
" @selector=#{selector.inspect} @options=#{options.inspect}>"
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
private
|
|
147
|
+
|
|
148
|
+
def initialize_copy(other)
|
|
149
|
+
@collection = other.collection
|
|
150
|
+
@options = other.options.dup
|
|
151
|
+
@selector = other.selector.dup
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
def initial_query_op
|
|
155
|
+
Operation::Read::Query.new(query_spec)
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
def new(options)
|
|
159
|
+
View.new(collection, selector, options)
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
def send_initial_query(server)
|
|
163
|
+
initial_query_op.execute(server.context)
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
def view; self; end
|
|
167
|
+
end
|
|
168
|
+
end
|
|
169
|
+
end
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
# Copyright (C) 2014-2015 MongoDB, Inc.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
module Mongo
|
|
16
|
+
class Collection
|
|
17
|
+
class View
|
|
18
|
+
|
|
19
|
+
# Provides behaviour around an aggregation pipeline on a collection view.
|
|
20
|
+
#
|
|
21
|
+
# @since 2.0.0
|
|
22
|
+
class Aggregation
|
|
23
|
+
extend Forwardable
|
|
24
|
+
include Enumerable
|
|
25
|
+
include Immutable
|
|
26
|
+
include Iterable
|
|
27
|
+
include Explainable
|
|
28
|
+
|
|
29
|
+
# @return [ View ] view The collection view.
|
|
30
|
+
attr_reader :view
|
|
31
|
+
# @return [ Array<Hash> ] pipeline The aggregation pipeline.
|
|
32
|
+
attr_reader :pipeline
|
|
33
|
+
|
|
34
|
+
# Delegate necessary operations to the view.
|
|
35
|
+
def_delegators :view, :collection, :read, :cluster
|
|
36
|
+
|
|
37
|
+
# Delegate necessary operations to the collection.
|
|
38
|
+
def_delegators :collection, :database
|
|
39
|
+
|
|
40
|
+
# Set to true if disk usage is allowed during the aggregation.
|
|
41
|
+
#
|
|
42
|
+
# @example Set disk usage flag.
|
|
43
|
+
# aggregation.allow_disk_use(true)
|
|
44
|
+
#
|
|
45
|
+
# @param [ true, false ] value The flag value.
|
|
46
|
+
#
|
|
47
|
+
# @return [ true, false, Aggregation ] The aggregation if a value was
|
|
48
|
+
# set or the value if used as a getter.
|
|
49
|
+
#
|
|
50
|
+
# @since 2.0.0
|
|
51
|
+
def allow_disk_use(value = nil)
|
|
52
|
+
configure(:allowDiskUse, value)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# Initialize the aggregation for the provided collection view, pipeline
|
|
56
|
+
# and options.
|
|
57
|
+
#
|
|
58
|
+
# @example Create the new aggregation view.
|
|
59
|
+
# Aggregation.view.new(view, pipeline)
|
|
60
|
+
#
|
|
61
|
+
# @param [ Collection::View ] view The collection view.
|
|
62
|
+
# @param [ Array<Hash> ] pipeline The pipeline of operations.
|
|
63
|
+
# @param [ Hash ] options The aggregation options.
|
|
64
|
+
#
|
|
65
|
+
# @since 2.0.0
|
|
66
|
+
def initialize(view, pipeline, options = {})
|
|
67
|
+
@view = view
|
|
68
|
+
@pipeline = pipeline.dup
|
|
69
|
+
@options = options.dup
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
private
|
|
73
|
+
|
|
74
|
+
def aggregate_spec
|
|
75
|
+
{ :selector => {
|
|
76
|
+
:aggregate => collection.name,
|
|
77
|
+
:pipeline => pipeline,
|
|
78
|
+
:cursor => view.batch_size ? { :batchSize => view.batch_size } : {}
|
|
79
|
+
}.merge!(options),
|
|
80
|
+
:db_name => database.name,
|
|
81
|
+
:options => view.options }
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def explain_options
|
|
85
|
+
{ :explain => true }
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def new(options)
|
|
89
|
+
Aggregation.new(view, pipeline, options)
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def initial_query_op
|
|
93
|
+
Operation::Aggregate.new(aggregate_spec)
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def send_initial_query(server)
|
|
97
|
+
begin
|
|
98
|
+
initial_query_op.execute(server.context)
|
|
99
|
+
rescue Mongo::Operation::Aggregate::NeedPrimaryServer
|
|
100
|
+
warn 'Rerouting the Aggregation operation to the primary server.'
|
|
101
|
+
server = ServerSelector.get(mode: :primary).select_server(cluster)
|
|
102
|
+
initial_query_op.execute(server.context)
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
end
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# Copyright (C) 2014-2015 MongoDB, Inc.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
module Mongo
|
|
16
|
+
class Collection
|
|
17
|
+
class View
|
|
18
|
+
|
|
19
|
+
# Defines explain related behaviour for collection view.
|
|
20
|
+
#
|
|
21
|
+
# @since 2.0.0
|
|
22
|
+
module Explainable
|
|
23
|
+
|
|
24
|
+
# Get the explain plan for the query.
|
|
25
|
+
#
|
|
26
|
+
# @example Get the explain plan for the query.
|
|
27
|
+
# view.explain
|
|
28
|
+
#
|
|
29
|
+
# @return [ Hash ] A single document with the explain plan.
|
|
30
|
+
#
|
|
31
|
+
# @since 2.0.0
|
|
32
|
+
def explain
|
|
33
|
+
self.class.new(collection, selector, options.merge(explain_options)).first
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
private
|
|
37
|
+
|
|
38
|
+
def explained?
|
|
39
|
+
!!options[:explain]
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def explain_options
|
|
43
|
+
explain_limit = limit || 0
|
|
44
|
+
{ :limit => -explain_limit.abs, :explain => true }
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# Copyright (C) 2014-2015 MongoDB, Inc.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
module Mongo
|
|
16
|
+
class Collection
|
|
17
|
+
class View
|
|
18
|
+
module Immutable
|
|
19
|
+
|
|
20
|
+
# @return [ Hash ] options The additional query options.
|
|
21
|
+
attr_reader :options
|
|
22
|
+
|
|
23
|
+
private
|
|
24
|
+
|
|
25
|
+
# @api private
|
|
26
|
+
#
|
|
27
|
+
# @note In the including class, the method #immutable needs to be
|
|
28
|
+
# implemented in order to define how a new class of that type needs to
|
|
29
|
+
# be instantiated.
|
|
30
|
+
def configure(field, value)
|
|
31
|
+
return options[field] if value.nil?
|
|
32
|
+
new(options.merge(field => value))
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def configure_flag(flag)
|
|
36
|
+
new(options.dup).tap do |view|
|
|
37
|
+
view.send(:flags).push(flag)
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# Copyright (C) 2014-2015 MongoDB, Inc.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
module Mongo
|
|
16
|
+
class Collection
|
|
17
|
+
class View
|
|
18
|
+
|
|
19
|
+
# Defines iteration related behaviour for collection views, including
|
|
20
|
+
# cursor instantiation.
|
|
21
|
+
#
|
|
22
|
+
# @since 2.0.0
|
|
23
|
+
module Iterable
|
|
24
|
+
|
|
25
|
+
# Iterate through documents returned by a query with this +View+.
|
|
26
|
+
#
|
|
27
|
+
# @example Iterate through the result of the view.
|
|
28
|
+
# view.each do |document|
|
|
29
|
+
# p document
|
|
30
|
+
# end
|
|
31
|
+
#
|
|
32
|
+
# @return [ Enumerator ] The enumerator.
|
|
33
|
+
#
|
|
34
|
+
# @since 2.0.0
|
|
35
|
+
#
|
|
36
|
+
# @yieldparam [ Hash ] Each matching document.
|
|
37
|
+
def each
|
|
38
|
+
server = read.select_server(cluster)
|
|
39
|
+
cursor = Cursor.new(view, send_initial_query(server), server).to_enum
|
|
40
|
+
cursor.each do |doc|
|
|
41
|
+
yield doc
|
|
42
|
+
end if block_given?
|
|
43
|
+
cursor
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
# Copyright (C) 2014-2015 MongoDB, Inc.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
module Mongo
|
|
16
|
+
class Collection
|
|
17
|
+
class View
|
|
18
|
+
|
|
19
|
+
# Provides behaviour around a map/reduce operation on the collection
|
|
20
|
+
# view.
|
|
21
|
+
#
|
|
22
|
+
# @since 2.0.0
|
|
23
|
+
class MapReduce
|
|
24
|
+
extend Forwardable
|
|
25
|
+
include Enumerable
|
|
26
|
+
include Immutable
|
|
27
|
+
include Iterable
|
|
28
|
+
|
|
29
|
+
# @return [ View ] view The collection view.
|
|
30
|
+
attr_reader :view
|
|
31
|
+
|
|
32
|
+
# @return [ String ] map The map function.
|
|
33
|
+
attr_reader :map
|
|
34
|
+
|
|
35
|
+
# @return [ String ] reduce The reduce function.
|
|
36
|
+
attr_reader :reduce
|
|
37
|
+
|
|
38
|
+
# Delegate necessary operations to the view.
|
|
39
|
+
def_delegators :view, :collection, :read, :cluster
|
|
40
|
+
|
|
41
|
+
# Delegate necessary operations to the collection.
|
|
42
|
+
def_delegators :collection, :database
|
|
43
|
+
|
|
44
|
+
# Set or get the finalize function for the operation.
|
|
45
|
+
#
|
|
46
|
+
# @example Set the finalize function.
|
|
47
|
+
# map_reduce.finalize(function)
|
|
48
|
+
#
|
|
49
|
+
# @param [ String ] function The finalize js function.
|
|
50
|
+
#
|
|
51
|
+
# @return [ MapReduce, String ] The new MapReduce operation or the
|
|
52
|
+
# value of the function.
|
|
53
|
+
#
|
|
54
|
+
# @since 2.0.0
|
|
55
|
+
def finalize(function = nil)
|
|
56
|
+
configure(:finalize, function)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
# Initialize the map/reduce for the provided collection view, functions
|
|
60
|
+
# and options.
|
|
61
|
+
#
|
|
62
|
+
# @example Create the new map/reduce view.
|
|
63
|
+
#
|
|
64
|
+
# @param [ Collection::View ] view The collection view.
|
|
65
|
+
# @param [ String ] map The map function.
|
|
66
|
+
# @param [ String ] reduce The reduce function.
|
|
67
|
+
# @param [ Hash ] options The map/reduce options.
|
|
68
|
+
#
|
|
69
|
+
# @since 2.0.0
|
|
70
|
+
def initialize(view, map, reduce, options = {})
|
|
71
|
+
@view = view
|
|
72
|
+
@map = map.freeze
|
|
73
|
+
@reduce = reduce.freeze
|
|
74
|
+
@options = options.dup
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
# Set or get the jsMode flag for the operation.
|
|
78
|
+
#
|
|
79
|
+
# @example Set js mode for the operation.
|
|
80
|
+
# map_reduce.js_mode(true)
|
|
81
|
+
#
|
|
82
|
+
# @param [ true, false ] value The jsMode value.
|
|
83
|
+
#
|
|
84
|
+
# @return [ MapReduce, true, false ] The new MapReduce operation or the
|
|
85
|
+
# value of the jsMode flag.
|
|
86
|
+
#
|
|
87
|
+
# @since 2.0.0
|
|
88
|
+
def js_mode(value = nil)
|
|
89
|
+
configure(:jsMode, value)
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
# Set or get the output location for the operation.
|
|
93
|
+
#
|
|
94
|
+
# @example Set the output to inline.
|
|
95
|
+
# map_reduce.out(inline: 1)
|
|
96
|
+
#
|
|
97
|
+
# @example Set the output collection to merge.
|
|
98
|
+
# map_reduce.out(merge: 'users')
|
|
99
|
+
#
|
|
100
|
+
# @example Set the output collection to replace.
|
|
101
|
+
# map_reduce.out(replace: 'users')
|
|
102
|
+
#
|
|
103
|
+
# @example Set the output collection to reduce.
|
|
104
|
+
# map_reduce.out(reduce: 'users')
|
|
105
|
+
#
|
|
106
|
+
# @param [ Hash ] location The output location details.
|
|
107
|
+
#
|
|
108
|
+
# @return [ MapReduce, Hash ] The new MapReduce operation or the value
|
|
109
|
+
# of the output location.
|
|
110
|
+
#
|
|
111
|
+
# @since 2.0.0
|
|
112
|
+
def out(location = nil)
|
|
113
|
+
configure(:out, location)
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
# Set or get a scope on the operation.
|
|
117
|
+
#
|
|
118
|
+
# @example Set the scope value.
|
|
119
|
+
# map_reduce.scope(value: 'test')
|
|
120
|
+
#
|
|
121
|
+
# @param [ Hash ] object The scope object.
|
|
122
|
+
#
|
|
123
|
+
# @return [ MapReduce, Hash ] The new MapReduce operation or thevalue
|
|
124
|
+
# of the scope.
|
|
125
|
+
#
|
|
126
|
+
# @since 2.0.0
|
|
127
|
+
def scope(object = nil)
|
|
128
|
+
configure(:scope, object)
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
private
|
|
132
|
+
|
|
133
|
+
def inline?
|
|
134
|
+
out.nil? || out == { inline: 1 }
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
def map_reduce_spec
|
|
138
|
+
{
|
|
139
|
+
:db_name => database.name,
|
|
140
|
+
:selector => {
|
|
141
|
+
:mapreduce => collection.name,
|
|
142
|
+
:map => map,
|
|
143
|
+
:reduce => reduce,
|
|
144
|
+
:query => view.selector[:$query] || view.selector,
|
|
145
|
+
:out => { inline: 1 }
|
|
146
|
+
}.merge(options).merge(view.options)
|
|
147
|
+
}
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
def new(options)
|
|
151
|
+
MapReduce.new(view, map, reduce, options)
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
def initial_query_op
|
|
155
|
+
Operation::MapReduce.new(map_reduce_spec)
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
def send_initial_query(server)
|
|
159
|
+
result =
|
|
160
|
+
begin
|
|
161
|
+
initial_query_op.execute(server.context)
|
|
162
|
+
rescue Mongo::Error::NeedPrimaryServer
|
|
163
|
+
warn 'Rerouting the MapReduce operation to the primary server.'
|
|
164
|
+
server = ServerSelector.get(mode: :primary).select_server(cluster)
|
|
165
|
+
initial_query_op.execute(server.context)
|
|
166
|
+
end
|
|
167
|
+
if inline?
|
|
168
|
+
result
|
|
169
|
+
else
|
|
170
|
+
send_fetch_query(server)
|
|
171
|
+
end
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
def fetch_query_spec
|
|
175
|
+
{ :selector => {},
|
|
176
|
+
:options => {},
|
|
177
|
+
:db_name => database.name,
|
|
178
|
+
:coll_name => out.values.first }
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
def fetch_query_op
|
|
182
|
+
Operation::Read::Query.new(fetch_query_spec)
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
def send_fetch_query(server)
|
|
186
|
+
fetch_query_op.execute(server.context)
|
|
187
|
+
end
|
|
188
|
+
end
|
|
189
|
+
end
|
|
190
|
+
end
|
|
191
|
+
end
|