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

com.sap.cds.ql.impl.UpdateBuilder Maven / Gradle / Ivy

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

import static com.sap.cds.impl.builder.model.StructuredTypeImpl.structuredType;
import static com.sap.cds.impl.builder.model.StructuredTypeRefImpl.typeRef;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.TreeSet;
import java.util.function.Function;
import java.util.stream.Stream;

import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.sap.cds.impl.builder.model.ExpressionImpl;
import com.sap.cds.impl.parser.token.Jsonizer;
import com.sap.cds.ql.StructuredType;
import com.sap.cds.ql.StructuredTypeRef;
import com.sap.cds.ql.Update;
import com.sap.cds.ql.cqn.CqnModifier;
import com.sap.cds.ql.cqn.CqnPredicate;
import com.sap.cds.ql.cqn.CqnStructuredTypeRef;
import com.sap.cds.ql.cqn.CqnUpdate;
import com.sap.cds.util.DataUtils;

public class UpdateBuilder> implements Update {

	private final T entity;
	private final List> entries = new ArrayList<>();
	private CqnPredicate where;

	private UpdateBuilder(T entity) {
		this.entity = entity;
	}

	public static > UpdateBuilder entity(T entity) {
		return new UpdateBuilder<>(entity);
	}

	public static UpdateBuilder> entity(CqnStructuredTypeRef ref) {
		return new UpdateBuilder<>(structuredType(ref));
	}

	public static UpdateBuilder> copy(CqnUpdate update) {
		return copy(update, ExpressionVisitor.COPY);
	}

	public static UpdateBuilder> copy(CqnUpdate update, CqnModifier modifier) {
		StructuredTypeRef ref = ExpressionVisitor.copy(update.ref(), modifier);
		UpdateBuilder> copy = entity(ref);
		copy.where = modifier.where(ExpressionVisitor.copy(update.where(), modifier));

		return copy.entries(update.entries());
	}

	@Override
	public UpdateBuilder data(Map data) {
		this.entries.clear();
		addEntry(data);

		return this;
	}

	@Override
	public UpdateBuilder data(String key, Object value) {
		return data(Collections.singletonMap(key, value));
	}

	@Override
	public UpdateBuilder entries(Iterable> entries) {
		this.entries.clear();
		entries.forEach(this::addEntry);

		return this;
	}

	private void addEntry(Map entry) {
		entries.add(DataUtils.copyMap(entry));
	}

	@Override
	@SuppressWarnings("unchecked")
	public UpdateBuilder where(Function pred) {
		where(pred.apply((T) entity.getType()));

		return this;
	}

	@Override
	public UpdateBuilder matching(Map values) {
		return where(ExpressionImpl.matching(values));
	}

	@Override
	public UpdateBuilder byId(Object idValue) {
		return where(ExpressionImpl.byId(idValue));
	}

	@Override
	public UpdateBuilder where(CqnPredicate pred) {
		where = pred;

		return this;
	}

	@Override
	public CqnStructuredTypeRef ref() {
		return typeRef(entity);
	}

	@Override
	public Optional where() {
		return Optional.ofNullable(where);
	}

	@Override
	public String toJson() {
		Jsonizer cqn = Jsonizer.object("entity", ref());
		if (entries.size() == 1) {
			ObjectNode dta = cqn.object("data");
			entries.get(0).forEach(dta::putPOJO);
		} else {
			ArrayNode dta = cqn.array("entries");
			entries.forEach(dta::addPOJO);
		}
		where().ifPresent(w -> {
			ArrayNode whereArr = cqn.array("where");
			w.tokens().forEach(whereArr::addPOJO);
		});

		return Jsonizer.object("UPDATE", cqn).toJson();
	}

	@Override
	public String toString() {
		return toJson();
	}

	@Override
	public Map data() {
		return entries.get(0);
	}

	@Override
	public List> entries() {
		return entries; // NOSONAR
	}

	@Override
	public Stream elements() {
		Set all = new TreeSet<>();
		for (Map map : entries) {
			all.addAll(map.keySet());
		}

		return all.stream();
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy