Class MongoDBConnection

java.lang.Object
org.nuxeo.ecm.core.storage.dbs.DBSConnectionBase
org.nuxeo.ecm.core.storage.mongodb.MongoDBConnection
All Implemented Interfaces:
AutoCloseable, LockManager, DBSConnection

public class MongoDBConnection extends DBSConnectionBase
MongoDB implementation of a DBSConnection.
Since:
11.1 (introduce in 5.9.4 as MongoDBRepository)
  • Field Details

    • RANDOM

      protected static final Random RANDOM
    • mongoDBRepository

      protected final MongoDBRepository mongoDBRepository
    • coll

      protected final com.mongodb.client.MongoCollection<org.bson.Document> coll
    • idKey

      protected final String idKey
      The key to use to store the id in the database.
    • useCustomId

      protected final boolean useCustomId
      True if we don't use MongoDB's native "_id" key to store the id.
    • sequenceLeft

      protected long sequenceLeft
      Number of values still available in the in-memory sequence.
    • sequenceLastValue

      protected long sequenceLastValue
      Last value or randomized value used from the in-memory sequence.

      When used as a randomized sequence, this value (and the rest of the next block) may only be used after a successful update of the in-database version for the next task needing a randomized value.

    • converter

      protected final MongoDBConverter converter
    • clientSession

      protected com.mongodb.client.ClientSession clientSession
    • transactionStarted

      protected boolean transactionStarted
    • TRY_COUNT

      protected static final int TRY_COUNT
      See Also:
    • RETRY_TIMESLOT

      protected static final Duration RETRY_TIMESLOT
    • RETRY_THRESHOLD

      protected static final Duration RETRY_THRESHOLD
    • LOCK_FIELDS

      protected static final org.bson.conversions.Bson LOCK_FIELDS
    • UNSET_LOCK_UPDATE

      protected static final org.bson.conversions.Bson UNSET_LOCK_UPDATE
  • Constructor Details

  • Method Details

    • close

      public void close()
      Description copied from interface: DBSConnection
      Closes this connection.
    • begin

      public void begin()
      Description copied from interface: DBSConnection
      Starts a new transaction.
      See Also:
    • commit

      public void commit()
      Description copied from interface: DBSConnection
      Commits the current transaction.
      See Also:
    • rollback

      public void rollback()
      Description copied from interface: DBSConnection
      Rolls back the current transaction.
      See Also:
    • initRepository

      protected void initRepository(MongoDBRepositoryDescriptor descriptor)
      Initializes the MongoDB repository
      Parameters:
      descriptor - the MongoDB repository descriptor
      Since:
      11.1
    • initRepositoryIndexes

      protected void initRepositoryIndexes(MongoDBRepositoryDescriptor descriptor)
    • getNextSequenceId

      protected long getNextSequenceId()
    • updateSequence

      protected long updateSequence()
      Allocates a new sequence block. The database contains the last value from the last block.
    • tryUpdateRandomizedSequence

      protected Long tryUpdateRandomizedSequence()
      Updates the randomized sequence, using xorshift.
    • updateRandomizedSequence

      protected long updateRandomizedSequence()
    • randomInitialSeed

      protected long randomInitialSeed()
      Initial seed generation.
    • xorshift

      protected long xorshift(long n, long times)
      Iterated version of xorshift.
    • xorshift

      protected long xorshift(long n)
      xorshift algorithm from George Marsaglia, with period 2^64 - 1.
      See Also:
    • generateNewId

      public String generateNewId()
      Description copied from interface: DBSConnection
      Generates a new id for a document.
      Returns:
      the new id
    • createState

      public void createState(State state)
      Description copied from interface: DBSConnection
      Creates a document.
      Parameters:
      state - the document state
    • createStates

      public void createStates(List<State> states)
      Description copied from interface: DBSConnection
      Creates documents.
      Parameters:
      states - the document states
    • readState

      public State readState(String id)
      Description copied from interface: DBSConnection
      Reads the state of a document.
      Parameters:
      id - the document id
      Returns:
      the document state, or null if not found
    • readPartialState

      public State readPartialState(String id, Collection<String> keys)
      Description copied from interface: DBSConnection
      Reads the partial state of a document.
      Parameters:
      id - the document id
      keys - the keys to read
      Returns:
      the document partial state, or null if not found
    • readStates

      public List<State> readStates(List<String> ids)
      Description copied from interface: DBSConnection
      Reads the states of several documents.

      The returned states may be in a different order than the ids.

      Parameters:
      ids - the document ids
      Returns:
      the document states, an element by be null if not found
    • updateState

      public void updateState(String id, State.StateDiff diff, DBSTransactionState.ConditionalUpdates conditionalUpdates)
      Description copied from interface: DBSConnection
      Updates a document.
      Parameters:
      id - the document id
      diff - the diff to apply
      conditionalUpdates - the conditional updates, or null
    • deleteStates

      public void deleteStates(Set<String> ids)
      Description copied from interface: DBSConnection
      Deletes a set of document.
      Parameters:
      ids - the document ids
    • readChildState

      public State readChildState(String parentId, String name, Set<String> ignored)
      Description copied from interface: DBSConnection
      Reads the state of a child document.
      Parameters:
      parentId - the parent document id
      name - the name of the child
      ignored - a set of document ids that should not be considered
      Returns:
      the state of the child document, or null if not found
    • newQueryException

      protected NuxeoException newQueryException(String message, com.mongodb.MongoException cause, org.bson.conversions.Bson filter)
    • newQueryTimeout

      protected NuxeoException newQueryTimeout(com.mongodb.MongoException cause, org.bson.conversions.Bson filter)
    • newQueryTimeoutClient

      protected NuxeoException newQueryTimeoutClient(com.mongodb.MongoException cause, org.bson.conversions.Bson filter)
    • newQueryFailure

      protected NuxeoException newQueryFailure(com.mongodb.MongoException cause, org.bson.conversions.Bson filter)
    • logQuery

      protected void logQuery(String id, org.bson.conversions.Bson fields)
    • logQuery

      protected void logQuery(org.bson.conversions.Bson filter, org.bson.conversions.Bson fields)
    • logQuery

      protected void logQuery(org.bson.conversions.Bson query, org.bson.conversions.Bson fields, org.bson.conversions.Bson orderBy, int limit, int offset)
    • hasChild

      public boolean hasChild(String parentId, String name, Set<String> ignored)
      Description copied from interface: DBSConnection
      Checks if a document has a child with the given name
      Parameters:
      parentId - the parent document id
      name - the name of the child
      ignored - a set of document ids that should not be considered
      Returns:
      true if the child exists, false if not
    • getChildQuery

      protected org.bson.Document getChildQuery(String parentId, String name, Set<String> ignored)
    • addIgnoredIds

      protected void addIgnoredIds(org.bson.Document filter, Set<String> ignored)
    • queryKeyValue

      public List<State> queryKeyValue(String key, Object value, Set<String> ignored)
      Description copied from interface: DBSConnection
      Queries the repository for documents having key = value.
      Parameters:
      key - the key
      value - the value
      ignored - a set of document ids that should not be considered
      Returns:
      the document states matching the query
    • queryKeyValue

      public List<State> queryKeyValue(String key1, Object value1, String key2, Object value2, Set<String> ignored)
      Description copied from interface: DBSConnection
      Queries the repository for documents having key1 = value1 and key2 = value2.
      Parameters:
      key1 - the first key
      value1 - the first value
      key2 - the second key
      value2 - the second value
      ignored - a set of document ids that should not be considered
      Returns:
      the document states matching the query
    • queryKeyValueWithOperator

      public List<State> queryKeyValueWithOperator(String key1, Object value1, String key2, DBSConnection.DBSQueryOperator operator, Object value2, Set<String> ignored)
      Description copied from interface: DBSConnection
      Queries the repository for documents having key1 = value1 and key2 ${operator} value2.
      Parameters:
      key1 - the first key
      value1 - the first value
      key2 - the second key
      operator - the operator to apply between key2 and value2
      value2 - the second value
      ignored - a set of document ids that should not be considered
      Returns:
      the document states matching the query
    • getDescendants

      public Stream<State> getDescendants(String rootId, Set<String> keys)
      Description copied from interface: DBSConnection
      Returns a stream of descendants from a given root document, in no particular order. This does not include information about the root document itself.

      THE STREAM MUST BE CLOSED WHEN DONE to release resources.

      Parameters:
      rootId - the root document id
      keys - what to collect about the descendants in addition to their ids
      Returns:
      a stream of States; THE STREAM MUST BE CLOSED WHEN DONE
    • getDescendants

      public Stream<State> getDescendants(String rootId, Set<String> keys, int limit)
      Description copied from interface: DBSConnection
      Returns a stream of descendants from a given root document, in no particular order. This does not include information about the root document itself.

      THE STREAM MUST BE CLOSED WHEN DONE to release resources.

      Parameters:
      rootId - the root document id
      keys - what to collect about the descendants in addition to their ids
      limit - the maximum number of descendants to return
      Returns:
      a stream of States; THE STREAM MUST BE CLOSED WHEN DONE
    • queryKeyValuePresence

      public boolean queryKeyValuePresence(String key, String value, Set<String> ignored)
      Description copied from interface: DBSConnection
      Queries the repository to check if there are documents having key = value.
      Parameters:
      key - the key
      value - the value
      ignored - a set of document ids that should not be considered
      Returns:
      true if the query matches at least one document, false if the query matches nothing
    • exists

      protected boolean exists(org.bson.conversions.Bson filter)
    • exists

      protected boolean exists(org.bson.conversions.Bson filter, org.bson.conversions.Bson projection)
    • findOne

      protected State findOne(org.bson.conversions.Bson filter)
    • findOne

      protected State findOne(org.bson.conversions.Bson filter, org.bson.conversions.Bson projection)
    • findAll

      protected List<State> findAll(org.bson.conversions.Bson filter)
    • stream

      protected Stream<State> stream(org.bson.conversions.Bson filter)
    • stream

      protected Stream<State> stream(org.bson.conversions.Bson filter, org.bson.conversions.Bson projection)
    • stream

      protected Stream<State> stream(org.bson.conversions.Bson filter, org.bson.conversions.Bson projection, int limit)
      Logs, runs request and constructs a closeable Stream on top of MongoCursor.

      We should rely on this method, because it correctly handles cursor closed state.

      Note: Looping on FindIterable or MongoIterable could lead to cursor leaks. This is also the case on some call to MongoIterable.first().

      Returns:
      a closeable Stream instance linked to MongoCursor
    • justPresenceField

      protected org.bson.Document justPresenceField()
    • queryAndFetch

      public PartialList<Map<String,Serializable>> queryAndFetch(DBSExpressionEvaluator evaluator, OrderByClause orderByClause, boolean distinctDocuments, int limit, int offset, int countUpTo)
      Description copied from interface: DBSConnection
      Queries the repository for documents matching a NXQL query, and returns a projection of the documents.
      Parameters:
      evaluator - the map-based evaluator for the query
      orderByClause - an ORDER BY clause
      distinctDocuments - true if the projection should return a maximum of one row per document
      limit - the limit on the number of documents to return
      offset - the offset in the list of documents to return
      countUpTo - if -1, count the total size without offset/limit.
      If 0, don't count the total size, set it to -1 .
      If n, count the total number if there are less than n documents otherwise set the total size to -2.
      Returns:
      a partial list of maps containing the NXQL projections requested, and the total size according to countUpTo
    • scroll

      public ScrollResult<String> scroll(DBSExpressionEvaluator evaluator, int batchSize, int keepAliveSeconds)
      Description copied from interface: DBSConnection
      Executes the given query and returns the first batch of results containing id of documents, next batch must be requested within the keepAliveSeconds delay.
    • scroll

      public ScrollResult<String> scroll(String scrollId)
      Description copied from interface: DBSConnection
      Get the next batch of results containing id of documents, the scrollId is part of the previous ScrollResult response.
    • addPrincipals

      protected void addPrincipals(org.bson.Document query, Set<String> principals)
    • getLock

      public Lock getLock(String id)
      Description copied from interface: LockManager
      Gets the lock on a document.

      If the document does not exist, null is returned.

      Parameters:
      id - the document id
      Returns:
      the existing lock, or null when there is no lock
    • setLock

      public Lock setLock(String id, Lock lock)
      Description copied from interface: LockManager
      Sets a lock on a document.

      If the document is already locked, returns its existing lock status (there is no re-locking, LockManager.removeLock(java.lang.String, java.lang.String) must be called first).

      Parameters:
      id - the document id
      lock - the lock to set
      Returns:
      null if locking succeeded, or the existing lock if locking failed
    • removeLock

      public Lock removeLock(String id, String owner)
      Description copied from interface: LockManager
      Removes the lock from a document.

      The previous lock is returned.

      If owner is null then the lock is unconditionally removed.

      If owner is not null, it must match the existing lock owner for the lock to be removed. If it doesn't match, the returned lock will return true for Lock.getFailed().

      Parameters:
      id - the document id
      owner - the owner to check, or null for no check
      Returns:
      the previous lock (may be null), with a failed flag if locking failed
    • insertOne

      protected void insertOne(org.bson.Document document)
    • insertMany

      protected void insertMany(List<org.bson.Document> documents)
    • updateMany

      protected com.mongodb.client.result.UpdateResult updateMany(org.bson.conversions.Bson filter, org.bson.conversions.Bson update)
    • deleteMany

      protected com.mongodb.client.result.DeleteResult deleteMany(org.bson.conversions.Bson filter)
    • find

      protected com.mongodb.client.FindIterable<org.bson.Document> find(org.bson.conversions.Bson filter)
    • getMaxTimeMs

      protected long getMaxTimeMs()
    • countDocuments

      protected long countDocuments(org.bson.conversions.Bson filter)
    • countDocuments

      protected long countDocuments(org.bson.conversions.Bson filter, com.mongodb.client.model.CountOptions options)