Prasyarat
Client telah diinisialisasi. Untuk informasi selengkapnya, lihat Inisialisasi client Tablestore.
Tabel data telah dibuat dan data telah ditulis ke dalamnya. Untuk informasi selengkapnya, lihat Buat tabel data.
Deskripsi
Kontainer Condition berisi kondisi keberadaan baris (rowExistenceExpectation), kondisi kolom (columnCondition), atau keduanya. Teruskan kondisi yang telah dikonfigurasi ke setCondition() pada RowPutChange, RowUpdateChange, atau RowDeleteChange. Perubahan baris ini juga dapat dimasukkan dalam permintaan BatchWriteRow. Jika kondisi tidak terpenuhi, server mengembalikan error dan baris tetap tidak berubah.
rowChange.setCondition(condition)
new SingleColumnValueCondition(columnName, operator, columnValue)
new CompositeColumnValueCondition(logicOperator)
Contoh berikut memperbarui baris dengan primary key row1 pada tabel condition_demo hanya jika baris tersebut ada. Jika tidak, server mengembalikan error.
PrimaryKey primaryKey = PrimaryKeyBuilder.createPrimaryKeyBuilder()
.addPrimaryKeyColumn("id", PrimaryKeyValue.fromString("row1"))
.build();
RowUpdateChange rowUpdateChange = new RowUpdateChange("condition_demo", primaryKey);
rowUpdateChange.put("col1", ColumnValue.fromString("changed_val1"));
Condition condition = new Condition();
condition.setRowExistenceExpectation(RowExistenceExpectation.EXPECT_EXIST);
rowUpdateChange.setCondition(condition);
client.updateRow(new UpdateRowRequest(rowUpdateChange));
Parameter
Pembaruan kondisional dapat digunakan sebagai kondisi untuk operasi PutRow, UpdateRow, DeleteRow, dan BatchWriteRow.
'condition' => [
'row_existence' => <RowExistenceExpectation>
'column_condition' => <ColumnCondition>
] Jika hanya kondisi keberadaan baris yang ditentukan, Anda dapat menggunakan struktur singkat berikut.
'condition' => <RowExistenceExpectation> Struktur untuk SingleColumnValueCondition dan CompositeColumnValueCondition adalah sebagai berikut.
Struktur SingleColumnValueCondition
[
'column_name' => '<string>',
'value' => <ColumnValue>,
'comparator' => <ComparatorType>,
'pass_if_missing' => true || false,
'latest_version_only' => true || false
]Struktur CompositeColumnValueFilter
[
'logical_operator' => <LogicalOperator>
'sub_conditions' => [
<ColumnCondition>,
<ColumnCondition>,
<ColumnCondition>,
// kondisi lainnya
]
]Parameter | Deskripsi |
row_existence | Saat Anda memodifikasi tabel data, sistem terlebih dahulu memeriksa kondisi keberadaan baris. Jika kondisi tidak terpenuhi, modifikasi gagal dan error dilaporkan. Kondisi keberadaan baris mencakup IGNORE, EXPECT_EXIST, dan EXPECT_NOT_EXIST. Kondisi-kondisi ini direpresentasikan oleh RowExistenceExpectationConst::CONST_IGNORE, RowExistenceExpectationConst::CONST_EXPECT_EXIST, dan RowExistenceExpectationConst::CONST_EXPECT_NOT_EXIST.
|
column_name | Nama kolom. |
value | Nilai yang akan dibandingkan dengan nilai kolom. Formatnya adalah [Value, Type]. Tipe dapat berupa INTEGER, STRING (dienkode UTF-8), BINARY, BOOLEAN, atau DOUBLE. Tipe-tipe ini direpresentasikan oleh ColumnTypeConst::CONST_INTEGER, ColumnTypeConst::CONST_STRING, ColumnTypeConst::CONST_BINARY, ColumnTypeConst::CONST_BOOLEAN, dan ColumnTypeConst::CONST_DOUBLE. Tipe untuk BINARY wajib ditentukan. Tipe untuk nilai lainnya bersifat opsional. Jika tipe bukan BINARY, Anda dapat menggunakan format singkat Value. |
comparator | Operator relasional yang digunakan untuk membandingkan nilai kolom. Untuk informasi selengkapnya tentang tipe ini, lihat ComparatorType. Operator relasional mencakup EQUAL (=), NOT_EQUAL (!=), GREATER_THAN (>), GREATER_EQUAL (>=), LESS_THAN (<), dan LESS_EQUAL (<=). Operator-operator ini direpresentasikan oleh ComparatorTypeConst::CONST_EQUAL, ComparatorTypeConst::CONST_NOT_EQUAL, ComparatorTypeConst::CONST_GREATER_THAN, ComparatorTypeConst::CONST_GREATER_EQUAL, ComparatorTypeConst::CONST_LESS_THAN, dan ComparatorTypeConst::CONST_LESS_EQUAL. |
logical_operator | Operator logika yang digunakan untuk menggabungkan beberapa kondisi. Untuk informasi selengkapnya tentang tipe ini, lihat LogicalOperator. Operator logika mencakup NOT, AND, dan OR. Operator-operator ini direpresentasikan oleh LogicalOperatorConst::CONST_NOT, LogicalOperatorConst::CONST_AND, dan LogicalOperatorConst::CONST_OR. Jumlah sub-kondisi yang dapat Anda tambahkan bergantung pada operator logika.
|
pass_if_missing | Menentukan apakah pemeriksaan kondisi lolos jika kolom tidak ada dalam suatu baris. Tipe datanya boolean. Nilai default-nya true. Artinya, jika kolom tidak ada dalam baris, pemeriksaan kondisi lolos dan baris memenuhi kondisi pembaruan. Jika Anda mengatur pass_if_missing ke false, pemeriksaan kondisi gagal jika kolom tidak ada dalam baris. Baris tersebut tidak memenuhi kondisi pembaruan. |
latest_version_only | Menentukan apakah hanya versi terbaru dari nilai kolom yang digunakan untuk perbandingan jika kolom memiliki beberapa versi. Tipe datanya boolean. Nilai default-nya true. Artinya, jika kolom memiliki beberapa versi, hanya versi terbaru yang digunakan untuk perbandingan. Jika Anda mengatur latest_version_only ke false dan kolom memiliki beberapa versi, semua versi nilai kolom digunakan untuk perbandingan. Dalam kasus ini, jika salah satu versi memenuhi kondisi, pemeriksaan kondisi lolos dan baris memenuhi kondisi pembaruan. |
Contoh
Lakukan operasi data berdasarkan kondisi keberadaan baris
Contoh berikut menunjukkan cara melakukan operasi pada suatu baris berdasarkan primary key-nya dan kondisi keberadaan baris yang ditentukan.
$request = array (
'tables' => array (
array (
'table_name' => 'my_table',
'rows' => array (
array (
// Operasi PUT
'operation_type' => OperationTypeConst::CONST_PUT,
// Mengharapkan baris tidak ada. Kondisi terpenuhi jika baris tidak ada.
'condition' => RowExistenceExpectationConst::CONST_EXPECT_NOT_EXIST,
'primary_key' => array (
array('PK1', 'PrimaryKey'),
array('PK2', 11),
),
'attribute_columns' => array (
array('attr1', 'Tablestore'),
array('attr2', 128)
)
),
array (
// Operasi UPDATE
'operation_type' => OperationTypeConst::CONST_UPDATE,
// Mengharapkan baris ada. Kondisi terpenuhi jika baris ada.
'condition' => RowExistenceExpectationConst::CONST_EXPECT_EXIST,
'primary_key' => array (
array('PK1', 'PrimaryKey'),
array('PK2', 22),
),
'update_of_attribute_columns'=> array(
'PUT' => array (
array('attr1', 'OTS'),
array('attr2', 256)
)
)
),
array (
// Operasi DELETE
'operation_type' => OperationTypeConst::CONST_DELETE,
// Abaikan. Tidak dilakukan pengecekan keberadaan.
'condition' => RowExistenceExpectationConst::CONST_IGNORE,
'primary_key' => array (
array('PK1', 'PrimaryKey'),
array('PK2', 33),
)
),
)
)
)
);
$response = $otsClient->batchWriteRow ($request);
// Proses respons untuk setiap tabel
foreach ($response['tables'] as $tableData) {
print "Handling table {$tableData['table_name']} ...\n";
// Proses hasil PutRow untuk tabel ini
$putRows = $tableData['rows'];
foreach ($putRows as $rowData) {
if ($rowData['is_ok']) {
// Operasi penulisan berhasil
print "Capacity Unit Consumed: {$rowData['consumed']['capacity_unit']['write']}\n";
} else {
// Terjadi error
print "Error: {$rowData['error']['code']} {$rowData['error']['message']}\n";
}
}
}Lakukan operasi data berdasarkan kondisi baris dan kolom
Contoh berikut menunjukkan cara melakukan operasi berdasarkan kondisi baris dan kolom.
$request = array (
'tables' => array (
array (
'table_name' => 'MyTable',
'rows' => array (
// Struktur SingleColumnValueCondition
array (
// Operasi UPDATE
'operation_type' => OperationTypeConst::CONST_UPDATE,
'condition' => array (
'row_existence' => RowExistenceExpectationConst::CONST_EXPECT_EXIST,
// attr2 != 256
'column_condition' => array (
'column_name' => 'attr2',
'value' => 256,
'comparator' => ComparatorTypeConst::CONST_NOT_EQUAL
)
),
'primary_key' => array (
array('PK1', 'PrimaryKey'),
array('PK2', 11)
),
// Gunakan attribute_columns/put untuk menentukan kolom yang akan diperbarui atau ditambahkan.
'update_of_attribute_columns'=> array(
'PUT' => array (
array('attr1', 'OTS'),
array('attr2', 128)
)
)
),
// Struktur CompositeColumnValueFilter
array (
// Operasi UPDATE
'operation_type' => OperationTypeConst::CONST_UPDATE,
'condition' => array (
'row_existence' => RowExistenceExpectationConst::CONST_EXPECT_EXIST,
// attr1 = 'Tablestore' dan attr2 >= 256
'column_condition' => array (
'logical_operator' => LogicalOperatorConst::CONST_AND,
'sub_conditions' => array (
array (
'column_name' => 'attr2',
'value' => 256,
'comparator' => ComparatorTypeConst::CONST_GREATER_EQUAL
),
array (
'column_name' => 'attr1',
'value' => 'Tablestore',
'comparator' => ComparatorTypeConst::CONST_EQUAL
)
)
)
),
'primary_key' => array (
array('PK1', 'pkValue'),
array('PK2', 22)
),
'update_of_attribute_columns'=> array(
'PUT' => array (),
// Gunakan attribute_columns/delete untuk menentukan kolom yang akan dihapus.
'DELETE_ALL' => array(
'attr1',
'attr2'
)
)
),
)
)
)
);
$response = $otsClient->batchWriteRow ($request);
// Proses respons untuk setiap tabel
foreach ($response['tables'] as $tableData) {
print "Handling table {$tableData['table_name']} ...\n";
// Proses hasil PutRow untuk tabel ini
$putRows = $tableData['rows'];
foreach ($putRows as $rowData) {
if ($rowData['is_ok']) {
// Operasi penulisan berhasil
print "Capacity Unit Consumed: {$rowData['consumed']['capacity_unit']['write']}\n";
} else {
// Terjadi error
print "Error: {$rowData['error']['code']} {$rowData['error']['message']}\n";
}
}
}Gunakan kondisi untuk menerapkan optimistic locking dan menambah nilai kolom
Contoh berikut menunjukkan cara membuat kondisi untuk menerapkan optimistic locking dan menambah nilai kolom.
// Baca satu baris data.
$request = [
'table_name' => 'MyTable',
'primary_key' => [ // Primary key.
['PK0', 123],
['PK1', 'abc']
],
'max_versions' => 1
];
$response = $otsClient->getRow ($request);
$columnMap = getColumnValueAsMap($response['attribute_columns']);
$col0Value = $columnMap['col0'][0][1];
// Perbarui kolom col0 secara kondisional untuk menambah nilainya sebesar 1.
$request = [
'table_name' => 'MyTable',
'condition' => [
'row_existence' => RowExistenceExpectationConst::CONST_EXPECT_EXIST,
'column_condition' => [ // Jika kondisi terpenuhi, perbarui data.
'column_name' => 'col0',
'value' => $col0Value,
'comparator' => ComparatorTypeConst::CONST_EQUAL
]
],
'primary_key' => [ // Primary key.
['PK0', 123],
['PK1', 'abc']
],
'update_of_attribute_columns'=> [
'PUT' => [
['col0', $col0Value+1]
]
]
];
$response = $otsClient->updateRow ($request);Untuk contoh kode lainnya, lihat PutRow@GitHub, UpdateRow@GitHub, DeleteRow@GitHub, dan BatchWriteRow@GitHub.