Di Tablestore, Anda dapat menggunakan filter untuk mempersempit hasil kueri berdasarkan kondisi tertentu. Topik ini menjelaskan cara menggunakan filter dalam Go SDK.
Prasyarat
Jenis filter
Tablestore mendukung tiga jenis filter berikut.
Filter nilai kolom tunggal (SingleColumnCondition): Memeriksa apakah nilai satu kolom atribut memenuhi suatu kondisi.
Filter regex nilai kolom tunggal (SingleColumnValueRegexFilter): Menerapkan ekspresi reguler pada kolom atribut bertipe string untuk mengekstraksi dan mengonversi substring, lalu memeriksa apakah hasilnya memenuhi suatu kondisi.
Filter komposit (CompositeColumnCondition): Menggabungkan beberapa kondisi filter untuk menyaring data.
Filter nilai kolom tunggal
func NewSingleColumnCondition(columnName string, comparator ComparatorType, value interface{}) *SingleColumnConditionKode contoh
Kode contoh berikut menunjukkan cara menjalankan kueri rentang untuk baris dengan kunci primary dalam rentang [`row1`, `row3`), lalu memfilter hasilnya agar hanya mengembalikan baris di mana kolom atribut col1 sama dengan val1.
func SingleValueFilterSample(client *tablestore.TableStoreClient) {
// Buat kriteria kueri.
rangeRowQueryCriteria := &tablestore.RangeRowQueryCriteria{}
rangeRowQueryCriteria.TableName = "test_table"
// Tetapkan kunci primary awal.
startPK := new(tablestore.PrimaryKey)
startPK.AddPrimaryKeyColumn("id", "row1")
rangeRowQueryCriteria.StartPrimaryKey = startPK
// Tetapkan kunci primary akhir. Baris dengan kunci ini tidak termasuk dalam hasil.
endPK := new(tablestore.PrimaryKey)
endPK.AddPrimaryKeyColumn("id", "row3")
rangeRowQueryCriteria.EndPrimaryKey = endPK
// Tetapkan jumlah versi yang akan dikueri.
rangeRowQueryCriteria.MaxVersion = 1
// Buat filter di mana col1 sama dengan "val1".
singleColumnCondition := tablestore.NewSingleColumnCondition("col1", tablestore.CT_EQUAL, "val1")
rangeRowQueryCriteria.Filter = singleColumnCondition
// Panggil operasi GetRange untuk mengkueri data.
getRangeRequest := new(tablestore.GetRangeRequest)
getRangeRequest.RangeRowQueryCriteria = rangeRowQueryCriteria
getRangeResponse, err := client.GetRange(getRangeRequest)
// Proses respons.
if err != nil {
fmt.Println("Kueri rentang gagal dengan error: ", err)
} else {
fmt.Printf("* RequestId: %s \n", getRangeResponse.RequestId)
fmt.Printf("* Biaya CU Baca: %d \n", getRangeResponse.ConsumedCapacityUnit.Read)
fmt.Printf("* Biaya CU Tulis: %d \n", getRangeResponse.ConsumedCapacityUnit.Write)
fmt.Println("* Data Baris:")
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")
}
}
}Untuk memfilter baris yang tidak memiliki kolom atribut yang ditentukan, atur parameter
FilterIfMissingketrue.singleColumnCondition.FilterIfMissing = trueUntuk hanya mengevaluasi versi data terbaru dari kolom atribut, atur parameter
LatestVersionOnlyketrue.singleColumnCondition.LatestVersionOnly = true
Filter regex nilai kolom tunggal
Filter ini hanya dapat diterapkan pada kolom atribut bertipe string.
func NewSingleColumnValueRegexFilter(columnName string, comparator ComparatorType, rule *ValueTransferRule, value interface{}) *SingleColumnConditionKode contoh
Kode contoh berikut menunjukkan cara melakukan kueri rentang untuk baris dengan kunci primary dalam rentang [`row1`, `row3`). Filter ekspresi reguler kemudian diterapkan untuk hanya mengembalikan baris di mana nilai kolom atribut col1 cocok dengan ekspresi 1([a-z]+)5 dan substring yang ditangkap adalah aaa.
func SingleRegexFilterSample(client *tablestore.TableStoreClient) {
// Buat kriteria kueri.
rangeRowQueryCriteria := &tablestore.RangeRowQueryCriteria{}
rangeRowQueryCriteria.TableName = "test_table"
// Tetapkan kunci primary awal.
startPK := new(tablestore.PrimaryKey)
startPK.AddPrimaryKeyColumn("id", "row1")
rangeRowQueryCriteria.StartPrimaryKey = startPK
// Tetapkan kunci primary akhir. Baris dengan kunci ini tidak termasuk dalam hasil.
endPK := new(tablestore.PrimaryKey)
endPK.AddPrimaryKeyColumn("id", "row3")
rangeRowQueryCriteria.EndPrimaryKey = endPK
// Tetapkan jumlah versi yang akan dikueri.
rangeRowQueryCriteria.MaxVersion = 1
// Buat filter: 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
// Panggil operasi GetRange untuk mengkueri data.
getRangeRequest := new(tablestore.GetRangeRequest)
getRangeRequest.RangeRowQueryCriteria = rangeRowQueryCriteria
getRangeResponse, err := client.GetRange(getRangeRequest)
// Proses respons.
if err != nil {
fmt.Println("Kueri rentang gagal dengan error: ", err)
} else {
fmt.Printf("* RequestId: %s \n", getRangeResponse.RequestId)
fmt.Printf("* Biaya CU Baca: %d \n", getRangeResponse.ConsumedCapacityUnit.Read)
fmt.Printf("* Biaya CU Tulis: %d \n", getRangeResponse.ConsumedCapacityUnit.Write)
fmt.Println("* Data Baris:")
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")
}
}
}Filter komposit
Filter komposit dapat menggabungkan hingga 32 kondisi.
func NewCompositeColumnCondition(lo LogicalOperator) *CompositeColumnConditionKode contoh
Kode contoh berikut menunjukkan cara menjalankan kueri rentang untuk baris dengan kunci primary dalam rentang [`row1`, `row3`) dan menggunakan filter komposit untuk mempersempit hasilnya.
func CompositeFilterSample(client *tablestore.TableStoreClient) {
// Buat kriteria kueri.
rangeRowQueryCriteria := &tablestore.RangeRowQueryCriteria{}
rangeRowQueryCriteria.TableName = "test_table"
// Tetapkan kunci primary awal.
startPK := new(tablestore.PrimaryKey)
startPK.AddPrimaryKeyColumn("id", "row1")
rangeRowQueryCriteria.StartPrimaryKey = startPK
// Tetapkan kunci primary akhir. Baris dengan kunci ini tidak termasuk dalam hasil.
endPK := new(tablestore.PrimaryKey)
endPK.AddPrimaryKeyColumn("id", "row3")
rangeRowQueryCriteria.EndPrimaryKey = endPK
// Tetapkan jumlah versi yang akan dikueri.
rangeRowQueryCriteria.MaxVersion = 1
// Buat filter nilai kolom tunggal pertama: col1 == "val1".
singleColumnCondition1 := tablestore.NewSingleColumnCondition("col1", tablestore.CT_EQUAL, "val1")
// Buat filter regex kolom tunggal: cast<String>(reg(col2)) == "aaa".
valueTransferRule := tablestore.NewValueTransferRule("1([a-z]+)5", tablestore.Variant_STRING)
singleColumnValueRegexFilter2 := tablestore.NewSingleColumnValueRegexFilter("col2", tablestore.CT_EQUAL, valueTransferRule, "aaa")
// Buat filter komposit pertama: col1 == "val1" OR cast<String>(reg(col2)) == "aaa".
compositeCondition1 := tablestore.NewCompositeColumnCondition(tablestore.LO_OR)
compositeCondition1.AddFilter(singleColumnCondition1)
compositeCondition1.AddFilter(singleColumnValueRegexFilter2)
// Buat filter nilai kolom tunggal kedua: col3 == "val3".
singleColumnCondition3 := tablestore.NewSingleColumnCondition("col3", tablestore.CT_EQUAL, "val3")
// Buat filter komposit akhir: (col1 == "val1" OR cast<String>(reg(col2)) == "aaa") AND col3 == "val3".
compositeCondition2 := tablestore.NewCompositeColumnCondition(tablestore.LO_AND)
compositeCondition2.AddFilter(compositeCondition1)
compositeCondition2.AddFilter(singleColumnCondition3)
// Tambahkan filter ke kueri.
rangeRowQueryCriteria.Filter = compositeCondition2
// Panggil operasi GetRange untuk mengkueri data.
getRangeRequest := new(tablestore.GetRangeRequest)
getRangeRequest.RangeRowQueryCriteria = rangeRowQueryCriteria
getRangeResponse, err := client.GetRange(getRangeRequest)
// Proses respons.
if err != nil {
fmt.Println("Kueri rentang gagal dengan error: ", err)
} else {
fmt.Printf("* RequestId: %s \n", getRangeResponse.RequestId)
fmt.Printf("* Biaya CU Baca: %d \n", getRangeResponse.ConsumedCapacityUnit.Read)
fmt.Printf("* Biaya CU Tulis: %d \n", getRangeResponse.ConsumedCapacityUnit.Write)
fmt.Println("* Data Baris:")
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")
}
}
}