Add read preference support for monger.query DSL

This commit is contained in:
Michael S. Klishin 2011-12-30 17:19:44 +04:00
parent ef3c224441
commit 1cb024dcad
2 changed files with 13 additions and 7 deletions

View file

@ -2,7 +2,7 @@
(:refer-clojure :exclude [select find sort])
(:require [monger.core]
[monger.internal pagination])
(:import [com.mongodb DB DBCollection DBObject DBCursor]
(:import [com.mongodb DB DBCollection DBObject DBCursor ReadPreference]
[java.util List])
(:use [monger conversion operators]))
@ -52,16 +52,17 @@
(to-db-object (zipmap fields (repeat 1))))
(defn exec
[{ :keys [collection query fields skip limit sort batch-size hint snapshot] :or { limit 0 batch-size 256 skip 0 } }]
[{ :keys [collection query fields skip limit sort batch-size hint snapshot read-preference] :or { limit 0 batch-size 256 skip 0 } }]
(let [cursor (doto ^DBCursor (.find ^DBCollection collection (to-db-object query) (fields-to-db-object fields))
(.limit limit)
(.skip skip)
(.sort (to-db-object sort))
(.batchSize batch-size)
(.hint ^DBObject (to-db-object hint))
)]
(if snapshot
(.hint ^DBObject (to-db-object hint)))]
(when snapshot
(.snapshot cursor))
(when read-preference
(.setReadPreference cursor read-preference))
(map (fn [x] (from-db-object x true))
(seq cursor))))
@ -101,6 +102,10 @@
[m]
(merge m { :snapshot true }))
(defn read-preference
[m ^ReadPreference rp]
(merge m { :read-preference rp }))
(defn paginate
[m & { :keys [page per-page] :or { page 1 per-page 10 } }]
(merge m { :limit per-page :skip (monger.internal.pagination/offset-for page per-page) }))

View file

@ -2,7 +2,7 @@
(ns monger.test.querying
(:refer-clojure :exclude [select find sort])
(:import [com.mongodb WriteResult WriteConcern DBCursor DBObject CommandResult$CommandFailure]
(:import [com.mongodb WriteResult WriteConcern DBCursor DBObject CommandResult$CommandFailure ReadPreference]
[org.bson.types ObjectId]
[java.util Date])
(:require [monger core util]
@ -189,7 +189,8 @@
result1 (with-collection coll
(find {})
(paginate :page 1 :per-page 3)
(sort { :title 1 }))
(sort { :title 1 })
(read-preference ReadPreference/PRIMARY))
result2 (with-collection coll
(find {})
(paginate :page 2 :per-page 3)