/*
* Licensed to CRATE Technology GmbH ("Crate") under one or more contributor
* license agreements. See the NOTICE file distributed with this work for
* additional information regarding copyright ownership. Crate licenses
* this file to you under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. You may
* obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
* However, if you have executed another commercial license agreement
* with Crate these terms will supersede the license and you may use the
* software solely pursuant to the terms of the relevant commercial agreement.
*/
package io.crate.planner.node.dml;
import io.crate.analyze.symbol.Symbol;
import io.crate.metadata.Reference;
import io.crate.planner.PlanVisitor;
import io.crate.planner.UnnestablePlan;
import org.elasticsearch.common.Nullable;
import org.elasticsearch.common.lucene.uid.Versions;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
public class UpsertById extends UnnestablePlan {
/**
* A single update item.
*/
public static class Item {
private final String index;
private final String id;
private final String routing;
private long version = Versions.MATCH_ANY;
@Nullable
private final Symbol[] updateAssignments;
@Nullable
private Object[] insertValues;
Item(String index,
String id,
String routing,
@Nullable Symbol[] updateAssignments,
@Nullable Long version,
@Nullable Object[] insertValues) {
this.index = index;
this.id = id;
this.routing = routing;
this.updateAssignments = updateAssignments;
if (version != null) {
this.version = version;
}
this.insertValues = insertValues;
}
public String index() {
return index;
}
public String id() {
return id;
}
public String routing() {
return routing;
}
public long version() {
return version;
}
@Nullable
public Symbol[] updateAssignments() {
return updateAssignments;
}
@Nullable
public Object[] insertValues() {
return insertValues;
}
}
private final UUID jobId;
private final boolean partitionedTable;
private final int numBulkResponses;
private final List<Item> items;
private final int executionPhaseId;
private final List<Integer> bulkIndices;
@Nullable
private final String[] updateColumns;
@Nullable
private final Reference[] insertColumns;
public UpsertById(UUID jobId,
int executionPhaseId,
boolean partitionedTable,
int numBulkResponses,
List<Integer> bulkIndices,
@Nullable String[] updateColumns,
@Nullable Reference[] insertColumns) {
this.jobId = jobId;
this.partitionedTable = partitionedTable;
this.numBulkResponses = numBulkResponses;
this.bulkIndices = bulkIndices;
this.updateColumns = updateColumns;
this.insertColumns = insertColumns;
this.items = new ArrayList<>();
this.executionPhaseId = executionPhaseId;
}
public UpsertById(UUID jobId,
int executionPhaseId,
boolean partitionedTable,
int numBulkResponses,
@Nullable String[] updateColumns,
@Nullable Reference[] insertColumns) {
this(jobId, executionPhaseId, partitionedTable, numBulkResponses, new ArrayList<Integer>(),
updateColumns, insertColumns);
}
@Nullable
public String[] updateColumns() {
return updateColumns;
}
@Nullable
public Reference[] insertColumns() {
return insertColumns;
}
public boolean isPartitionedTable() {
return partitionedTable;
}
public int numBulkResponses() {
return numBulkResponses;
}
public List<Integer> bulkIndices() {
return bulkIndices;
}
public void add(String index,
String id,
String routing,
Symbol[] updateAssignments,
@Nullable Long version) {
add(index, id, routing, updateAssignments, version, null);
}
public void add(String index,
String id,
String routing,
Symbol[] updateAssignments,
@Nullable Long version,
@Nullable Object[] insertValues) {
items.add(new Item(index, id, routing, updateAssignments, version, insertValues));
}
public List<Item> items() {
return items;
}
public int executionPhaseId() {
return executionPhaseId;
}
@Override
public <C, R> R accept(PlanVisitor<C, R> visitor, C context) {
return visitor.visitUpsertById(this, context);
}
@Override
public UUID jobId() {
return jobId;
}
}