blob: 9fcda1586a53f900ab7ad11140b0ed9f15afedb5 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF 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.
*/
package org.apache.cassandra;
import java.nio.ByteBuffer;
import org.apache.cassandra.config.CFMetaData;
import org.apache.cassandra.db.*;
import org.apache.cassandra.db.rows.*;
import org.apache.cassandra.db.partitions.*;
import org.apache.cassandra.utils.FBUtilities;
/**
* Convenience object to create updates to a single partition.
*
* This is not unlike RowUpdateBuilder except that it allows to create update to multiple rows more easily.
* It is also aimed at unit tests so favor convenience over efficiency.
*/
public class UpdateBuilder
{
private final PartitionUpdate.SimpleBuilder updateBuilder;
private Row.SimpleBuilder currentRow;
private UpdateBuilder(PartitionUpdate.SimpleBuilder updateBuilder)
{
this.updateBuilder = updateBuilder;
}
public static UpdateBuilder create(CFMetaData metadata, Object... partitionKey)
{
return new UpdateBuilder(PartitionUpdate.simpleBuilder(metadata, partitionKey));
}
public UpdateBuilder withTimestamp(long timestamp)
{
updateBuilder.timestamp(timestamp);
if (currentRow != null)
currentRow.timestamp(timestamp);
return this;
}
public UpdateBuilder newRow(Object... clustering)
{
currentRow = updateBuilder.row(clustering);
return this;
}
public UpdateBuilder add(String column, Object value)
{
assert currentRow != null;
currentRow.add(column, value);
return this;
}
public PartitionUpdate build()
{
return updateBuilder.build();
}
public IMutation makeMutation()
{
Mutation m = updateBuilder.buildAsMutation();
return updateBuilder.metadata().isCounter()
? new CounterMutation(m, ConsistencyLevel.ONE)
: m;
}
public void apply()
{
makeMutation().apply();
}
public void applyUnsafe()
{
assert !updateBuilder.metadata().isCounter() : "Counters have currently no applyUnsafe() option";
updateBuilder.buildAsMutation().applyUnsafe();
}
}