CypherQueryHelper.java

package de.dlr.shepard.util;

import de.dlr.shepard.neo4Core.orderBy.OrderByAttribute;

public class CypherQueryHelper {

	public enum Neighborhood {
		EVERYTHING, OUTGOING, ESSENTIAL
	}

	private CypherQueryHelper() {
	}

	public static String getObjectPart(String variable, String type, boolean hasName) {
		if (hasName)
			return getObjectPartWithName(variable, type);
		else
			return getObjectPartWithoutName(variable, type);
	}

	private static String getObjectPartWithName(String variable, String type) {
		var namePart = "{ name : $name, deleted: FALSE }";
		var result = String.format("(%s:%s %s)", variable, type, namePart);
		return result;
	}

	private static String getObjectPartWithoutName(String variable, String type) {
		var namePart = "{ deleted: FALSE }";
		var result = String.format("(%s:%s %s)", variable, type, namePart);
		return result;
	}

	public static String getPaginationPart() {
		return "SKIP $offset LIMIT $size";
	}

	public static String getReturnPart(String entity) {
		return getReturnPart(entity, Neighborhood.EVERYTHING);
	}

	public static String getReturnPart(String entity, Neighborhood neighborhood) {
		String match = switch (neighborhood) {
		case EVERYTHING -> "path=(%s)-[*0..1]-(n) WHERE n.deleted = FALSE OR n.deleted IS NULL";
		case OUTGOING -> "path=(%s)-[*0..1]->(n) WHERE n.deleted = FALSE OR n.deleted IS NULL";
		case ESSENTIAL -> "path=(%s)-[*0..1]->(n) WHERE n:Permission OR n:User";
		};
		var result = "MATCH " + String.format(match, entity) + " RETURN "
				+ String.format("%s, nodes(path), relationships(path)", entity);
		return result;
	}

	public static String getReturnPartLight(String entity) {
		return "RETURN " + entity;
	}

	public static String getOrderByPart(String variable, OrderByAttribute orderByAttribute, Boolean orderDesc) {
		String ret;
		boolean isString = orderByAttribute.isString();
		if (!isString)
			ret = "ORDER BY " + variable + "." + orderByAttribute;
		else
			ret = "ORDER BY toLower(" + variable + "." + orderByAttribute + ")";
		if (orderDesc != null && orderDesc)
			ret = ret + " DESC";
		return ret;
	}

	public static String getShepardIdPart(String variable, long shepardId) {
		return variable + "." + Constants.SHEPARD_ID + " = " + shepardId;
	}

	public static String getReadableByQuery(String variable, String username) {
		String ret = String.format(
				"""
						(NOT exists((%s)-[:has_permissions]->(:Permissions)) \
						OR exists((%s)-[:has_permissions]->(:Permissions)-[:readable_by|owned_by]->(:User { username: "%s" })) \
						OR exists((%s)-[:has_permissions]->(:Permissions {permissionType: "Public"})) \
						OR exists((%s)-[:has_permissions]->(:Permissions {permissionType: "PublicReadable"})) \
						OR exists((%s)-[:has_permissions]->(:Permissions)-[:readable_by_group]->(:UserGroup)<-[:is_in_group]-(:User { username: "%s"})))""",
				variable, variable, username, variable, variable, variable, username);
		return ret;
	}
}