All Products
Search
Document Center

Tablestore:Filter

Last Updated:Apr 01, 2026

Di Tablestore, Anda dapat menggunakan filter untuk mempersempit hasil kueri berdasarkan kondisi tertentu. Topik ini menjelaskan cara menggunakan filter dalam Go SDK.

Prasyarat

Inisialisasi client Tablestore

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{}) *SingleColumnCondition

Parameter

Parameter

Tipe

Deskripsi

Comparator (Wajib)

ComparatorType

Operator relasional. Nilai yang valid meliputi CT_EQUAL (sama dengan), CT_NOT_EQUAL (tidak sama dengan), CT_GREATER_THAN (lebih besar dari), CT_GREATER_EQUAL (lebih besar dari atau sama dengan), CT_LESS_THAN (kurang dari), dan CT_LESS_EQUAL (kurang dari atau sama dengan).

ColumnName (Wajib)

string

Nama kolom atribut yang akan dievaluasi.

ColumnValue (Wajib)

interface{}

Nilai yang akan dibandingkan.

FilterIfMissing (Opsional)

bool

Menentukan apakah baris yang tidak memiliki kolom atribut yang ditentukan harus difilter. Nilai default-nya false, artinya baris tersebut tetap dikembalikan.

LatestVersionOnly (Opsional)

bool

Menentukan apakah hanya versi data terbaru dari kolom atribut yang dievaluasi. Nilai default-nya false. Jika false dan terdapat beberapa versi data, kondisi dianggap terpenuhi jika salah satu versi cocok.

Kode 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 FilterIfMissing ke true.

    singleColumnCondition.FilterIfMissing = true
  • Untuk hanya mengevaluasi versi data terbaru dari kolom atribut, atur parameter LatestVersionOnly ke true.

    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{}) *SingleColumnCondition

Parameter

Parameter

Type

Deskripsi

Comparator (Wajib)

ComparatorType

Operator relasional. Nilai yang valid meliputi CT_EQUAL (sama dengan), CT_NOT_EQUAL (tidak sama dengan), CT_GREATER_THAN (lebih besar dari), CT_GREATER_EQUAL (lebih besar dari atau sama dengan), CT_LESS_THAN (kurang dari), dan CT_LESS_EQUAL (kurang dari atau sama dengan).

ColumnName (Wajib)

string

Nama kolom atribut yang akan dievaluasi.

ColumnValue (Wajib)

interface{}

Nilai yang akan dibandingkan.

TransferRule (Wajib)

ValueTransferRule

Aturan pencocokan ekspresi reguler, yang mencakup parameter berikut.

  • Regex (Wajib) string: Ekspresi reguler untuk mencocokkan substring. Panjang ekspresi tidak boleh melebihi 256 byte.

    • Ekspresi Reguler Kompatibel Perl (PCRE) dan ekspresi reguler satu byte didukung.

    • Pencocokan karakter Tionghoa dalam ekspresi reguler tidak didukung.

    • Sintaksis pengelompokan didukung. Jika ekspresi berisi capturing group, substring pertama yang cocok akan dikembalikan. Misalnya, jika nilai kolom adalah 1aaa51bbb5 dan ekspresinya adalah 1([a-z]+)5, substring yang dikembalikan adalah aaa.

  • Cast_type (Wajib) VariantType: Tipe data tujuan konversi substring yang cocok. Nilai yang valid: Variant_INTEGER (integer), Variant_DOUBLE (floating-point presisi ganda), dan Variant_STRING (string).

Kode 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) *CompositeColumnCondition

Parameter

Parameter

Tipe

Deskripsi

Operator (Wajib)

LogicalOperator

Operator logika. Nilai yang valid meliputi LO_NOT (not), LO_AND (and), dan LO_OR (or).

Filters (Wajib)

[]ColumnFilter

Filter yang akan digabungkan menggunakan operator logika. Filter ini dapat berupa filter SingleColumnCondition, filter SingleColumnValueRegexFilter, atau filter CompositeColumnCondition bersarang lainnya.

Kode 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")
        }
    }
}

Topik terkait