All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.sap.cds.util.ProjectionProcessor Maven / Gradle / Ivy

There is a newer version: 3.8.0
Show newest version
/*******************************************************************
 * © 2021 SAP SE or an SAP affiliate company. All rights reserved. *
 *******************************************************************/
package com.sap.cds.util;

import static com.sap.cds.util.CqnStatementUtils.getEntries;

import com.sap.cds.ql.cqn.CqnAnalyzer;
import com.sap.cds.ql.cqn.CqnStatement;
import com.sap.cds.reflect.CdsEntity;
import com.sap.cds.reflect.CdsModel;
import com.sap.cds.util.ProjectionResolver.BiPredicate;

public class ProjectionProcessor {

	private final DataUtils dataUtils;
	private final CqnAnalyzer cqnAnalyzer;
	private final CdsModel model;

	private ProjectionProcessor(CdsModel model, CqnAnalyzer cqnAnalyzer, DataUtils dataUtils) {
		this.model = model;
		this.cqnAnalyzer = cqnAnalyzer;
		this.dataUtils = dataUtils;
	}

	public static ProjectionProcessor create(CdsModel model, CqnAnalyzer cqnAnalyzer, DataUtils dataUtils) {
		return new ProjectionProcessor(model, cqnAnalyzer, dataUtils);
	}

	/**
	 * Removes virtual elements from payload of insert, update and upsert statements
	 * and resolves the projection.
	 * 
	 * @param        type
	 * @param statement original statement
	 * @return resolved statement
	 */
	public  T resolve(T statement) {
		CdsEntity target = cqnAnalyzer.analyze(statement.ref()).targetEntity();
		dataUtils.removeVirtualElements(target, getEntries(statement));

		return resolveProjection(statement);
	}

	private  T resolveProjection(T cqn) {
		BiPredicate isTable = (prev, stmnt) -> cqnAnalyzer.analyze(stmnt.ref()).targetEntity()
				.getAnnotationValue("cds.persistence.table", false);
		return ProjectionResolver.create(model, cqn).condition(isTable).resolveAll().getResolvedStatement();
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy