mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-07-24 17:32:48 +00:00
Merged V2.1 to HEAD:
6556: AVM performance tweaks 6557: WCM-758. 6558: Fixes WCM-753. 6559: better handling of rename, copy and paste for form instance data and renditions. addresses WCM-752 and partially addresses WCM-559. 6560: Renamed JndiTest.java until we decide to keep it or not. 6561: Oops. 6562: probable fix WCM-669 6563: Build fix after the removal of flushing suport 6564: Fix for WCM-728 6566: Support for avm index clustering via tracking - WCM-762 6567: Test fix after flush changes 6568: Fixed AWC-1517: Can now create space based on existing top-level space 6569: misc IE fixes. 6570: Various changes to improve AVM import performance and submit performance. 6571: Session flushing is now deprecated and doesn't fail with an exception. 6572: Reduced the iteration count to stress nextResults calls a bit more 6573: WS query sessions put back into cache after more results have been fetched. 6574: AR-1347: RepositoryServiceSoapBindingStub.queryAssociated() returns nothing when direction=target 6575: Fixed AR-1680: XPath metadata extraction now handles Node, NodeList and String return values 6577: Fix for AWC-1518 (User Homes renaming issue, and unreported issue with client config overriding of users home location) git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@6745 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
@@ -1,315 +1,315 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
|
||||
<hibernate-mapping package="org.alfresco.repo.avm">
|
||||
|
||||
<typedef class="org.alfresco.repo.domain.hibernate.QNameUserType" name="QName"/>
|
||||
|
||||
<!-- AVMNodeBean is the abstract base for filesystem like objects.
|
||||
We're using the one table per class hierarchy strategy to implement
|
||||
polymorphism. -->
|
||||
<class table="avm_nodes" abstract="true"
|
||||
name="AVMNodeImpl"
|
||||
proxy="AVMNode"
|
||||
optimistic-lock="version"
|
||||
lazy="true">
|
||||
<cache usage="read-write"/>
|
||||
<!-- The id is set programmatically using an Issuer. See below. -->
|
||||
<id name="id"
|
||||
column="id"
|
||||
type="long"/>
|
||||
<!-- I suppose this would be more efficient to encode type by an int.
|
||||
We'll see if using a string makes a difference. -->
|
||||
<discriminator column="class_type"
|
||||
type="string"
|
||||
length="20"/>
|
||||
<!-- We're using hibernate's own versioning scheme for concurrency control.
|
||||
I don't know how well that will play with a full Spring-JTA stack. -->
|
||||
<version column="vers"
|
||||
name="vers"
|
||||
type="long"/>
|
||||
<!-- This should really be not null, but I haven't figured out
|
||||
the right way to build the relation so that nullability constraints
|
||||
won't cause violations in the db during saves. -->
|
||||
<property name="versionID" type="int" column="version_id"
|
||||
not-null="true"/>
|
||||
<property name="guid" type="string" length="36" column="guid"/>
|
||||
<component name="basicAttributes" class="BasicAttributesImpl">
|
||||
<property name="creator" type="string" not-null="true"/>
|
||||
<property name="owner" type="string" not-null="true"/>
|
||||
<property name="lastModifier" type="string" not-null="true"/>
|
||||
<property name="createDate" type="long" not-null="true"/>
|
||||
<property name="modDate" type="long" not-null="true"/>
|
||||
<property name="accessDate" type="long" not-null="true"/>
|
||||
</component>
|
||||
<property name="isRoot" column="is_root" type="boolean"/>
|
||||
<many-to-one name="storeNew" class="AVMStoreImpl" column="store_new_id" foreign-key="fk_avm_n_store"/>
|
||||
<!-- ACL -->
|
||||
<many-to-one name="acl" column="acl_id" foreign-key="fk_avm_n_acl"
|
||||
class="org.alfresco.repo.domain.hibernate.DbAccessControlListImpl"/>
|
||||
<set name="aspects" fetch="join" lazy="false" table="avm_aspects_new" cascade="all" optimistic-lock="true">
|
||||
<cache usage="read-write"/>
|
||||
<key column="id"/>
|
||||
<element type="QName" not-null="true" column="name" length="200"/>
|
||||
</set>
|
||||
<map name="properties" fetch="join" lazy="false" table="avm_node_properties_new" cascade="all" optimistic-lock="true">
|
||||
<cache usage="read-write"/>
|
||||
<key column="node_id" not-null="true"/>
|
||||
<map-key type="QName" length="200" column="qname"/>
|
||||
<composite-element class="org.alfresco.repo.domain.PropertyValue">
|
||||
<property name="actualType" column="actual_type" type="string" length="15" not-null="true" />
|
||||
<property name="multiValued" column="multi_valued" type="boolean" not-null="true" />
|
||||
<property name="persistedType" column="persisted_type" type="string" length="15" not-null="true" />
|
||||
<property name="booleanValue" column="boolean_value" type="boolean" />
|
||||
<property name="longValue" column="long_value" type="long" />
|
||||
<property name="floatValue" column="float_value" type="float" />
|
||||
<property name="doubleValue" column="double_value" type="double" />
|
||||
<property name="stringValue" column="string_value" type="string" length="1024"/>
|
||||
<property name="serializableValue" column="serializable_value" type="serializable" length="16384"/>
|
||||
</composite-element>
|
||||
</map>
|
||||
<!-- Deleted nodes -->
|
||||
<subclass name="DeletedNodeImpl"
|
||||
proxy="DeletedNode"
|
||||
lazy="true"
|
||||
discriminator-value="deletednode">
|
||||
<property name="deletedType" type="int"/>
|
||||
</subclass>
|
||||
<!-- Directories, two flavors. -->
|
||||
<subclass name="DirectoryNodeImpl"
|
||||
proxy="DirectoryNode"
|
||||
abstract="true"
|
||||
lazy="true">
|
||||
<!-- A Layered Directory is our smart symlink thingy. -->
|
||||
<subclass name="LayeredDirectoryNodeImpl"
|
||||
proxy="LayeredDirectoryNode"
|
||||
discriminator-value="layereddirectory" lazy="true">
|
||||
<!-- The layer id is an implementation trick to disambiguate
|
||||
exactly what layer is being refered to in various circumstances. -->
|
||||
<property name="layerID" column="layer_id" type="long"/>
|
||||
<!-- The is the moral equivalent of the value of a symlink. -->
|
||||
<property name="indirection" column="indirection"
|
||||
type="string" length="511" />
|
||||
<property name="indirectionVersion" type="int" column="indirection_version"/>
|
||||
<!-- This marks a layered directory as either knowing itself what
|
||||
it points at (true) or inheriting what it points at from its
|
||||
container (false). -->
|
||||
<property name="primaryIndirection"
|
||||
column="primary_indirection" type="boolean"/>
|
||||
<property name="opacity" column="opacity" type="boolean"/>
|
||||
<!-- Map of names to DirectoryEntries. -->
|
||||
</subclass>
|
||||
<!-- Just plain directories. -->
|
||||
<subclass name="PlainDirectoryNodeImpl"
|
||||
discriminator-value="plaindirectory" proxy="PlainDirectoryNode" lazy="true">
|
||||
</subclass>
|
||||
</subclass>
|
||||
<!-- There are two kinds of files, plain and symlinky. -->
|
||||
<subclass name="FileNodeImpl"
|
||||
proxy="FileNode"
|
||||
abstract="true"
|
||||
lazy="false">
|
||||
<!-- Plain files just have a reference to a Content object. -->
|
||||
<subclass discriminator-value="plainfile"
|
||||
name="PlainFileNodeImpl" proxy="PlainFileNode" lazy="true">
|
||||
<property name="contentURL" column="content_url" type="string" length="128"/>
|
||||
<property name="mimeType" column="mime_type" type="string" length="64"/>
|
||||
<property name="encoding" column="encoding" type="string" length="16"/>
|
||||
<property name="length" column="length" type="long"/>
|
||||
</subclass>
|
||||
<!-- Layered files are almost exactly copy on write symlinks. -->
|
||||
<subclass name="LayeredFileNodeImpl"
|
||||
discriminator-value="layeredfile" proxy="LayeredFileNode" lazy="true">
|
||||
<property name="indirection" type="string" length="511"
|
||||
column="indirection" />
|
||||
<property name="indirectionVersion" type="int" column="indirection_version"/>
|
||||
</subclass>
|
||||
</subclass>
|
||||
</class>
|
||||
<!-- A store is the what we used to call a virtual repository. -->
|
||||
<class table="avm_stores" name="AVMStoreImpl"
|
||||
proxy="AVMStore" optimistic-lock="version">
|
||||
<cache usage="read-write"/>
|
||||
<id name="id" column="id" type="long">
|
||||
<generator class="native"/>
|
||||
</id>
|
||||
<version name="vers" column="vers" type="long"/>
|
||||
<property name="name" column="name" type="string" unique="true"/>
|
||||
<property type="int" name="nextVersionID"
|
||||
column="next_version_id" not-null="true"/>
|
||||
<!-- Every AVMStore has a root directory that is the current root directory. -->
|
||||
<many-to-one name="root" class="DirectoryNodeImpl"
|
||||
column="current_root_id" cascade="save-update" foreign-key="fk_avm_s_root">
|
||||
</many-to-one>
|
||||
</class>
|
||||
<class name="VersionRootImpl" proxy="VersionRoot" table="avm_version_roots">
|
||||
<!-- <cache usage="read-write"/> -->
|
||||
<id column="id" type="long">
|
||||
<generator class="native"></generator>
|
||||
</id>
|
||||
<natural-id>
|
||||
<property name="versionID" type="int" not-null="true"
|
||||
column="version_id" index="idx_avm_vr_version">
|
||||
</property>
|
||||
<many-to-one name="avmStore" column="avm_store_id"
|
||||
class="AVMStoreImpl" not-null="true" foreign-key="fk_avm_vr_store">
|
||||
</many-to-one>
|
||||
</natural-id>
|
||||
<property name="createDate" type="long" not-null="true" column="create_date">
|
||||
</property>
|
||||
<property name="creator" type="string" column="creator"
|
||||
not-null="true">
|
||||
</property>
|
||||
<many-to-one name="root" class="DirectoryNodeImpl"
|
||||
column="root_id" not-null="true" foreign-key="fk_avm_vr_root">
|
||||
</many-to-one>
|
||||
<property name="tag" type="string" length="255" column="tag"/>
|
||||
<property name="description" type="string" length="4000" column="description"/>
|
||||
</class>
|
||||
<class name="ChildEntryImpl" proxy="ChildEntry" table="avm_child_entries">
|
||||
<cache usage="read-write"/>
|
||||
<composite-id name="key" class="ChildKey">
|
||||
<key-many-to-one name="parent" column="parent_id" class="DirectoryNodeImpl" foreign-key="fk_avm_ce_parent"/>
|
||||
<key-property name="name" column="name" type="string" length="160"/>
|
||||
</composite-id>
|
||||
<many-to-one name="child" column="child_id" class="AVMNodeImpl" not-null="true" foreign-key="fk_avm_ce_child"/>
|
||||
</class>
|
||||
<class name="HistoryLinkImpl" proxy="HistoryLink" table="avm_history_links">
|
||||
<composite-id>
|
||||
<key-many-to-one name="ancestor" class="AVMNodeImpl" column="ancestor" foreign-key="fk_avm_hl_ancestor"/>
|
||||
<key-many-to-one name="descendent" class="AVMNodeImpl" column="descendent" foreign-key="fk_avm_hl_desc"/>
|
||||
</composite-id>
|
||||
</class>
|
||||
<class name="MergeLinkImpl" proxy="MergeLink" table="avm_merge_links">
|
||||
<composite-id>
|
||||
<key-many-to-one name="mfrom" class="AVMNodeImpl" column="mfrom" foreign-key="fk_avm_ml_from"/>
|
||||
<key-many-to-one name="mto" class="AVMNodeImpl" column="mto" foreign-key="fk_avm_ml_to"/>
|
||||
</composite-id>
|
||||
</class>
|
||||
<class name="AVMNodePropertyImpl" proxy="AVMNodeProperty" table="avm_node_properties">
|
||||
<id name="id" column="id" type="long">
|
||||
<generator class="native"/>
|
||||
</id>
|
||||
<many-to-one name="node" class="AVMNodeImpl" column="node_id" foreign-key="fk_avm_np_node"/>
|
||||
<property name="name" column="qname" type="QName" length="200" index="idx_avm_np_name"/>
|
||||
<component class="org.alfresco.repo.domain.PropertyValue" name="value">
|
||||
<property name="actualType" column="actual_type" type="string" length="15" not-null="true" />
|
||||
<property name="multiValued" column="multi_valued" type="boolean" not-null="true" />
|
||||
<property name="persistedType" column="persisted_type" type="string" length="15" not-null="true" />
|
||||
<property name="booleanValue" column="boolean_value" type="boolean" />
|
||||
<property name="longValue" column="long_value" type="long" />
|
||||
<property name="floatValue" column="float_value" type="float" />
|
||||
<property name="doubleValue" column="double_value" type="double" />
|
||||
<property name="stringValue" column="string_value" type="string" length="1024"/>
|
||||
<property name="serializableValue" column="serializable_value" type="serializable" length="16384"/>
|
||||
</component>
|
||||
</class>
|
||||
<class name="AVMStorePropertyImpl" proxy="AVMStoreProperty" table="avm_store_properties">
|
||||
<id name="id" column="id" type="long">
|
||||
<generator class="native"/>
|
||||
</id>
|
||||
<many-to-one name="store" class="AVMStoreImpl" column="avm_store_id" foreign-key="fk_avm_sp_store"/>
|
||||
<property name="name" column="qname" type="QName" length="200" index="idx_avm_sp_name"/>
|
||||
<component class="org.alfresco.repo.domain.PropertyValue" name="value">
|
||||
<property name="actualType" column="actual_type" type="string" length="15" not-null="true" />
|
||||
<property name="multiValued" column="multi_valued" type="boolean" not-null="true" />
|
||||
<property name="persistedType" column="persisted_type" type="string" length="15" not-null="true" />
|
||||
<property name="booleanValue" column="boolean_value" type="boolean" />
|
||||
<property name="longValue" column="long_value" type="long" />
|
||||
<property name="floatValue" column="float_value" type="float" />
|
||||
<property name="doubleValue" column="double_value" type="double" />
|
||||
<property name="stringValue" column="string_value" type="string" length="1024"/>
|
||||
<property name="serializableValue" column="serializable_value" type="serializable" length="16384"/>
|
||||
</component>
|
||||
</class>
|
||||
<!-- Aspect name table for AVM Nodes. -->
|
||||
<class name="AVMAspectNameImpl" proxy="AVMAspectName" table="avm_aspects">
|
||||
<id name="id" column="id" type="long">
|
||||
<generator class="native"/>
|
||||
</id>
|
||||
<many-to-one name="node" class="AVMNodeImpl" column="node_id" foreign-key="fk_avm_asp_node"/>
|
||||
<property name="name" column="qname" type="QName" length="200"/>
|
||||
</class>
|
||||
<!-- When a snapshot is created we stow away all of the layered
|
||||
nodes that were frozen by the snapshot so that subsequent
|
||||
snapshots can find them and force copies. -->
|
||||
<class name="VersionLayeredNodeEntryImpl" proxy="VersionLayeredNodeEntry"
|
||||
table="avm_version_layered_node_entry">
|
||||
<composite-id>
|
||||
<key-many-to-one name="version" class="VersionRootImpl" column="version_root_id"/>
|
||||
<key-property name="md5Sum" type="string" length="32" column="md5sum"/>
|
||||
</composite-id>
|
||||
<property name="path" type="string" length="512" column="path"/>
|
||||
</class>
|
||||
<query name="ChildEntry.DeleteByParent">
|
||||
<![CDATA[
|
||||
delete ChildEntryImpl ce
|
||||
where ce.key.parent = :parent
|
||||
]]>
|
||||
</query>
|
||||
<query name="AVMNode.GetNewInStore">
|
||||
<![CDATA[
|
||||
from AVMNodeImpl an
|
||||
where an.storeNew = :store
|
||||
]]>
|
||||
</query>
|
||||
<query name="AVMNode.GetDescendents">
|
||||
<![CDATA[
|
||||
select hl.descendent
|
||||
from HistoryLinkImpl hl
|
||||
where hl.ancestor = :node
|
||||
]]>
|
||||
</query>
|
||||
<query name="HistoryLink.ByAncestor">
|
||||
<![CDATA[
|
||||
from HistoryLinkImpl hl
|
||||
where hl.ancestor = :node
|
||||
]]>
|
||||
</query>
|
||||
<query name="AVMNode.GetMergedTo">
|
||||
<![CDATA[
|
||||
select ml.mto
|
||||
from MergeLinkImpl ml
|
||||
where ml.mfrom = :merged
|
||||
]]>
|
||||
</query>
|
||||
<query name="MergeLink.ByFrom">
|
||||
<![CDATA[
|
||||
from MergeLinkImpl ml
|
||||
where ml.mfrom = :merged
|
||||
]]>
|
||||
</query>
|
||||
<query name="VersionRoot.GetVersionRoot">
|
||||
<![CDATA[
|
||||
select v.root
|
||||
from VersionRootImpl v
|
||||
where
|
||||
v.avmStore = :store and v.versionID = :version
|
||||
]]>
|
||||
</query>
|
||||
<query name="VersionRoot.VersionByID">
|
||||
<![CDATA[
|
||||
from VersionRootImpl v
|
||||
where
|
||||
v.avmStore = :store and v.versionID = :version
|
||||
]]>
|
||||
</query>
|
||||
<query name="FindOrphans">
|
||||
<![CDATA[
|
||||
from AVMNodeImpl an
|
||||
where
|
||||
an not in ( select ce.child
|
||||
from ChildEntryImpl ce )
|
||||
and an.isRoot = false
|
||||
]]>
|
||||
</query>
|
||||
<query name="PlainFileNode.GetContentUrls">
|
||||
<![CDATA[
|
||||
select
|
||||
pfn.contentURL
|
||||
from
|
||||
PlainFileNodeImpl pfn
|
||||
where pfn.contentURL is not null
|
||||
]]>
|
||||
</query>
|
||||
|
||||
</hibernate-mapping>
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
|
||||
<hibernate-mapping package="org.alfresco.repo.avm">
|
||||
|
||||
<typedef class="org.alfresco.repo.domain.hibernate.QNameUserType" name="QName"/>
|
||||
|
||||
<!-- AVMNodeBean is the abstract base for filesystem like objects.
|
||||
We're using the one table per class hierarchy strategy to implement
|
||||
polymorphism. -->
|
||||
<class table="avm_nodes" abstract="true"
|
||||
name="AVMNodeImpl"
|
||||
proxy="AVMNode"
|
||||
optimistic-lock="version"
|
||||
lazy="true">
|
||||
<cache usage="read-write"/>
|
||||
<!-- The id is set programmatically using an Issuer. See below. -->
|
||||
<id name="id"
|
||||
column="id"
|
||||
type="long"/>
|
||||
<!-- I suppose this would be more efficient to encode type by an int.
|
||||
We'll see if using a string makes a difference. -->
|
||||
<discriminator column="class_type"
|
||||
type="string"
|
||||
length="20"/>
|
||||
<!-- We're using hibernate's own versioning scheme for concurrency control.
|
||||
I don't know how well that will play with a full Spring-JTA stack. -->
|
||||
<version column="vers"
|
||||
name="vers"
|
||||
type="long"/>
|
||||
<!-- This should really be not null, but I haven't figured out
|
||||
the right way to build the relation so that nullability constraints
|
||||
won't cause violations in the db during saves. -->
|
||||
<property name="versionID" type="int" column="version_id"
|
||||
not-null="true"/>
|
||||
<property name="guid" type="string" length="36" column="guid"/>
|
||||
<component name="basicAttributes" class="BasicAttributesImpl">
|
||||
<property name="creator" type="string" not-null="true"/>
|
||||
<property name="owner" type="string" not-null="true"/>
|
||||
<property name="lastModifier" type="string" not-null="true"/>
|
||||
<property name="createDate" type="long" not-null="true"/>
|
||||
<property name="modDate" type="long" not-null="true"/>
|
||||
<property name="accessDate" type="long" not-null="true"/>
|
||||
</component>
|
||||
<property name="isRoot" column="is_root" type="boolean"/>
|
||||
<many-to-one name="storeNew" class="AVMStoreImpl" column="store_new_id" foreign-key="fk_avm_n_store"/>
|
||||
<!-- ACL -->
|
||||
<many-to-one name="acl" column="acl_id" foreign-key="fk_avm_n_acl"
|
||||
class="org.alfresco.repo.domain.hibernate.DbAccessControlListImpl"/>
|
||||
<set name="aspects" fetch="join" lazy="false" table="avm_aspects_new" cascade="all" optimistic-lock="true">
|
||||
<cache usage="read-write"/>
|
||||
<key column="id"/>
|
||||
<element type="QName" not-null="true" column="name" length="200"/>
|
||||
</set>
|
||||
<map name="properties" fetch="join" lazy="false" table="avm_node_properties_new" cascade="all" optimistic-lock="true">
|
||||
<cache usage="read-write"/>
|
||||
<key column="node_id" not-null="true"/>
|
||||
<map-key type="QName" length="200" column="qname"/>
|
||||
<composite-element class="org.alfresco.repo.domain.PropertyValue">
|
||||
<property name="actualType" column="actual_type" type="string" length="15" not-null="true" />
|
||||
<property name="multiValued" column="multi_valued" type="boolean" not-null="true" />
|
||||
<property name="persistedType" column="persisted_type" type="string" length="15" not-null="true" />
|
||||
<property name="booleanValue" column="boolean_value" type="boolean" />
|
||||
<property name="longValue" column="long_value" type="long" />
|
||||
<property name="floatValue" column="float_value" type="float" />
|
||||
<property name="doubleValue" column="double_value" type="double" />
|
||||
<property name="stringValue" column="string_value" type="string" length="1024"/>
|
||||
<property name="serializableValue" column="serializable_value" type="serializable" length="16384"/>
|
||||
</composite-element>
|
||||
</map>
|
||||
<!-- Deleted nodes -->
|
||||
<subclass name="DeletedNodeImpl"
|
||||
proxy="DeletedNode"
|
||||
lazy="true"
|
||||
discriminator-value="deletednode">
|
||||
<property name="deletedType" type="int"/>
|
||||
</subclass>
|
||||
<!-- Directories, two flavors. -->
|
||||
<subclass name="DirectoryNodeImpl"
|
||||
proxy="DirectoryNode"
|
||||
abstract="true"
|
||||
lazy="true">
|
||||
<!-- A Layered Directory is our smart symlink thingy. -->
|
||||
<subclass name="LayeredDirectoryNodeImpl"
|
||||
proxy="LayeredDirectoryNode"
|
||||
discriminator-value="layereddirectory" lazy="true">
|
||||
<!-- The layer id is an implementation trick to disambiguate
|
||||
exactly what layer is being refered to in various circumstances. -->
|
||||
<property name="layerID" column="layer_id" type="long"/>
|
||||
<!-- The is the moral equivalent of the value of a symlink. -->
|
||||
<property name="indirection" column="indirection"
|
||||
type="string" length="511" />
|
||||
<property name="indirectionVersion" type="int" column="indirection_version"/>
|
||||
<!-- This marks a layered directory as either knowing itself what
|
||||
it points at (true) or inheriting what it points at from its
|
||||
container (false). -->
|
||||
<property name="primaryIndirection"
|
||||
column="primary_indirection" type="boolean"/>
|
||||
<property name="opacity" column="opacity" type="boolean"/>
|
||||
<!-- Map of names to DirectoryEntries. -->
|
||||
</subclass>
|
||||
<!-- Just plain directories. -->
|
||||
<subclass name="PlainDirectoryNodeImpl"
|
||||
discriminator-value="plaindirectory" proxy="PlainDirectoryNode" lazy="true">
|
||||
</subclass>
|
||||
</subclass>
|
||||
<!-- There are two kinds of files, plain and symlinky. -->
|
||||
<subclass name="FileNodeImpl"
|
||||
proxy="FileNode"
|
||||
abstract="true"
|
||||
lazy="false">
|
||||
<!-- Plain files just have a reference to a Content object. -->
|
||||
<subclass discriminator-value="plainfile"
|
||||
name="PlainFileNodeImpl" proxy="PlainFileNode" lazy="true">
|
||||
<property name="contentURL" column="content_url" type="string" length="128"/>
|
||||
<property name="mimeType" column="mime_type" type="string" length="64"/>
|
||||
<property name="encoding" column="encoding" type="string" length="16"/>
|
||||
<property name="length" column="length" type="long"/>
|
||||
</subclass>
|
||||
<!-- Layered files are almost exactly copy on write symlinks. -->
|
||||
<subclass name="LayeredFileNodeImpl"
|
||||
discriminator-value="layeredfile" proxy="LayeredFileNode" lazy="true">
|
||||
<property name="indirection" type="string" length="511"
|
||||
column="indirection" />
|
||||
<property name="indirectionVersion" type="int" column="indirection_version"/>
|
||||
</subclass>
|
||||
</subclass>
|
||||
</class>
|
||||
<!-- A store is the what we used to call a virtual repository. -->
|
||||
<class table="avm_stores" name="AVMStoreImpl"
|
||||
proxy="AVMStore" optimistic-lock="version">
|
||||
<cache usage="read-write"/>
|
||||
<id name="id" column="id" type="long">
|
||||
<generator class="native"/>
|
||||
</id>
|
||||
<version name="vers" column="vers" type="long"/>
|
||||
<property name="name" column="name" type="string" unique="true"/>
|
||||
<property type="int" name="nextVersionID"
|
||||
column="next_version_id" not-null="true"/>
|
||||
<!-- Every AVMStore has a root directory that is the current root directory. -->
|
||||
<many-to-one name="root" class="DirectoryNodeImpl"
|
||||
column="current_root_id" cascade="save-update" foreign-key="fk_avm_s_root">
|
||||
</many-to-one>
|
||||
</class>
|
||||
<class name="VersionRootImpl" proxy="VersionRoot" table="avm_version_roots">
|
||||
<cache usage="read-write"/>
|
||||
<id name="id" column="id" type="long">
|
||||
<generator class="native"></generator>
|
||||
</id>
|
||||
<natural-id>
|
||||
<property name="versionID" type="int" not-null="true"
|
||||
column="version_id" index="idx_avm_vr_version">
|
||||
</property>
|
||||
<many-to-one name="avmStore" column="avm_store_id"
|
||||
class="AVMStoreImpl" not-null="true" foreign-key="fk_avm_vr_store">
|
||||
</many-to-one>
|
||||
</natural-id>
|
||||
<property name="createDate" type="long" not-null="true" column="create_date">
|
||||
</property>
|
||||
<property name="creator" type="string" column="creator"
|
||||
not-null="true">
|
||||
</property>
|
||||
<many-to-one name="root" class="DirectoryNodeImpl"
|
||||
column="root_id" not-null="true" foreign-key="fk_avm_vr_root">
|
||||
</many-to-one>
|
||||
<property name="tag" type="string" length="255" column="tag"/>
|
||||
<property name="description" type="string" length="4000" column="description"/>
|
||||
</class>
|
||||
<class name="ChildEntryImpl" proxy="ChildEntry" table="avm_child_entries">
|
||||
<cache usage="read-write"/>
|
||||
<composite-id name="key" class="ChildKey">
|
||||
<key-many-to-one name="parent" column="parent_id" class="DirectoryNodeImpl" foreign-key="fk_avm_ce_parent"/>
|
||||
<key-property name="name" column="name" type="string" length="160"/>
|
||||
</composite-id>
|
||||
<many-to-one name="child" column="child_id" class="AVMNodeImpl" not-null="true" foreign-key="fk_avm_ce_child"/>
|
||||
</class>
|
||||
<class name="HistoryLinkImpl" proxy="HistoryLink" table="avm_history_links">
|
||||
<composite-id>
|
||||
<key-many-to-one name="ancestor" class="AVMNodeImpl" column="ancestor" foreign-key="fk_avm_hl_ancestor"/>
|
||||
<key-many-to-one name="descendent" class="AVMNodeImpl" column="descendent" foreign-key="fk_avm_hl_desc"/>
|
||||
</composite-id>
|
||||
</class>
|
||||
<class name="MergeLinkImpl" proxy="MergeLink" table="avm_merge_links">
|
||||
<composite-id>
|
||||
<key-many-to-one name="mfrom" class="AVMNodeImpl" column="mfrom" foreign-key="fk_avm_ml_from"/>
|
||||
<key-many-to-one name="mto" class="AVMNodeImpl" column="mto" foreign-key="fk_avm_ml_to"/>
|
||||
</composite-id>
|
||||
</class>
|
||||
<class name="AVMNodePropertyImpl" proxy="AVMNodeProperty" table="avm_node_properties">
|
||||
<id name="id" column="id" type="long">
|
||||
<generator class="native"/>
|
||||
</id>
|
||||
<many-to-one name="node" class="AVMNodeImpl" column="node_id" foreign-key="fk_avm_np_node"/>
|
||||
<property name="name" column="qname" type="QName" length="200" index="idx_avm_np_name"/>
|
||||
<component class="org.alfresco.repo.domain.PropertyValue" name="value">
|
||||
<property name="actualType" column="actual_type" type="string" length="15" not-null="true" />
|
||||
<property name="multiValued" column="multi_valued" type="boolean" not-null="true" />
|
||||
<property name="persistedType" column="persisted_type" type="string" length="15" not-null="true" />
|
||||
<property name="booleanValue" column="boolean_value" type="boolean" />
|
||||
<property name="longValue" column="long_value" type="long" />
|
||||
<property name="floatValue" column="float_value" type="float" />
|
||||
<property name="doubleValue" column="double_value" type="double" />
|
||||
<property name="stringValue" column="string_value" type="string" length="1024"/>
|
||||
<property name="serializableValue" column="serializable_value" type="serializable" length="16384"/>
|
||||
</component>
|
||||
</class>
|
||||
<class name="AVMStorePropertyImpl" proxy="AVMStoreProperty" table="avm_store_properties">
|
||||
<id name="id" column="id" type="long">
|
||||
<generator class="native"/>
|
||||
</id>
|
||||
<many-to-one name="store" class="AVMStoreImpl" column="avm_store_id" foreign-key="fk_avm_sp_store"/>
|
||||
<property name="name" column="qname" type="QName" length="200" index="idx_avm_sp_name"/>
|
||||
<component class="org.alfresco.repo.domain.PropertyValue" name="value">
|
||||
<property name="actualType" column="actual_type" type="string" length="15" not-null="true" />
|
||||
<property name="multiValued" column="multi_valued" type="boolean" not-null="true" />
|
||||
<property name="persistedType" column="persisted_type" type="string" length="15" not-null="true" />
|
||||
<property name="booleanValue" column="boolean_value" type="boolean" />
|
||||
<property name="longValue" column="long_value" type="long" />
|
||||
<property name="floatValue" column="float_value" type="float" />
|
||||
<property name="doubleValue" column="double_value" type="double" />
|
||||
<property name="stringValue" column="string_value" type="string" length="1024"/>
|
||||
<property name="serializableValue" column="serializable_value" type="serializable" length="16384"/>
|
||||
</component>
|
||||
</class>
|
||||
<!-- Aspect name table for AVM Nodes. -->
|
||||
<class name="AVMAspectNameImpl" proxy="AVMAspectName" table="avm_aspects">
|
||||
<id name="id" column="id" type="long">
|
||||
<generator class="native"/>
|
||||
</id>
|
||||
<many-to-one name="node" class="AVMNodeImpl" column="node_id" foreign-key="fk_avm_asp_node"/>
|
||||
<property name="name" column="qname" type="QName" length="200"/>
|
||||
</class>
|
||||
<!-- When a snapshot is created we stow away all of the layered
|
||||
nodes that were frozen by the snapshot so that subsequent
|
||||
snapshots can find them and force copies. -->
|
||||
<class name="VersionLayeredNodeEntryImpl" proxy="VersionLayeredNodeEntry"
|
||||
table="avm_version_layered_node_entry">
|
||||
<composite-id>
|
||||
<key-many-to-one name="version" class="VersionRootImpl" column="version_root_id"/>
|
||||
<key-property name="md5Sum" type="string" length="32" column="md5sum"/>
|
||||
</composite-id>
|
||||
<property name="path" type="string" length="512" column="path"/>
|
||||
</class>
|
||||
<query name="ChildEntry.DeleteByParent">
|
||||
<![CDATA[
|
||||
delete ChildEntryImpl ce
|
||||
where ce.key.parent = :parent
|
||||
]]>
|
||||
</query>
|
||||
<query name="AVMNode.GetNewInStore">
|
||||
<![CDATA[
|
||||
from AVMNodeImpl an
|
||||
where an.storeNew = :store
|
||||
]]>
|
||||
</query>
|
||||
<query name="AVMNode.GetDescendents">
|
||||
<![CDATA[
|
||||
select hl.descendent
|
||||
from HistoryLinkImpl hl
|
||||
where hl.ancestor = :node
|
||||
]]>
|
||||
</query>
|
||||
<query name="HistoryLink.ByAncestor">
|
||||
<![CDATA[
|
||||
from HistoryLinkImpl hl
|
||||
where hl.ancestor = :node
|
||||
]]>
|
||||
</query>
|
||||
<query name="AVMNode.GetMergedTo">
|
||||
<![CDATA[
|
||||
select ml.mto
|
||||
from MergeLinkImpl ml
|
||||
where ml.mfrom = :merged
|
||||
]]>
|
||||
</query>
|
||||
<query name="MergeLink.ByFrom">
|
||||
<![CDATA[
|
||||
from MergeLinkImpl ml
|
||||
where ml.mfrom = :merged
|
||||
]]>
|
||||
</query>
|
||||
<query name="VersionRoot.GetVersionRoot">
|
||||
<![CDATA[
|
||||
select v.root
|
||||
from VersionRootImpl v
|
||||
where
|
||||
v.avmStore = :store and v.versionID = :version
|
||||
]]>
|
||||
</query>
|
||||
<query name="VersionRoot.VersionByID">
|
||||
<![CDATA[
|
||||
from VersionRootImpl v
|
||||
where
|
||||
v.avmStore = :store and v.versionID = :version
|
||||
]]>
|
||||
</query>
|
||||
<query name="FindOrphans">
|
||||
<![CDATA[
|
||||
from AVMNodeImpl an
|
||||
where
|
||||
an not in ( select ce.child
|
||||
from ChildEntryImpl ce )
|
||||
and an.isRoot = false
|
||||
]]>
|
||||
</query>
|
||||
<query name="PlainFileNode.GetContentUrls">
|
||||
<![CDATA[
|
||||
select
|
||||
pfn.contentURL
|
||||
from
|
||||
PlainFileNodeImpl pfn
|
||||
where pfn.contentURL is not null
|
||||
]]>
|
||||
</query>
|
||||
|
||||
</hibernate-mapping>
|
||||
|
@@ -1,178 +1,210 @@
|
||||
/*
|
||||
* Copyright (C) 2005-2007 Alfresco Software Limited.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
* As a special exception to the terms and conditions of version 2.0 of
|
||||
* the GPL, you may redistribute this Program in connection with Free/Libre
|
||||
* and Open Source Software ("FLOSS") applications as described in Alfresco's
|
||||
* FLOSS exception. You should have recieved a copy of the text describing
|
||||
* the FLOSS exception, and it is also available here:
|
||||
* http://www.alfresco.com/legal/licensing" */
|
||||
|
||||
package org.alfresco.repo.avm.hibernate;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
import org.alfresco.repo.avm.AVMNode;
|
||||
import org.alfresco.repo.avm.AVMStore;
|
||||
import org.alfresco.repo.avm.VersionRoot;
|
||||
import org.alfresco.repo.avm.VersionRootDAO;
|
||||
import org.hibernate.Query;
|
||||
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
|
||||
|
||||
/**
|
||||
* This is the Hibernate version of the DAO for version roots.
|
||||
* @author britt
|
||||
*/
|
||||
class VersionRootDAOHibernate extends HibernateDaoSupport implements
|
||||
VersionRootDAO
|
||||
{
|
||||
/**
|
||||
* Do nothing constructor.
|
||||
*/
|
||||
public VersionRootDAOHibernate()
|
||||
{
|
||||
super();
|
||||
}
|
||||
|
||||
/**
|
||||
* Save an unsaved VersionRoot.
|
||||
* @param vr The VersionRoot to save.
|
||||
*/
|
||||
public void save(VersionRoot vr)
|
||||
{
|
||||
getSession().save(vr);
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete a VersionRoot.
|
||||
* @param vr The VersionRoot to delete.
|
||||
*/
|
||||
public void delete(VersionRoot vr)
|
||||
{
|
||||
getSession().delete(vr);
|
||||
getSession().flush();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all the version roots in a given store.
|
||||
* @param store The store.
|
||||
* @return A List of VersionRoots. In id order.
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
public List<VersionRoot> getAllInAVMStore(AVMStore store)
|
||||
{
|
||||
Query query = getSession().createQuery("from VersionRootImpl v where v.avmStore = :store order by v.versionID");
|
||||
query.setEntity("store", store);
|
||||
return (List<VersionRoot>)query.list();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the version of a store by dates.
|
||||
* @param store The store.
|
||||
* @param from The starting date. May be null but not with to null also.
|
||||
* @param to The ending date. May be null but not with from null also.
|
||||
* @return A List of VersionRoots.
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
public List<VersionRoot> getByDates(AVMStore store, Date from, Date to)
|
||||
{
|
||||
Query query;
|
||||
if (from == null)
|
||||
{
|
||||
query =
|
||||
getSession().createQuery("from VersionRootImpl vr where vr.createDate <= :to " +
|
||||
"and vr.avmStore = :store " +
|
||||
"order by vr.versionID");
|
||||
query.setLong("to", to.getTime());
|
||||
}
|
||||
else if (to == null)
|
||||
{
|
||||
query =
|
||||
getSession().createQuery("from VersionRootImpl vr " +
|
||||
"where vr.createDate >= :from " +
|
||||
"and vr.avmStore = :store " +
|
||||
"order by vr.versionID");
|
||||
query.setLong("from", from.getTime());
|
||||
}
|
||||
else
|
||||
{
|
||||
query =
|
||||
getSession().createQuery("from VersionRootImpl vr "+
|
||||
"where vr.createDate between :from and :to " +
|
||||
"and vr.avmStore = :store " +
|
||||
"order by vr.versionID");
|
||||
query.setLong("from", from.getTime());
|
||||
query.setLong("to", to.getTime());
|
||||
}
|
||||
query.setEntity("store", store);
|
||||
return (List<VersionRoot>)query.list();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the VersionRoot corresponding to the given id.
|
||||
* @param store The store
|
||||
* @param id The version id.
|
||||
* @return The VersionRoot or null if not found.
|
||||
*/
|
||||
public VersionRoot getByVersionID(AVMStore store, int id)
|
||||
{
|
||||
Query query = getSession().getNamedQuery("VersionRoot.VersionByID");
|
||||
query.setEntity("store", store);
|
||||
query.setInteger("version", id);
|
||||
return (VersionRoot)query.uniqueResult();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get one from its root.
|
||||
* @param root The root to match.
|
||||
* @return The version root or null.
|
||||
*/
|
||||
public VersionRoot getByRoot(AVMNode root)
|
||||
{
|
||||
Query query = getSession().createQuery("from VersionRootImpl vr " +
|
||||
"where vr.root = :root");
|
||||
query.setEntity("root", root);
|
||||
return (VersionRoot)query.uniqueResult();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the highest numbered version in a repository.
|
||||
* @param rep The repository.
|
||||
* @return The highest numbered version.
|
||||
*/
|
||||
public VersionRoot getMaxVersion(AVMStore rep)
|
||||
{
|
||||
Query query = getSession().createQuery("from VersionRootImpl vr " +
|
||||
"where vr.avmStore = :store and vr.versionID = " +
|
||||
"(select max(v.versionID) from VersionRootImpl v where v.avmStore = :store)");
|
||||
query.setEntity("store", rep);
|
||||
return (VersionRoot)query.uniqueResult();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the highest numbered id from all the versions in a store.
|
||||
* @param store The store.
|
||||
* @return The highest numbered id.
|
||||
*/
|
||||
public Integer getMaxVersionID(AVMStore store)
|
||||
{
|
||||
Query query = getSession().createQuery("select max(vr.versionID) from VersionRootImpl vr " +
|
||||
"where vr.avmStore = :store");
|
||||
query.setEntity("store", store);
|
||||
return (Integer)query.uniqueResult();
|
||||
}
|
||||
}
|
||||
/*
|
||||
* Copyright (C) 2005-2007 Alfresco Software Limited.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
* As a special exception to the terms and conditions of version 2.0 of
|
||||
* the GPL, you may redistribute this Program in connection with Free/Libre
|
||||
* and Open Source Software ("FLOSS") applications as described in Alfresco's
|
||||
* FLOSS exception. You should have recieved a copy of the text describing
|
||||
* the FLOSS exception, and it is also available here:
|
||||
* http://www.alfresco.com/legal/licensing" */
|
||||
|
||||
package org.alfresco.repo.avm.hibernate;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.Iterator;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
|
||||
import org.alfresco.repo.avm.AVMNode;
|
||||
import org.alfresco.repo.avm.AVMStore;
|
||||
import org.alfresco.repo.avm.VersionRoot;
|
||||
import org.alfresco.repo.avm.VersionRootImpl;
|
||||
import org.alfresco.repo.avm.VersionRootDAO;
|
||||
import org.alfresco.util.Pair;
|
||||
import org.hibernate.Query;
|
||||
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
|
||||
|
||||
/**
|
||||
* This is the Hibernate version of the DAO for version roots.
|
||||
* @author britt
|
||||
*/
|
||||
class VersionRootDAOHibernate extends HibernateDaoSupport implements
|
||||
VersionRootDAO
|
||||
{
|
||||
private LinkedHashMap<Pair<Long, Integer>, Long> fCache;
|
||||
|
||||
/**
|
||||
* Do nothing constructor.
|
||||
*/
|
||||
public VersionRootDAOHibernate()
|
||||
{
|
||||
super();
|
||||
fCache = new LinkedHashMap<Pair<Long, Integer>, Long>();
|
||||
}
|
||||
|
||||
/**
|
||||
* Save an unsaved VersionRoot.
|
||||
* @param vr The VersionRoot to save.
|
||||
*/
|
||||
public void save(VersionRoot vr)
|
||||
{
|
||||
getSession().save(vr);
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete a VersionRoot.
|
||||
* @param vr The VersionRoot to delete.
|
||||
*/
|
||||
public void delete(VersionRoot vr)
|
||||
{
|
||||
getSession().delete(vr);
|
||||
getSession().flush();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all the version roots in a given store.
|
||||
* @param store The store.
|
||||
* @return A List of VersionRoots. In id order.
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
public List<VersionRoot> getAllInAVMStore(AVMStore store)
|
||||
{
|
||||
Query query = getSession().createQuery("from VersionRootImpl v where v.avmStore = :store order by v.versionID");
|
||||
query.setEntity("store", store);
|
||||
return (List<VersionRoot>)query.list();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the version of a store by dates.
|
||||
* @param store The store.
|
||||
* @param from The starting date. May be null but not with to null also.
|
||||
* @param to The ending date. May be null but not with from null also.
|
||||
* @return A List of VersionRoots.
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
public List<VersionRoot> getByDates(AVMStore store, Date from, Date to)
|
||||
{
|
||||
Query query;
|
||||
if (from == null)
|
||||
{
|
||||
query =
|
||||
getSession().createQuery("from VersionRootImpl vr where vr.createDate <= :to " +
|
||||
"and vr.avmStore = :store " +
|
||||
"order by vr.versionID");
|
||||
query.setLong("to", to.getTime());
|
||||
}
|
||||
else if (to == null)
|
||||
{
|
||||
query =
|
||||
getSession().createQuery("from VersionRootImpl vr " +
|
||||
"where vr.createDate >= :from " +
|
||||
"and vr.avmStore = :store " +
|
||||
"order by vr.versionID");
|
||||
query.setLong("from", from.getTime());
|
||||
}
|
||||
else
|
||||
{
|
||||
query =
|
||||
getSession().createQuery("from VersionRootImpl vr "+
|
||||
"where vr.createDate between :from and :to " +
|
||||
"and vr.avmStore = :store " +
|
||||
"order by vr.versionID");
|
||||
query.setLong("from", from.getTime());
|
||||
query.setLong("to", to.getTime());
|
||||
}
|
||||
query.setEntity("store", store);
|
||||
return (List<VersionRoot>)query.list();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the VersionRoot corresponding to the given id.
|
||||
* @param store The store
|
||||
* @param id The version id.
|
||||
* @return The VersionRoot or null if not found.
|
||||
*/
|
||||
public synchronized VersionRoot getByVersionID(AVMStore store, int id)
|
||||
{
|
||||
Long vID = fCache.get(new Pair<Long, Integer>(store.getId(), id));
|
||||
if (vID != null)
|
||||
{
|
||||
VersionRoot root = (VersionRoot)getSession().get(VersionRootImpl.class, vID);
|
||||
if (root != null)
|
||||
{
|
||||
return root;
|
||||
}
|
||||
fCache.remove(new Pair<Long, Integer>(store.getId(), id));
|
||||
}
|
||||
Query query = getSession().getNamedQuery("VersionRoot.VersionByID");
|
||||
query.setEntity("store", store);
|
||||
query.setInteger("version", id);
|
||||
VersionRoot root = (VersionRoot)query.uniqueResult();
|
||||
if (root != null)
|
||||
{
|
||||
vID = root.getId();
|
||||
if (vID != null)
|
||||
{
|
||||
if (fCache.size() >= 10)
|
||||
{
|
||||
Iterator<Pair<Long, Integer>> iter = fCache.keySet().iterator();
|
||||
iter.next();
|
||||
iter.remove();
|
||||
}
|
||||
fCache.put(new Pair<Long, Integer>(store.getId(), id), vID);
|
||||
}
|
||||
}
|
||||
return root;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get one from its root.
|
||||
* @param root The root to match.
|
||||
* @return The version root or null.
|
||||
*/
|
||||
public VersionRoot getByRoot(AVMNode root)
|
||||
{
|
||||
Query query = getSession().createQuery("from VersionRootImpl vr " +
|
||||
"where vr.root = :root");
|
||||
query.setEntity("root", root);
|
||||
return (VersionRoot)query.uniqueResult();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the highest numbered version in a repository.
|
||||
* @param rep The repository.
|
||||
* @return The highest numbered version.
|
||||
*/
|
||||
public VersionRoot getMaxVersion(AVMStore rep)
|
||||
{
|
||||
Query query = getSession().createQuery("from VersionRootImpl vr " +
|
||||
"where vr.avmStore = :store and vr.versionID = " +
|
||||
"(select max(v.versionID) from VersionRootImpl v where v.avmStore = :store)");
|
||||
query.setEntity("store", rep);
|
||||
return (VersionRoot)query.uniqueResult();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the highest numbered id from all the versions in a store.
|
||||
* @param store The store.
|
||||
* @return The highest numbered id.
|
||||
*/
|
||||
public Integer getMaxVersionID(AVMStore store)
|
||||
{
|
||||
Query query = getSession().createQuery("select max(vr.versionID) from VersionRootImpl vr " +
|
||||
"where vr.avmStore = :store");
|
||||
query.setEntity("store", store);
|
||||
return (Integer)query.uniqueResult();
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user