Class PersistenceContext
All non-saved modified data is referenced here. At save time, the data is sent to the database by the Mapper.
The database will at some time later be committed by the external transaction manager in effect.
Internally a fragment can be in at most one of the "pristine" or "modified" map. After a save() all the fragments are pristine, and may be partially invalidated after commit by other local or clustered contexts that committed too.
Depending on the table, the context may hold SimpleFragments, which represent one row,
CollectionFragments, which represent several rows.
This class is not thread-safe, it should be tied to a single session and the session itself should not be used concurrently.
-
Nested Class Summary
Nested Classes -
Field Summary
FieldsModifier and TypeFieldDescriptionprotected longThreshold at which we warn that a Selection may be too big, with stack trace.protected final io.dropwizard.metrics5.Counterprotected final io.dropwizard.metrics5.Counterprotected final booleanprotected final SelectionContextfinal SelectionContextprotected final RowMapperprotected final ModelThe fragments changed by the session.protected static final SimpleFragment.FieldComparatorThe pristine fragments.protected final io.dropwizard.metrics5.MetricRegistryCache statisticsstatic final Stringstatic final StringProperty for threshold at which we warn that a Selection may be too big, with stack trace.protected final SessionImplprotected final Set<Serializable>Document ids modified as "user changes", which means that a change token should be checked.protected static final SimpleFragment.FieldComparatorprotected final BaseSession.VersionAclMode -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionvoidaddedProxyTarget(SimpleFragment fragment) protected voidcheckFreeName(Serializable parentId, String name, boolean complexProp) Checks that a name is free.Checks in a node (creates a version).voidprotected voidcheckNotUnder(Serializable parentId, Serializable id, String op) Checks that we don't move/copy under ourselves.voidChecks out a node.protected intprotected intcopy(Node source, Serializable parentId, String name, Consumer<Serializable> afterRecordCopy) Copy a child to a new parent with a new name.voidcreatedProxyFragment(SimpleFragment fragment) protected voidfindDirtyDocuments(Set<Serializable> dirtyStrings, Set<Serializable> dirtyBinaries) Finds the documents having dirty text or dirty binaries that have to be reindexed as fulltext.protected Set<Serializable>Finds the documents having been modified.protected SerializableGenerates a new id, or used a pre-generated one (import).protected FragmentGets a fragment.protected longprotected longprotected longprotected longgetChildHierByName(Serializable parentId, String name, boolean complexProp) getChildren(Serializable parentId, String name, boolean complexProp) Gets hier fragments for children.Finds the id of the enclosing non-complex-property node.protected FragmentgetFragmentFromFetchedRow(RowId rowId, boolean allowAbsent) Turns the given row (just fetched from the mapper) into a fragment and record it in the context.getFragmentsFromFetchedRows(List<? extends RowId> rowIds, boolean allowAbsent) Turns the given rows (just fetched from the mapper) into fragments and record them in the context.getFromMapper(Collection<RowId> rowIds, boolean allowAbsent, boolean cacheOnly) Gets a collection of fragments from the mapper.protected FragmentgetFromMapper(RowId rowId, boolean allowAbsent, boolean cacheOnly) Gets a fragment from the context or the mapper cache or the underlying database.protected SimpleFragmentgetHier(Serializable id, boolean allowAbsent) protected FragmentgetIfPresent(RowId rowId) Gets a fragment, if present in the context.getMulti(Collection<RowId> rowIds, boolean allowAbsent) Gets a list of fragments.getNextPos(Serializable nodeId, boolean complexProp) Gets the next pos value for a new child in a folder.getNodeAndDescendantsInfo(SimpleFragment hierFragment) Gets descendants infos from a given root node.getPath(SimpleFragment hierFragment) Gets the path by recursing up the hierarchy.getPathOrMissingParentId(SimpleFragment hierFragment, boolean fetch) Gets the full path, or the closest parent id which we don't have in cache.protected RowMapper.RowBatchgetSaveBatch(List<Fragment> fragmentsToClearDirty) Saves all the created, modified and deleted rows into a batch object, for later execution.getSeriesProxyIds(Serializable versionSeriesId) getTargetProxies(Set<Serializable> ids) getTargetProxyIds(Serializable targetId) getVersionIds(Serializable versionSeriesId) Gets the version ids for a version series, ordered by creation time.booleanRecursively checks if any of a fragment's parents has been deleted.protected booleanisIdNew(Serializable id) protected voidmarkInvalidated(VCSInvalidations invalidations) Marks locally all the invalidations gathered by aMapperoperation (like a version restore).protected voidMarks this document id as belonging to a user change.voidmove(Node source, Serializable parentId, String name) Move a child to a new parent with a new name.voidorderBefore(Serializable parentId, Serializable sourceId, Serializable destId) Order a child before another.voidApplies all invalidations accumulated.voidrecomputeVersionSeries(Serializable versionSeriesId) Recomputes isLatest / isLatestMajor on all versions.voidremovedProxyTarget(SimpleFragment fragment) voidremoveFragment(Fragment fragment, boolean primary) Deletes a fragment from the context.voidremoveNode(SimpleFragment hierFragment, List<RowMapper.NodeInfo> nodeInfos) Removes a document node and its children.voidremovePropertyNode(SimpleFragment hierFragment) Removes a property node and its children.voidrestoreVersion(Node node, Node version) Restores a node to a given version.voidPost-transaction invalidations notification.protected voidsetFragmentModified(Fragment fragment) protected voidsetFragmentPristine(Fragment fragment) protected Map<String,Serializable> Updates a change token in the main fragment, and returns the condition to check.
-
Field Details
-
SEL_WARN_THRESHOLD_PROP
Property for threshold at which we warn that a Selection may be too big, with stack trace.- Since:
- 7.1
- See Also:
-
SEL_WARN_THRESHOLD_DEFAULT
- See Also:
-
POS_COMPARATOR
-
VER_CREATED_COMPARATOR
-
model
-
mapper
-
session
-
versionAclMode
-
disableReadVersionPermission
protected final boolean disableReadVersionPermission -
hierComplex
-
hierNonComplex
-
pristine
The pristine fragments. All held data is identical to what is present in the database and could be refetched if needed.This contains fragment that are
Fragment.State.PRISTINEorFragment.State.ABSENT, or in some casesFragment.State.INVALIDATED_MODIFIEDorFragment.State.INVALIDATED_DELETED.Pristine fragments must be kept here when referenced by the application, because the application must get the same fragment object if asking for it twice, even in two successive transactions.
This is memory-sensitive, a fragment can always be refetched if nobody uses it and the GC collects it. Use a weak reference for the values, we don't hold them longer than they need to be referenced, as the underlying mapper also has its own cache.
-
modified
The fragments changed by the session.This contains fragment that are
Fragment.State.CREATED,Fragment.State.MODIFIEDorFragment.State.DELETED. -
userChangeIds
Document ids modified as "user changes", which means that a change token should be checked.- Since:
- 9.2
-
registry
protected final io.dropwizard.metrics5.MetricRegistry registryCache statistics- Since:
- 5.7
-
cacheCount
protected final io.dropwizard.metrics5.Counter cacheCount -
cacheHitCount
protected final io.dropwizard.metrics5.Counter cacheHitCount -
bigSelWarnThreshold
protected long bigSelWarnThresholdThreshold at which we warn that a Selection may be too big, with stack trace.
-
-
Constructor Details
-
PersistenceContext
-
-
Method Details
-
clearCaches
protected int clearCaches() -
clearLocalCaches
protected int clearLocalCaches() -
getCacheSize
protected long getCacheSize() -
getCacheMapperSize
protected long getCacheMapperSize() -
getCachePristineSize
protected long getCachePristineSize() -
getCacheSelectionSize
protected long getCacheSelectionSize() -
generateNewId
Generates a new id, or used a pre-generated one (import). -
isIdNew
-
markUserChange
Marks this document id as belonging to a user change.- Since:
- 9.2
-
getSaveBatch
Saves all the created, modified and deleted rows into a batch object, for later execution.Also updates the passed fragmentsToClearDirty list with dirty modified fragments, for later call of clearDirty (it's important to call it later and not now because for delta values we need the delta during batch write, and they are cleared by clearDirty).
-
updateChangeToken
Updates a change token in the main fragment, and returns the condition to check. -
findModifiedDocuments
Finds the documents having been modified.A document is modified if any of its direct fragments (same id) is modified, or if any of its complex property fragments having it as an ancestor is created, modified or deleted.
Created and deleted documents aren't considered modified.
- Returns:
- the set of modified documents
- Since:
- 9.1
-
findDirtyDocuments
Finds the documents having dirty text or dirty binaries that have to be reindexed as fulltext.- Parameters:
dirtyStrings- set of ids, updated by this methoddirtyBinaries- set of ids, updated by this method
-
markInvalidated
Marks locally all the invalidations gathered by aMapperoperation (like a version restore). -
setFragmentModified
-
setFragmentPristine
-
sendInvalidationsToOthers
public void sendInvalidationsToOthers()Post-transaction invalidations notification.Called post-transaction by session commit/rollback or transactionless save.
-
processReceivedInvalidations
public void processReceivedInvalidations()Applies all invalidations accumulated.Called pre-transaction by start or transactionless save;
-
checkInvalidationsConflict
public void checkInvalidationsConflict() -
getIfPresent
Gets a fragment, if present in the context.Called by
get(org.nuxeo.ecm.core.storage.sql.RowId, boolean), and by theMapperto reuse known selection fragments.- Parameters:
rowId- the fragment id- Returns:
- the fragment, or
nullif not found
-
get
Gets a fragment.If it's not in the context, fetch it from the mapper. If it's not in the database, returns
nullor an absent fragment.Deleted fragments may be returned.
- Parameters:
rowId- the fragment idallowAbsent-trueto return an absent fragment as an object instead ofnull- Returns:
- the fragment, or
nullif none is found andallowAbsentwasfalse
-
getFromMapper
Gets a fragment from the context or the mapper cache or the underlying database.- Parameters:
rowId- the fragment idallowAbsent-trueto return an absent fragment as an object instead ofnullcacheOnly- only check memory, not the database- Returns:
- the fragment, or when
allowAbsentisfalse, anullif not found
-
getFromMapper
protected List<Fragment> getFromMapper(Collection<RowId> rowIds, boolean allowAbsent, boolean cacheOnly) Gets a collection of fragments from the mapper. No order is kept between the inputs and outputs.Fragments not found are not returned if
allowAbsentisfalse. -
getMulti
Gets a list of fragments.If a fragment is not in the context, fetch it from the mapper. If it's not in the database, use an absent fragment or skip it.
Deleted fragments are skipped.
- Parameters:
rowIds- the row idsallowAbsent-trueto return an absent fragment as an object instead of skipping it- Returns:
- the fragments, in arbitrary order (no
nulls)
-
getFragmentsFromFetchedRows
protected List<Fragment> getFragmentsFromFetchedRows(List<? extends RowId> rowIds, boolean allowAbsent) Turns the given rows (just fetched from the mapper) into fragments and record them in the context.For each row, if the context already contains a fragment with the given id, it is returned instead of building a new one.
Deleted fragments are skipped.
If a simple
RowIdis passed, it means that an absent row was found by the mapper. An absent fragment will be returned, unlessallowAbsentisfalsein which case it will be skipped.- Parameters:
rowIds- the list of rows or row idsallowAbsent-trueto return an absent fragment as an object instead ofnull- Returns:
- the list of fragments
-
getFragmentFromFetchedRow
Turns the given row (just fetched from the mapper) into a fragment and record it in the context.If the context already contains a fragment with the given id, it is returned instead of building a new one.
If the fragment was deleted,
nullis returned.If a simple
RowIdis passed, it means that an absent row was found by the mapper. An absent fragment will be returned, unlessallowAbsentisfalsein which casenullwill be returned.- Parameters:
rowId- the row or row id (may benull)allowAbsent-trueto return an absent fragment as an object instead ofnull- Returns:
- the fragment, or
nullif it was deleted
-
createHierarchyFragment
-
createdProxyFragment
-
removedProxyTarget
-
addedProxyTarget
-
removePropertyNode
Removes a property node and its children.There's less work to do than when we have to remove a generic document node (less selections, and we can assume the depth is small so recurse).
-
getNodeAndDescendantsInfo
Gets descendants infos from a given root node. This includes information about the root node itself.- Since:
- 9.2
-
removeNode
Removes a document node and its children.Assumes a full flush was done.
-
removeFragment
Deletes a fragment from the context. May generate a database DELETE if primary istrue, otherwise consider that database removal will be a cascade-induced consequence of another DELETE. -
recomputeVersionSeries
Recomputes isLatest / isLatestMajor on all versions. -
getVersionIds
Gets the version ids for a version series, ordered by creation time. -
getSeriesProxyIds
-
getTargetProxyIds
-
getTargetProxies
-
getPath
Gets the path by recursing up the hierarchy. -
getPathOrMissingParentId
public PersistenceContext.PathAndId getPathOrMissingParentId(SimpleFragment hierFragment, boolean fetch) Gets the full path, or the closest parent id which we don't have in cache.If
fetchistrue, returns the full path.If
fetchisfalse, does not touch the mapper, only the context, therefore may return a missing parent id instead of the path.- Parameters:
fetch-trueif we can use the database,falseif only caches should be used
-
getContainingDocument
Finds the id of the enclosing non-complex-property node.- Parameters:
id- the id- Returns:
- the id of the containing document, or
nullif there is no parent or the parent has been deleted.
-
getHier
-
isDeleted
Recursively checks if any of a fragment's parents has been deleted. -
getNextPos
Gets the next pos value for a new child in a folder.- Parameters:
nodeId- the folder node idcomplexProp- whether to deal with complex properties or regular children- Returns:
- the next pos, or
nullif not orderable
-
orderBefore
Order a child before another.- Parameters:
parentId- the parent idsourceId- the node id to movedestId- the node id before which to place the source node, ifnullthen move the source to the end
-
getChildHierByName
-
getChildren
Gets hier fragments for children. -
checkNotUnder
Checks that we don't move/copy under ourselves. -
checkFreeName
Checks that a name is free. Cannot check concurrent sessions though. -
move
Move a child to a new parent with a new name.- Parameters:
source- the sourceparentId- the destination parent idname- the new name
-
copy
public Serializable copy(Node source, Serializable parentId, String name, Consumer<Serializable> afterRecordCopy) Copy a child to a new parent with a new name.- Parameters:
source- the source of the copyparentId- the destination parent idname- the new nameafterRecordCopy- a consumer called on ids of nodes that were records before copy- Returns:
- the id of the copy
-
checkIn
Checks in a node (creates a version).- Parameters:
node- the node to check inlabel- the version labelcheckinComment- the version description- Returns:
- the created version id
-
checkOut
Checks out a node.- Parameters:
node- the node to check out
-
restoreVersion
Restores a node to a given version.The restored node is checked in.
- Parameters:
node- the nodeversion- the version to restore on this node
-