Table Store は、BatchGetRow、BatchWriteRow、GetRange などの複数行操作用のインターフェイスを提供します。

次の動作例は同期インターフェイスに基づいています。 非同期インターフェイスの操作方法について詳しくは、「非同期インターフェイス」をご参照ください。

BatchGetRow

バッチは、1 つ以上のテーブルから複数行のデータを読み取ります。

BatchGetRow は、複数の GetRow 操作のセットと見なすことができます。 各操作の実行、結果の返し、およびサービスキャパシティーユニットの計算はすべて独立して行われます。 多数の GetRow 操作を実行する場合と比較して、BatchGetRow を使用すると、要求の応答時間を効果的に短縮し、データ読み取り速度を向上させることができます。

BatchGetRow を使用すると、2つの考えられるエラーが発生する可能性があります。

  • ネットワークエラーなどの全体的な要求エラーがある場合。 これらのエラーは batchGetRow() の戻り値に格納されます。
  • 全体的な要求エラーはなく、個々の行にエラーが含まれている場合。 これらのエラーは対応する行の結果に格納されます。

BatchGetRowRequest req;
{
    MultiPointQueryCriterion& criterion = req.mutableCriteria().append();
    IVector<MultiPointQueryCriterion::RowKey>& rowkeys = criterion.mutableRowKeys();
    {
        MultiPointQueryCriterion::RowKey& exist = rowkeys.append();
        exist.mutableGet().append() = PrimaryKeyColumn(
            "pkey",
            PrimaryKeyValue::toStr("some key"));
        exist.mutableUserData() = &userDataForSomeKey;
    }
    {
        MultiPointQueryCriterion::RowKey& exist = rowkeys.append();
        exist.mutableGet().append() = PrimaryKeyColumn(
            "pkey",
            PrimaryKeyValue::toStr("another key"));
        exist.mutableUserData() = &userDataForAnotherKey;
    }
    criterion.mutableTable() = "YourTable";
    criterion.mutableMaxVersions().reset(1);
}
BatchGetRowResponse resp;
Optional<OTSError> res = client.batchGetRow(resp, req);
			
詳細なコードは 、『batchGetRowGitHub』をご参照ください。

BatchWriteRow

1 つ以上のテーブルから複数行のデータを一括して挿入、変更、または削除します。

BatchWriteRow は、複数の PutRow、UpdateRow および DeleteRow 操作のセットと見なすことができます。 各操作の実行、結果の戻し、およびサービスキャパシティーユニットの計算はすべて独立して行われます。

BatchWriteRow を使用すると、2 つの考えられるエラーが発生する可能性があります。

  • ネットワークタイムアウトなどの全体的な要求エラーの場合。 これらのエラーは batchWriteRow() の戻り値に格納されています。
  • 無効な主キー値など、個々の行のエラーの場合。 これらのエラーは BatchWriteRowResponse のすべての行に格納されています。

static const char kPutRow[] = "PutRow";
static const char kUpdateRow[] = "UpdateRow";
static const char kDeleteRow[] = "DeleteRow";

BatchWriteRowRequest req;
{
    // 行を挿入します。
    BatchWriteRowRequest::Put& put = req.mutablePuts().append();
    put.mutableUserData() = kPutRow;
    put.mutableGet().mutableTable() = kTableName;
    PrimaryKey& pkey = put.mutableGet().mutablePrimaryKey();
    pkey.append() = PrimaryKeyColumn(
        "pkey",
        PrimaryKeyValue::toStr("row to put"));
}
{
    // 行を更新します。
    BatchWriteRowRequest::Update& update = req.mutableUpdates().append();
    update.mutableUserData() = kUpdateRow;
    update.mutableGet().mutableTable() = kTableName;
    PrimaryKey& pkey = update.mutableGet().mutablePrimaryKey();
    pkey.append() = PrimaryKeyColumn(
        "pkey",
        PrimaryKeyValue::toStr("row to update"));
    RowUpdateChange::Update& attr = update.mutableGet().mutableUpdates().append();
    attr.mutableType() = RowUpdateChange::Update::kPut;
    attr.mutableAttrName() = "attr0";
    attr.mutableAttrValue().reset(AttributeValue::toStr("some value"));
}
{
    // 行を削除します。
    BatchWriteRowRequest::Delete& del = req.mutableDeletes().append();
    del.mutableUserData() = kDeleteRow;
    del.mutableGet().mutableTable() = kTableName;
    PrimaryKey& pkey = del.mutableGet().mutablePrimaryKey();
    pkey.append() = PrimaryKeyColumn(
        "pkey",
        PrimaryKeyValue::toStr("row to delete"));
}
BatchWriteRowResponse resp;
Optional<OTSError> res = client.batchWriteRow(resp, req);
			
詳細なコードは、『batchWriteRowGitHub』をご参照ください。

GetRange

指定された主キー範囲内のデータを読み取ります。

RangeIterator を推奨します。 RangeIterator を構築するには、

  • AsyncClient を提供する必要があります。

  • RangeQueryCriterion は PointQueryCriterion に似ていますが、RangeQueryCriterion は以下も必要とします。

    • 範囲の始点 (inclusive) と終点 (exclusive) を設定します。 通常のプライマリキー値に加えて、2 つの特別な値、「負の無限大」 (すべての通常のプライマリキー列の値より厳密に小さい値) および「正の無限大」 (すべてのプライマリキーの列値より厳密に大きい値) も使用できます。

    • 読み値をポジティブシーケンス (小さい値から大きい値へ)またはリバースシーケンス (大きい値から小さい値へ) に設定します。 デフォルト設定はポジティブシーケンスです。 ポジティブシーケンスで読むときは、始点は終点より小さくなければなりません。 リバースシーケンスでは、始点は終点より大きくなければなりません。

RangeIterator オブジェクトは、3 つのインターフェイスを提供する反復子です。

  • moveNext() は、RangeIterator オブジェクトを次の行に移動します。 新しく構築された RangeIterator オブジェクトは moveNext() を呼び出して、値を取得する必要があります。 データの読み取りに失敗した場合は、moveNext() は、戻り値にエラーを表示します。

  • valid() は、RangeIterator オブジェクトが範囲の終点に達したかどうかを示します。

  • valid() が true の場合、行オブジェクトは get() を使用して読み取ることができます。 get() によって戻される行オブジェクトの内容を削除すると、メモリの複製を回避できます。 コンテンツを削除した後、すぐ後に続く get() は削除されたコンテンツを返します。

RangeQueryCriterion query;
query.mutableTable() = "YourTable";
query.mutableMaxVersions().reset(1);
{
    PrimaryKey& start = query.mutableInclusiveStart();
    start.append() = PrimaryKeyColumn(
        "pkey",
        PrimaryKeyValue::toInfMin());
}
{
    PrimaryKey& end = query.mutableExclusiveEnd();
    end.append() = PrimaryKeyColumn(
        "pkey",
        PrimaryKeyValue::toInfMax());
}
auto_ptr<AsyncClient> aclient(AsyncClient::create(client));
RangeIterator iter(*aclient, query);
for(;;) {
    Optional<OTSError> err = iter.moveNext();
    if (err.present()) {
        // err で何かをします。
        abort();
    }
    if (! iter.valid()) {
        break;
    }
    Row& row = iter.get();
    // 行で何かをします。
}
			
詳細なコードは、『batchRangeRowGitHub』にあります。

指定された列を読み取る

Table Store は、無限の行幅をサポートしています。 通常、指定された列を読み取るだけで十分なので、行全体を読み取る必要はありません。 クエリ基準 (PointQueryCriterion、MultiPointQueryCriterion および RangeQueryCriterion) は、 mutableColumnsToGet() を提供して、読み込む必要がある列を指定します。 それらは属性列またはプライマリキー列にすることができます。 値が空の場合は、行全体が読み取られます。

指定された列が読み取り行に存在しない場合、その列は返された結果から欠落しています。 Table Store はプレースホルダを提供しません。

GetRange では、指定されたすべての列が属性列であり、範囲内の行が指定されたすべての列を見逃した場合、この行は結果に表示されません。 この行に注目する必要がある場合は、指定した列にプライマリキー列を追加してください。

指定されたバージョンを読む

各属性列には複数のバージョンを含めることができ、各バージョン番号 (タイムスタンプ) は列の値に対応します。 読み取るときに、バージョンの数 mutableMaxVersions()) とバージョンの範囲 mutableTimeRange() を定義して、読み取ることができます。

maxversions とバージョンの範囲の少なくとも一方を定義する必要があります。

  • バージョン数のみを定義した場合は、すべてのバージョンで定義されているデータ量が最新のものから順に返されます。
  • バージョンの範囲のみを定義した場合は、この範囲内のすべてのデータが返されます。
  • バージョン数とバージョン範囲の両方を定義した場合は、バージョンの範囲内で定義されているデータ量が最新のものから古いものの順に返されます。

条件付き書き込み

条件付き書き込みでは、行を書き込む前に特定の条件を確認して満たす必要があります。 Table Store は、条件チェックと書き込みの原子性を保証します。

Table Store は行の存在条件と列の値条件をサポートします。

  • 行の存在条件は、次の種類に分類できます。

    • Ignore: 行が存在するかどうかにかかわらず、これがデフォルト設定です。
    • ExpectExist: 存在すると予想します。 行が存在する場合は書き込みます。
    • ExpectNotExist: 存在しないと予想します。 行が存在しない場合は書き込みます。
  • 列値の条件は、「フィルター」と同じです。