Tablestore では、フィルターを使用して、指定した条件に基づいてクエリ結果を絞り込むことができます。このトピックでは、Go SDK でフィルターを使用する方法について説明します。
前提条件
フィルターのタイプ
Tablestore は、次の 3 種類のフィルターをサポートしています。
単一列の値フィルター (SingleColumnCondition):単一の属性列の値が条件を満たすかどうかをチェックします。
単一列の値の正規表現フィルター (SingleColumnValueRegexFilter):文字列型の属性列に正規表現を適用して部分文字列を抽出し、キャストしてから、条件を満たすかどうかをチェックします。
複合フィルター (CompositeColumnCondition):複数のフィルター条件を組み合わせてデータをフィルタリングします。
単一列の値フィルター
func NewSingleColumnCondition(columnName string, comparator ComparatorType, value interface{}) *SingleColumnConditionサンプルコード
このサンプルコードは、プライマリキーが [`row1`, `row3`) の範囲にある行に対して範囲クエリを実行し、その結果をフィルター処理して、`col1` 属性列の値が val1 に等しい行のみを返す方法を示しています。
func SingleValueFilterSample(client *tablestore.TableStoreClient) {
// クエリ条件を構築します。
rangeRowQueryCriteria := &tablestore.RangeRowQueryCriteria{}
rangeRowQueryCriteria.TableName = "test_table"
// 開始プライマリキーを設定します。
startPK := new(tablestore.PrimaryKey)
startPK.AddPrimaryKeyColumn("id", "row1")
rangeRowQueryCriteria.StartPrimaryKey = startPK
// 終了プライマリキーを設定します。このキーを持つ行は結果に含まれません。
endPK := new(tablestore.PrimaryKey)
endPK.AddPrimaryKeyColumn("id", "row3")
rangeRowQueryCriteria.EndPrimaryKey = endPK
// クエリするバージョン数を設定します。
rangeRowQueryCriteria.MaxVersion = 1
// col1 が "val1" に等しいというフィルターを構築します。
singleColumnCondition := tablestore.NewSingleColumnCondition("col1", tablestore.CT_EQUAL, "val1")
rangeRowQueryCriteria.Filter = singleColumnCondition
// GetRange 操作を呼び出してデータをクエリします。
getRangeRequest := new(tablestore.GetRangeRequest)
getRangeRequest.RangeRowQueryCriteria = rangeRowQueryCriteria
getRangeResponse, err := client.GetRange(getRangeRequest)
// 応答を処理します。
if err != nil {
fmt.Println("Range get failed with error: ", err)
} else {
fmt.Printf("* RequestId: %s \n", getRangeResponse.RequestId)
fmt.Printf("* Read CU Cost: %d \n", getRangeResponse.ConsumedCapacityUnit.Read)
fmt.Printf("* Write CU Cost: %d \n", getRangeResponse.ConsumedCapacityUnit.Write)
fmt.Println("* Rows Data:")
for _, row := range getRangeResponse.Rows {
fmt.Printf("PrimaryKey: %v; Columns: ", row.PrimaryKey.PrimaryKeys)
for _, column := range row.Columns {
fmt.Printf("%v ", column)
}
fmt.Printf("\n")
}
}
}指定された属性列が含まれていない行をフィルターで除外するには、`FilterIfMissing` パラメーターを `true` に設定します。
singleColumnCondition.FilterIfMissing = true属性列の最新のデータバージョンのみを評価するには、`LatestVersionOnly` パラメーターを `true` に設定します。
singleColumnCondition.LatestVersionOnly = true
単一列の値の正規表現フィルター
このフィルターは、文字列型の属性列にのみ適用できます。
func NewSingleColumnValueRegexFilter(columnName string, comparator ComparatorType, rule *ValueTransferRule, value interface{}) *SingleColumnConditionサンプルコード
次のサンプルコードは、プライマリキーが [`row1`, `row3`) の範囲にある行に対して範囲クエリを実行する方法を示しています。次に、正規表現フィルターを適用して、`col1` 属性列の値が式 1([a-z]+)5 に一致し、キャプチャされた部分文字列が aaa である行のみを返します。
func SingleRegexFilterSample(client *tablestore.TableStoreClient) {
// クエリ条件を構築します。
rangeRowQueryCriteria := &tablestore.RangeRowQueryCriteria{}
rangeRowQueryCriteria.TableName = "test_table"
// 開始プライマリキーを設定します。
startPK := new(tablestore.PrimaryKey)
startPK.AddPrimaryKeyColumn("id", "row1")
rangeRowQueryCriteria.StartPrimaryKey = startPK
// 終了プライマリキーを設定します。このキーを持つ行は結果に含まれません。
endPK := new(tablestore.PrimaryKey)
endPK.AddPrimaryKeyColumn("id", "row3")
rangeRowQueryCriteria.EndPrimaryKey = endPK
// クエリするバージョン数を設定します。
rangeRowQueryCriteria.MaxVersion = 1
// フィルターを構築します:cast<String>(reg(col1)) == "aaa"
valueTransferRule := tablestore.NewValueTransferRule("1([a-z]+)5", tablestore.Variant_STRING)
singleColumnValueRegexFilter := tablestore.NewSingleColumnValueRegexFilter("col1", tablestore.CT_EQUAL, valueTransferRule, "aaa")
rangeRowQueryCriteria.Filter = singleColumnValueRegexFilter
// GetRange 操作を呼び出してデータをクエリします。
getRangeRequest := new(tablestore.GetRangeRequest)
getRangeRequest.RangeRowQueryCriteria = rangeRowQueryCriteria
getRangeResponse, err := client.GetRange(getRangeRequest)
// 応答を処理します。
if err != nil {
fmt.Println("Range get failed with error: ", err)
} else {
fmt.Printf("* RequestId: %s \n", getRangeResponse.RequestId)
fmt.Printf("* Read CU Cost: %d \n", getRangeResponse.ConsumedCapacityUnit.Read)
fmt.Printf("* Write CU Cost: %d \n", getRangeResponse.ConsumedCapacityUnit.Write)
fmt.Println("* Rows Data:")
for _, row := range getRangeResponse.Rows {
fmt.Printf("PrimaryKey: %v; Columns: ", row.PrimaryKey.PrimaryKeys)
for _, column := range row.Columns {
fmt.Printf("%v ", column)
}
fmt.Printf("\n")
}
}
}複合フィルター
複合フィルターは最大 32 個の条件を組み合わせることができます。
func NewCompositeColumnCondition(lo LogicalOperator) *CompositeColumnConditionサンプルコード
このサンプルコードは、プライマリキーが [`row1`, `row3`) の範囲にある行に対して範囲クエリを実行し、複合フィルターを使用して結果を絞り込む方法を示しています。
func CompositeFilterSample(client *tablestore.TableStoreClient) {
// クエリ条件を構築します。
rangeRowQueryCriteria := &tablestore.RangeRowQueryCriteria{}
rangeRowQueryCriteria.TableName = "test_table"
// 開始プライマリキーを設定します。
startPK := new(tablestore.PrimaryKey)
startPK.AddPrimaryKeyColumn("id", "row1")
rangeRowQueryCriteria.StartPrimaryKey = startPK
// 終了プライマリキーを設定します。このキーを持つ行は結果に含まれません。
endPK := new(tablestore.PrimaryKey)
endPK.AddPrimaryKeyColumn("id", "row3")
rangeRowQueryCriteria.EndPrimaryKey = endPK
// クエリするバージョン数を設定します。
rangeRowQueryCriteria.MaxVersion = 1
// 最初の単一列の値フィルターを構築します:col1 == "val1"
singleColumnCondition1 := tablestore.NewSingleColumnCondition("col1", tablestore.CT_EQUAL, "val1")
// 単一列の正規表現フィルターを構築します:cast<String>(reg(col2)) == "aaa"
valueTransferRule := tablestore.NewValueTransferRule("1([a-z]+)5", tablestore.Variant_STRING)
singleColumnValueRegexFilter2 := tablestore.NewSingleColumnValueRegexFilter("col2", tablestore.CT_EQUAL, valueTransferRule, "aaa")
// 最初の複合フィルターを構築します:col1 == "val1" OR cast<String>(reg(col2)) == "aaa"
compositeCondition1 := tablestore.NewCompositeColumnCondition(tablestore.LO_OR)
compositeCondition1.AddFilter(singleColumnCondition1)
compositeCondition1.AddFilter(singleColumnValueRegexFilter2)
// 2 番目の単一列の値フィルターを構築します:col3 == "val3"
singleColumnCondition3 := tablestore.NewSingleColumnCondition("col3", tablestore.CT_EQUAL, "val3")
// 最終的な複合フィルターを構築します:(col1 == "val1" OR cast<String>(reg(col2)) == "aaa") AND col3 == "val3"
compositeCondition2 := tablestore.NewCompositeColumnCondition(tablestore.LO_AND)
compositeCondition2.AddFilter(compositeCondition1)
compositeCondition2.AddFilter(singleColumnCondition3)
// フィルターをクエリに追加します。
rangeRowQueryCriteria.Filter = compositeCondition2
// GetRange 操作を呼び出してデータをクエリします。
getRangeRequest := new(tablestore.GetRangeRequest)
getRangeRequest.RangeRowQueryCriteria = rangeRowQueryCriteria
getRangeResponse, err := client.GetRange(getRangeRequest)
// 応答を処理します。
if err != nil {
fmt.Println("Range get failed with error: ", err)
} else {
fmt.Printf("* RequestId: %s \n", getRangeResponse.RequestId)
fmt.Printf("* Read CU Cost: %d \n", getRangeResponse.ConsumedCapacityUnit.Read)
fmt.Printf("* Write CU Cost: %d \n", getRangeResponse.ConsumedCapacityUnit.Write)
fmt.Println("* Rows Data:")
for _, row := range getRangeResponse.Rows {
fmt.Printf("PrimaryKey: %v; Columns: ", row.PrimaryKey.PrimaryKeys)
for _, column := range row.Columns {
fmt.Printf("%v ", column)
}
fmt.Printf("\n")
}
}
}