/* * SPDX-License-Identifier: Apache-2.0 * * The OpenSearch Contributors require contributions made to * this file be licensed under the Apache-2.0 license or a * compatible open source license. */ /* * Licensed to Elasticsearch under one or more contributor * license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright * ownership. Elasticsearch 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. */ /* * Modifications Copyright OpenSearch Contributors. See * GitHub history for details. */ package org.opensearch.action.delete; import org.apache.lucene.util.RamUsageEstimator; import org.opensearch.Version; import org.opensearch.action.ActionRequestValidationException; import org.opensearch.action.CompositeIndicesRequest; import org.opensearch.action.DocWriteRequest; import org.opensearch.action.support.replication.ReplicatedWriteRequest; import org.opensearch.common.Nullable; import org.opensearch.core.common.io.stream.StreamInput; import org.opensearch.core.common.io.stream.StreamOutput; import org.opensearch.common.lucene.uid.Versions; import org.opensearch.core.common.Strings; import org.opensearch.index.VersionType; import org.opensearch.index.mapper.MapperService; import org.opensearch.core.index.shard.ShardId; import java.io.IOException; import static org.opensearch.action.ValidateActions.addValidationError; import static org.opensearch.index.seqno.SequenceNumbers.UNASSIGNED_PRIMARY_TERM; import static org.opensearch.index.seqno.SequenceNumbers.UNASSIGNED_SEQ_NO; /** * A request to delete a document from an index based on its type and id. Best created using * {@link org.opensearch.client.Requests#deleteRequest(String)}. *

* The operation requires the {@link #index()}, and {@link #id(String)} to * be set. * * @see DeleteResponse * @see org.opensearch.client.Client#delete(DeleteRequest) * @see org.opensearch.client.Requests#deleteRequest(String) * * @opensearch.internal */ public class DeleteRequest extends ReplicatedWriteRequest implements DocWriteRequest, CompositeIndicesRequest { private static final long SHALLOW_SIZE = RamUsageEstimator.shallowSizeOfInstance(DeleteRequest.class); private static final ShardId NO_SHARD_ID = null; private String id; @Nullable private String routing; private long version = Versions.MATCH_ANY; private VersionType versionType = VersionType.INTERNAL; private long ifSeqNo = UNASSIGNED_SEQ_NO; private long ifPrimaryTerm = UNASSIGNED_PRIMARY_TERM; public DeleteRequest(StreamInput in) throws IOException { this(null, in); } public DeleteRequest(@Nullable ShardId shardId, StreamInput in) throws IOException { super(shardId, in); if (in.getVersion().before(Version.V_2_0_0)) { String type = in.readString(); assert MapperService.SINGLE_MAPPING_NAME.equals(type) : "Expected [_doc] but received [" + type + "]"; } id = in.readString(); routing = in.readOptionalString(); version = in.readLong(); versionType = VersionType.fromValue(in.readByte()); ifSeqNo = in.readZLong(); ifPrimaryTerm = in.readVLong(); } public DeleteRequest() { super(NO_SHARD_ID); } /** * Constructs a new delete request against the specified index. The {@link #id(String)} * must be set. */ public DeleteRequest(String index) { super(NO_SHARD_ID); this.index = index; } /** * Constructs a new delete request against the specified index and id. * * @param index The index to get the document from * @param id The id of the document */ public DeleteRequest(String index, String id) { super(NO_SHARD_ID); this.index = index; this.id = id; } @Override public ActionRequestValidationException validate() { ActionRequestValidationException validationException = super.validate(); if (Strings.isEmpty(id)) { validationException = addValidationError("id is missing", validationException); } validationException = DocWriteRequest.validateSeqNoBasedCASParams(this, validationException); return validationException; } /** * The id of the document to delete. */ @Override public String id() { return id; } /** * Sets the id of the document to delete. */ public DeleteRequest id(String id) { this.id = id; return this; } /** * Controls the shard routing of the request. Using this value to hash the shard * and not the id. */ @Override public DeleteRequest routing(String routing) { if (routing != null && routing.length() == 0) { this.routing = null; } else { this.routing = routing; } return this; } /** * Controls the shard routing of the delete request. Using this value to hash the shard * and not the id. */ @Override public String routing() { return this.routing; } @Override public DeleteRequest version(long version) { this.version = version; return this; } @Override public long version() { return this.version; } @Override public DeleteRequest versionType(VersionType versionType) { this.versionType = versionType; return this; } /** * If set, only perform this delete request if the document was last modification was assigned this sequence number. * If the document last modification was assigned a different sequence number a * {@link org.opensearch.index.engine.VersionConflictEngineException} will be thrown. */ public long ifSeqNo() { return ifSeqNo; } /** * If set, only perform this delete request if the document was last modification was assigned this primary term. * * If the document last modification was assigned a different term a * {@link org.opensearch.index.engine.VersionConflictEngineException} will be thrown. */ public long ifPrimaryTerm() { return ifPrimaryTerm; } /** * only perform this delete request if the document was last modification was assigned the given * sequence number. Must be used in combination with {@link #setIfPrimaryTerm(long)} * * If the document last modification was assigned a different sequence number a * {@link org.opensearch.index.engine.VersionConflictEngineException} will be thrown. */ public DeleteRequest setIfSeqNo(long seqNo) { if (seqNo < 0 && seqNo != UNASSIGNED_SEQ_NO) { throw new IllegalArgumentException("sequence numbers must be non negative. got [" + seqNo + "]."); } ifSeqNo = seqNo; return this; } /** * only perform this delete request if the document was last modification was assigned the given * primary term. Must be used in combination with {@link #setIfSeqNo(long)} * * If the document last modification was assigned a different primary term a * {@link org.opensearch.index.engine.VersionConflictEngineException} will be thrown. */ public DeleteRequest setIfPrimaryTerm(long term) { if (term < 0) { throw new IllegalArgumentException("primary term must be non negative. got [" + term + "]"); } ifPrimaryTerm = term; return this; } @Override public VersionType versionType() { return this.versionType; } @Override public OpType opType() { return OpType.DELETE; } @Override public boolean isRequireAlias() { return false; } @Override public void writeTo(StreamOutput out) throws IOException { super.writeTo(out); writeBody(out); } @Override public void writeThin(StreamOutput out) throws IOException { super.writeThin(out); writeBody(out); } private void writeBody(StreamOutput out) throws IOException { if (out.getVersion().before(Version.V_2_0_0)) { out.writeString(MapperService.SINGLE_MAPPING_NAME); } out.writeString(id); out.writeOptionalString(routing()); out.writeLong(version); out.writeByte(versionType.getValue()); out.writeZLong(ifSeqNo); out.writeVLong(ifPrimaryTerm); } @Override public String toString() { return "delete {[" + index + "][" + id + "]}"; } @Override public long ramBytesUsed() { return SHALLOW_SIZE + RamUsageEstimator.sizeOf(id); } }