Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions changelog/src/changelog/entries/2025/10/8543.SUP-19020.bugfix
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Core: The API for branches has been modified to support better performance when loading
the latest schema version of a schema in a branch.
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ public void handleAssignSchemaVersion(InternalActionContext ac, String uuid) {
// Resolve the list of references to graph schema container versions
for (SchemaReference reference : schemaReferenceList.getSchemas()) {
HibSchemaVersion version = schemaDao.fromReference(project, reference);
HibSchemaVersion assignedVersion = branch.findLatestSchemaVersion(version.getSchemaContainer());
HibSchemaVersion assignedVersion = schemaDao.findLatestVersion(branch, version.getSchemaContainer());
if (assignedVersion != null && Double.valueOf(assignedVersion.getVersion()) > Double.valueOf(version.getVersion())) {
throw error(BAD_REQUEST, "branch_error_downgrade_schema_version", version.getName(), assignedVersion.getVersion(),
version.getVersion());
Expand Down Expand Up @@ -172,7 +172,7 @@ public void handleAssignMicroschemaVersion(InternalActionContext ac, String uuid
for (MicroschemaReference reference : microschemaReferenceList.getMicroschemas()) {
HibMicroschemaVersion version = microschemaDao.fromReference(tx.getProject(ac), reference);

HibMicroschemaVersion assignedVersion = branch.findLatestMicroschemaVersion(version.getSchemaContainer());
HibMicroschemaVersion assignedVersion = microschemaDao.findLatestVersion(branch, version.getSchemaContainer());
if (assignedVersion != null && Double.valueOf(assignedVersion.getVersion()) > Double.valueOf(version.getVersion())) {
throw error(BAD_REQUEST, "branch_error_downgrade_microschema_version", version.getName(), assignedVersion.getVersion(),
version.getVersion());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,7 @@ private Transactional<HibSchemaVersion> findLatestSchemaVersion(NodeMeshEventMod
HibSchema schema = tx.schemaDao().findByUuid(message.getSchema().getUuid());
HibProject project = tx.projectDao().findByUuid(message.getProject().getUuid());
if (project != null) {
return tx.branchDao().findByUuid(project, message.getBranchUuid()).findLatestSchemaVersion(schema);
return tx.schemaDao().findLatestVersion(tx.branchDao().findByUuid(project, message.getBranchUuid()), schema);
} else {
log.warn("Could not find the project for UUID {" + message.getProject().getUuid() + "}");
return getSchemaVersion(message.getSchema(), tx);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -284,22 +284,6 @@ default TypeInfo getTypeInfo() {
*/
HibBranch setProject(HibProject project);

/**
* Find the latest schema version which is assigned to the branch which matches the provided schema container
*
* @param schemaContainer
* @return Found version or null if no version could be found.
*/
HibSchemaVersion findLatestSchemaVersion(HibSchema schemaContainer);

/**
* Find the latest microschema version which is assigned to the branch which matches the provided microschema container
*
* @param schemaContainer
* @return Found version or null if no version could be found.
*/
HibMicroschemaVersion findLatestMicroschemaVersion(HibMicroschema schemaContainer);

/**
* Add the given tag to the list of tags for this branch.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -86,4 +86,12 @@ default HibMicroschemaVersion fromReference(HibProject project, MicroschemaRefer
* @return
*/
HibMicroschemaVersion fromReference(HibProject project, MicroschemaReference reference, HibBranch branch);

/**
* Find the latest microschema version of the microschema, that is assigned to the branch
* @param branch branch
* @param microschema microschema
* @return latest microschema version or null
*/
HibMicroschemaVersion findLatestVersion(HibBranch branch, HibMicroschema microschema);
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import com.gentics.mesh.context.InternalActionContext;
import com.gentics.mesh.core.data.Bucket;
import com.gentics.mesh.core.data.HibNodeFieldContainer;
import com.gentics.mesh.core.data.branch.HibBranch;
import com.gentics.mesh.core.data.node.HibNode;
import com.gentics.mesh.core.data.project.HibProject;
import com.gentics.mesh.core.data.schema.HibSchema;
Expand Down Expand Up @@ -165,4 +166,12 @@ default HibSchema create(SchemaVersionModel schema, HibUser creator) throws Mesh
default Result<? extends HibNodeFieldContainer> findDraftFieldContainers(HibSchemaVersion version, String branchUuid) {
return findDraftFieldContainers(version, branchUuid, -1);
}

/**
* Find the latest schema version of the schema, that is assigned to the branch
* @param branch branch
* @param schema schema
* @return latest schema version or null
*/
HibSchemaVersion findLatestVersion(HibBranch branch, HibSchema schema);
}
Original file line number Diff line number Diff line change
Expand Up @@ -359,11 +359,12 @@ default void delete(HibProject project, HibBranch branch) {
@Override
default HibJob assignSchemaVersion(HibBranch branch, HibUser user, HibSchemaVersion schemaVersion, EventQueueBatch batch) {
JobDao jobDao = Tx.get().jobDao();
SchemaDao schemaDao = Tx.get().schemaDao();
HibBranchSchemaVersion edge = findBranchSchemaEdge(branch, schemaVersion);
HibJob job = null;
// Don't remove any existing edge. Otherwise the edge properties are lost
if (edge == null) {
HibSchemaVersion currentVersion = branch.findLatestSchemaVersion(schemaVersion.getSchemaContainer());
HibSchemaVersion currentVersion = schemaDao.findLatestVersion(branch, schemaVersion.getSchemaContainer());
edge = connectToSchemaVersion(branch, schemaVersion);
// Enqueue the schema migration for each found schema version
edge.setActive(true);
Expand All @@ -383,11 +384,12 @@ default HibJob assignSchemaVersion(HibBranch branch, HibUser user, HibSchemaVers
@Override
default HibJob assignMicroschemaVersion(HibBranch branch, HibUser user, HibMicroschemaVersion microschemaVersion, EventQueueBatch batch) {
JobDao jobDao = Tx.get().jobDao();
MicroschemaDao microschemaDao = Tx.get().microschemaDao();
HibBranchMicroschemaVersion edge = findBranchMicroschemaEdge(branch, microschemaVersion);
HibJob job = null;
// Don't remove any existing edge. Otherwise the edge properties are lost
if (edge == null) {
HibMicroschemaVersion currentVersion = branch.findLatestMicroschemaVersion(microschemaVersion.getSchemaContainer());
HibMicroschemaVersion currentVersion = microschemaDao.findLatestVersion(branch, microschemaVersion.getSchemaContainer());
edge = connectToMicroschemaVersion(branch, microschemaVersion);
// Enqueue the job so that the worker can process it later on
edge.setActive(true);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -305,7 +305,7 @@ default HibNodeFieldContainer createFieldContainer(HibNode node, String language

@Override
default HibNodeFieldContainer createFirstFieldContainerForNode(HibNode node, String languageTag, HibBranch branch, HibUser editor) {
HibSchemaVersion version = branch.findLatestSchemaVersion(node.getSchemaContainer());
HibSchemaVersion version = Tx.get().schemaDao().findLatestVersion(branch, node.getSchemaContainer());
HibNodeFieldContainer newContainer = createPersisted(node.getUuid(), version, null, languageTag, new VersionNumber(), editor);
connectFieldContainer(node, newContainer, branch, languageTag, true);

Expand All @@ -318,7 +318,7 @@ default HibNodeFieldContainer createFieldContainer(HibNode node, String language
// We need create a new container with no reference, if an original is not provided.
// So use the latest version available to use.
HibSchemaVersion version = Objects.isNull(original)
? branch.findLatestSchemaVersion(node.getSchemaContainer())
? Tx.get().schemaDao().findLatestVersion(branch, node.getSchemaContainer())
: getSchemaContainerVersion(original) ;
return createFieldContainer(version, node, languageTag, branch, editor, original, handleDraftEdge);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -273,7 +273,7 @@ default HibMicroschemaVersion fromReference(HibProject project, MicroschemaRefer
HibMicroschemaVersion foundVersion = null;

if (branch != null) {
foundVersion = branch.findLatestMicroschemaVersion(container);
foundVersion = findLatestVersion(branch, container);
} else if (version != null) {
foundVersion = findVersionByRev(container, version);
} else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -950,7 +950,7 @@ default HibNode create(HibProject project, InternalActionContext ac, EventQueueB
if (!isEmpty(schemaInfo.getSchema().getUuid())) {
// 2. Use schema reference by uuid first
HibSchema schemaByUuid = schemaDao.loadObjectByUuid(project, ac, schemaInfo.getSchema().getUuid(), READ_PERM);
HibSchemaVersion schemaVersion = branch.findLatestSchemaVersion(schemaByUuid);
HibSchemaVersion schemaVersion = schemaDao.findLatestVersion(branch, schemaByUuid);
if (schemaVersion == null) {
throw error(BAD_REQUEST, "schema_error_schema_not_linked_to_branch", schemaByUuid.getName(), branch.getName(), project.getName());
}
Expand All @@ -964,7 +964,7 @@ default HibNode create(HibProject project, InternalActionContext ac, EventQueueB
String schemaName = schemaByName.getName();
String schemaUuid = schemaByName.getUuid();
if (userDao.hasPermission(requestUser, schemaByName, READ_PERM)) {
HibSchemaVersion schemaVersion = branch.findLatestSchemaVersion(schemaByName);
HibSchemaVersion schemaVersion = schemaDao.findLatestVersion(branch, schemaByName);
if (schemaVersion == null) {
throw error(BAD_REQUEST, "schema_error_schema_not_linked_to_branch", schemaByName.getName(), branch.getName(),
project.getName());
Expand Down Expand Up @@ -1476,6 +1476,7 @@ default boolean update(HibProject project, HibNode node, InternalActionContext a
}
}
ContentDao contentDao = tx.contentDao();
SchemaDao schemaDao = tx.schemaDao();
HibBranch branch = tx.getBranch(ac, node.getProject());
HibNodeFieldContainer latestDraftVersion = contentDao.getFieldContainer(node, languageTag, branch, DRAFT);

Expand Down Expand Up @@ -1524,8 +1525,7 @@ default boolean update(HibProject project, HibNode node, InternalActionContext a

// Make sure the container was already migrated. Otherwise the update can't proceed.
HibSchemaVersion schemaVersion = contentDao.getSchemaContainerVersion(latestDraftVersion);
if (!latestDraftVersion.getSchemaContainerVersion().equals(branch.findLatestSchemaVersion(schemaVersion
.getSchemaContainer()))) {
if (!latestDraftVersion.getSchemaContainerVersion().equals(schemaDao.findLatestVersion(branch, schemaVersion.getSchemaContainer()))) {
throw error(BAD_REQUEST, "node_error_migration_incomplete");
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.gentics.mesh.core.data.dao.impl;

import static com.gentics.mesh.core.data.util.HibClassConverter.toGraph;
import static com.gentics.mesh.core.data.relationship.GraphRelationships.HAS_MICROSCHEMA_VERSION;

import java.util.Map;
import java.util.Optional;
Expand All @@ -24,6 +25,7 @@
import com.gentics.mesh.core.data.project.HibProject;
import com.gentics.mesh.core.data.root.MicroschemaRoot;
import com.gentics.mesh.core.data.root.RootVertex;
import com.gentics.mesh.core.data.schema.GraphFieldSchemaContainerVersion;
import com.gentics.mesh.core.data.schema.HibMicroschema;
import com.gentics.mesh.core.data.schema.HibMicroschemaVersion;
import com.gentics.mesh.core.data.schema.Microschema;
Expand All @@ -35,6 +37,7 @@
import com.gentics.mesh.core.result.Result;
import com.gentics.mesh.core.result.TraversalResult;
import com.gentics.mesh.parameter.PagingParameters;
import com.gentics.mesh.util.VersionUtil;

import dagger.Lazy;

Expand Down Expand Up @@ -215,4 +218,16 @@ public Class<? extends HibMicroschemaVersion> getVersionPersistenceClass() {
public Result<? extends HibMicronode> findMicronodes(HibMicroschemaVersion version) {
return toGraph(version).findMicronodes();
}

@Override
public HibMicroschemaVersion findLatestVersion(HibBranch branch, HibMicroschema microschema) {
return toGraph(microschema).out(HAS_MICROSCHEMA_VERSION, MicroschemaContainerVersionImpl.class).stream()
.filter(version -> {
return microschema.getUuid().equals(version.getSchemaContainer().getUuid());
}).sorted((o1, o2) -> {
String v1 = o1.getProperty(GraphFieldSchemaContainerVersion.VERSION_PROPERTY_KEY);
String v2 = o2.getProperty(GraphFieldSchemaContainerVersion.VERSION_PROPERTY_KEY);
return VersionUtil.compareVersions(v2, v1);
}).findFirst().orElse(null);
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.gentics.mesh.core.data.dao.impl;

import static com.gentics.mesh.core.data.util.HibClassConverter.toGraph;
import static com.gentics.mesh.core.data.relationship.GraphRelationships.HAS_SCHEMA_VERSION;

import java.util.Objects;
import java.util.Optional;
Expand All @@ -26,6 +27,7 @@
import com.gentics.mesh.core.data.project.HibProject;
import com.gentics.mesh.core.data.root.RootVertex;
import com.gentics.mesh.core.data.root.SchemaRoot;
import com.gentics.mesh.core.data.schema.GraphFieldSchemaContainerVersion;
import com.gentics.mesh.core.data.schema.HibSchema;
import com.gentics.mesh.core.data.schema.HibSchemaVersion;
import com.gentics.mesh.core.data.schema.Schema;
Expand All @@ -43,6 +45,7 @@
import com.gentics.mesh.core.result.TraversalResult;
import com.gentics.mesh.event.Assignment;
import com.gentics.mesh.parameter.PagingParameters;
import com.gentics.mesh.util.VersionUtil;

import dagger.Lazy;

Expand Down Expand Up @@ -231,4 +234,17 @@ protected RootVertex<Schema> getRoot() {
public Class<? extends HibSchemaVersion> getVersionPersistenceClass() {
return SchemaContainerVersionImpl.class;
}

@Override
public HibSchemaVersion findLatestVersion(HibBranch branch, HibSchema schema) {
SchemaContainerVersionImpl graphVersion = toGraph(schema)
.out(HAS_SCHEMA_VERSION, SchemaContainerVersionImpl.class).stream().filter(version -> {
return schema.getUuid().equals(version.getSchemaContainer().getUuid());
}).sorted((o1, o2) -> {
String v1 = o1.getProperty(GraphFieldSchemaContainerVersion.VERSION_PROPERTY_KEY);
String v2 = o2.getProperty(GraphFieldSchemaContainerVersion.VERSION_PROPERTY_KEY);
return VersionUtil.compareVersions(v2, v1);
}).findFirst().orElse(null);
return graphVersion;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,6 @@
import com.gentics.mesh.core.data.project.HibProject;
import com.gentics.mesh.core.data.root.BranchRoot;
import com.gentics.mesh.core.data.root.impl.BranchRootImpl;
import com.gentics.mesh.core.data.schema.GraphFieldSchemaContainerVersion;
import com.gentics.mesh.core.data.schema.HibFieldSchemaElement;
import com.gentics.mesh.core.data.schema.HibFieldSchemaVersionElement;
import com.gentics.mesh.core.data.schema.HibMicroschema;
Expand All @@ -59,7 +58,6 @@
import com.gentics.mesh.core.result.TraversalResult;
import com.gentics.mesh.event.EventQueueBatch;
import com.gentics.mesh.parameter.PagingParameters;
import com.gentics.mesh.util.VersionUtil;
import com.syncleus.ferma.traversals.VertexTraversal;

import io.reactivex.Observable;
Expand Down Expand Up @@ -220,33 +218,6 @@ public boolean contains(HibSchemaVersion schemaVersion) {
}).findAny().isPresent();
}

@Override
public HibSchemaVersion findLatestSchemaVersion(HibSchema schemaContainer) {
SchemaContainerVersionImpl graphVersion = out(HAS_SCHEMA_VERSION, SchemaContainerVersionImpl.class)
.stream()
.filter(version -> {
return schemaContainer.getUuid().equals(version.getSchemaContainer().getUuid());
}).sorted((o1, o2) -> {
String v1 = o1.getProperty(GraphFieldSchemaContainerVersion.VERSION_PROPERTY_KEY);
String v2 = o2.getProperty(GraphFieldSchemaContainerVersion.VERSION_PROPERTY_KEY);
return VersionUtil.compareVersions(v2, v1);
}).findFirst().orElse(null);
return graphVersion;
}

@Override
public HibMicroschemaVersion findLatestMicroschemaVersion(HibMicroschema schemaContainer) {
return out(HAS_MICROSCHEMA_VERSION, MicroschemaContainerVersionImpl.class)
.stream()
.filter(version -> {
return schemaContainer.getUuid().equals(version.getSchemaContainer().getUuid());
}).sorted((o1, o2) -> {
String v1 = o1.getProperty(GraphFieldSchemaContainerVersion.VERSION_PROPERTY_KEY);
String v2 = o2.getProperty(GraphFieldSchemaContainerVersion.VERSION_PROPERTY_KEY);
return VersionUtil.compareVersions(v2, v1);
}).findFirst().orElse(null);
}

@Override
public Result<? extends HibSchemaVersion> findAllSchemaVersions() {
return out(HAS_SCHEMA_VERSION, SchemaContainerVersionImpl.class);
Expand Down