Tablestore SDK for Java は、サーバー側で列の値に基づいて行をフィルターしたり、属性列のスライスを返したりすることで、クライアントに転送されるデータ量を削減します。
前提条件
Tablestore SDK for Java をインストールし、クライアントを初期化します。
説明
フィルターは、各行が読み取られた後にサーバーで実行され、条件に一致する行のみを返します。フィルタリングは読み取り後に行われるため、スキャンされる行数は減りませんが、ネットワーク経由で送信されるデータ量は削減されます。
SingleRowQueryCriteria、RangeRowQueryCriteria、MultiRowQueryCriteria、または RangeIteratorParameter で setFilter を呼び出してフィルターを設定します。 次のフィルタータイプが利用可能です。
-
SingleColumnValueFilter :1つの属性列の値を、関係演算子を使用してターゲット値と比較します。
-
SingleColumnValueRegexFilter: 正規表現を使用して
String型のプロパティ列から部分文字列を抽出し、ターゲット型に変換して、ターゲット値と比較します。 -
CompositeColumnValueFilter は、論理演算子 (
AND、OR、またはNOT) を使用して複数のフィルターを組み合わせます。複合フィルターは最大 32 個のサブ条件をサポートします。 -
ColumnPaginationFilter :列の値を評価せずに、オフセットとリミットに基づいて属性列を返します。
new SingleColumnValueFilter(columnName, operator, columnValue)
new SingleColumnValueRegexFilter(columnName, regexRule, operator, columnValue)
new CompositeColumnValueFilter(logicOperator)
new ColumnPaginationFilter(limit, offset)
次の例では、SingleColumnValueFilter を使用して、filter_demo テーブルから col1 列が val1 と等しい行を読み取ります。
RangeRowQueryCriteria criteria = new RangeRowQueryCriteria("filter_demo");
PrimaryKeyBuilder startBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
startBuilder.addPrimaryKeyColumn("id", PrimaryKeyValue.fromString("row1"));
criteria.setInclusiveStartPrimaryKey(startBuilder.build());
PrimaryKeyBuilder endBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
endBuilder.addPrimaryKeyColumn("id", PrimaryKeyValue.INF_MAX);
criteria.setExclusiveEndPrimaryKey(endBuilder.build());
criteria.setMaxVersions(1);
// フィルターを構築:col1 == "val1"
SingleColumnValueFilter filter = new SingleColumnValueFilter(
"col1",
SingleColumnValueFilter.CompareOperator.EQUAL,
ColumnValue.fromString("val1"));
criteria.setFilter(filter);
GetRangeResponse response = client.getRange(new GetRangeRequest(criteria));
System.out.println("Matched rows: " + response.getRows().size());
パラメーター
単一列の値フィルター
SingleColumnValueFilter のコンストラクターには、以下のパラメーターが含まれています。
|
名前 |
型 |
説明 |
|
columnName (必須) |
String |
評価する属性列の名前。 |
|
operator (必須) |
CompareOperator |
関係演算子。有効値:
|
|
columnValue (必須) |
ColumnValue |
比較に使用する値。 |
|
passIfMissing (任意) |
boolean |
対象の列を含まない行を返すかどうか。 デフォルトは 対象の列を含まない行を除外するには、 |
|
latestVersionsOnly (任意) |
boolean |
カラムの最新バージョンのみを評価するかどうか。デフォルトは
|
正規表現フィルター
SingleColumnValueRegexFilter のコンストラクターには、次のパラメーターが含まれています。 正規表現ルールを指定する場合、対象の属性列は String 型である必要があります。
|
名前 |
型 |
説明 |
|
columnName (必須) |
String |
評価する属性列の名前。 |
|
regexRule (任意) |
RegexRule |
正規表現のマッチングルール。指定した場合、フィルターは文字列型の列値から部分文字列を抽出し、その部分文字列を変換してから評価します。省略した場合、フィルターは元の列値を評価します。このルールには、以下のパラメーターがあります。
|
|
operator (必須) |
CompareOperator |
評価演算子。有効な値: |
|
columnValue (任意) |
ColumnValue |
比較値。このパラメーターは、6 つの関係演算子では必須であり、 |
|
latestVersionsOnly (任意) |
boolean |
属性列の最新バージョンのみを評価するかどうかを指定します。デフォルト値: |
複合フィルター
CompositeColumnValueFilter のコンストラクターとサブフィルターリストには、次のパラメーターが含まれています。addFilter() を呼び出してサブフィルターを追加します。複合フィルターは、最大 32 個のサブ条件をサポートします。
|
名前 |
型 |
説明 |
|
type (必須) |
LogicOperator |
論理演算子。有効値:
|
|
filters (必須) |
List<ColumnValueFilter> |
論理演算子によって結合されるサブフィルター。各サブフィルターは |
属性列のページネーションフィルター
ColumnPaginationFilter のコンストラクターには、次のパラメーターが含まれています。offset が省略された場合、デフォルト値は 0 です。
|
名前 |
型 |
説明 |
|
limit (必須) |
int |
返す属性列の数。0より大きい値を指定します。 |
|
offset (任意) |
int |
返す最初の属性列のゼロベースのオフセット。値は 0 以上である必要があります。デフォルト値: |
例
正規表現で抽出した部分文字列の比較
列の値から部分文字列を抽出し、その部分文字列をターゲット値と比較するには、RegexRule を使用します。 次の例では、col2 に正規表現 1([a-z]+)5 を適用し、最初のグループをキャプチャして、文字列 aaa と比較します。
RangeRowQueryCriteria criteria = new RangeRowQueryCriteria("filter_demo");
PrimaryKeyBuilder startBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
startBuilder.addPrimaryKeyColumn("id", PrimaryKeyValue.fromString("row1"));
criteria.setInclusiveStartPrimaryKey(startBuilder.build());
PrimaryKeyBuilder endBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
endBuilder.addPrimaryKeyColumn("id", PrimaryKeyValue.INF_MAX);
criteria.setExclusiveEndPrimaryKey(endBuilder.build());
criteria.setMaxVersions(1);
// 正規表現 "1([a-z]+)5" は最初のグループをキャプチャします。castType=VT_STRING は結果を文字列として比較します。
RegexRule regexRule = new RegexRule("1([a-z]+)5", RegexRule.CastType.VT_STRING);
SingleColumnValueRegexFilter filter = new SingleColumnValueRegexFilter(
"col2",
regexRule,
SingleColumnValueRegexFilter.CompareOperator.EQUAL,
ColumnValue.fromString("aaa"));
criteria.setFilter(filter);
GetRangeResponse response = client.getRange(new GetRangeRequest(criteria));
System.out.println("Matched rows: " + response.getRows().size());
論理演算子による複数フィルターの組み合わせ
複数のフィルターを論理演算子で組み合わせるには、CompositeColumnValueFilter を使用します。 複合フィルターはネストできます。 次の例では、条件 (col1 == "val1" OR cast<String>(reg(col2)) >= "aaa") AND col3 == "val3" を構築します。
RangeRowQueryCriteria criteria = new RangeRowQueryCriteria("filter_demo");
PrimaryKeyBuilder startBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
startBuilder.addPrimaryKeyColumn("id", PrimaryKeyValue.fromString("row1"));
criteria.setInclusiveStartPrimaryKey(startBuilder.build());
PrimaryKeyBuilder endBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
endBuilder.addPrimaryKeyColumn("id", PrimaryKeyValue.INF_MAX);
criteria.setExclusiveEndPrimaryKey(endBuilder.build());
criteria.setMaxVersions(1);
// リーフ 1: col1 == "val1"
SingleColumnValueFilter leaf1 = new SingleColumnValueFilter(
"col1",
SingleColumnValueFilter.CompareOperator.EQUAL,
ColumnValue.fromString("val1"));
// リーフ 2: cast<String>(reg(col2)) >= "aaa"
RegexRule regexRule = new RegexRule("1([a-z]+)5", RegexRule.CastType.VT_STRING);
SingleColumnValueRegexFilter leaf2 = new SingleColumnValueRegexFilter(
"col2",
regexRule,
SingleColumnValueRegexFilter.CompareOperator.GREATER_EQUAL,
ColumnValue.fromString("aaa"));
// OR の組み合わせ: リーフ 1 OR リーフ 2
CompositeColumnValueFilter orFilter = new CompositeColumnValueFilter(
CompositeColumnValueFilter.LogicOperator.OR);
orFilter.addFilter(leaf1);
orFilter.addFilter(leaf2);
// リーフ 3: col3 == "val3"
SingleColumnValueFilter leaf3 = new SingleColumnValueFilter(
"col3",
SingleColumnValueFilter.CompareOperator.EQUAL,
ColumnValue.fromString("val3"));
// AND の組み合わせ: (リーフ 1 OR リーフ 2) AND リーフ 3
CompositeColumnValueFilter andFilter = new CompositeColumnValueFilter(
CompositeColumnValueFilter.LogicOperator.AND);
andFilter.addFilter(orFilter);
andFilter.addFilter(leaf3);
criteria.setFilter(andFilter);
GetRangeResponse response = client.getRange(new GetRangeRequest(criteria));
System.out.println("Matched rows: " + response.getRows().size());
欠損列と履歴バージョンの評価の制御
setPassIfMissing は対象列を含まない行が返されるかどうかを制御し、setLatestVersionsOnly は履歴バージョンも評価されるかどうかを制御します。
SingleColumnValueFilter filter = new SingleColumnValueFilter(
"col1",
SingleColumnValueFilter.CompareOperator.EQUAL,
ColumnValue.fromString("val1"));
// col1 を含まない行をスキップします (デフォルト:そのような行を含める)。
filter.setPassIfMissing(false);
// すべてのバージョンを評価し、いずれかのバージョンが一致すれば行を返します (デフォルト:最新バージョンのみを評価)。
filter.setLatestVersionsOnly(false);
criteria.setFilter(filter);
属性列のページ取得
ColumnPaginationFilter を使用して、オフセットから始まる指定された数の属性列を返します。次の例では、最初の属性列をスキップし、次の 2 つの属性列を返します。
PrimaryKey primaryKey = PrimaryKeyBuilder.createPrimaryKeyBuilder()
.addPrimaryKeyColumn("id", PrimaryKeyValue.fromString("row1"))
.build();
SingleRowQueryCriteria criteria = new SingleRowQueryCriteria("filter_demo", primaryKey);
criteria.setMaxVersions(1);
criteria.setFilter(new ColumnPaginationFilter(2, 1));
GetRowResponse response = client.getRow(new GetRowRequest(criteria));
for (Column column : response.getRow().getColumns()) {
System.out.println(column.getName());
}