过滤器(Filter)可以在服务器端对读取的结果再进行一次过滤,根据Filter中的条件决定返回哪些行或列。Filter可以用于GetRow、BatchGetRow和GetRange接口。

过滤器类型

目前表格存储支持以下两种Filter,这两种Filter都是基于参考列的列值决定是否过滤某行。
  • SingleColumnValueFilter:只判断某个参考列的列值。
  • CompositeColumnValueFilter:对多个参考列的列值的判断结果进行逻辑组合,决定最终是否过滤。
说明 Filter是对读取后的结果再进行一次过滤,所以Filter中的参考列必须在读取的结果内。如果指定了要读取的列,且其中不包含参考列,则Filter无法获得这些参考列的值。当某个参考列不存在时,SingleColumnValueFilter的FilterIfMissing参数决定此时是否满足条件,即可以选择当参考列不存在时的行为。

示例

  • 构造SingleColumnValueFilter
    func GetRowWithFilter(client *tablestore.TableStoreClient, tableName string) {
        fmt.Println("begin to get row")
        pk := new(tablestore.PrimaryKey)
        pk.AddPrimaryKeyColumn("pk1", "pk1value1")
        pk.AddPrimaryKeyColumn("pk2", int64(2))
        pk.AddPrimaryKeyColumn("pk3", []byte("pk3"))
    
        //设置条件为 c1 == "浙江",FilterIfMissing = true
        condition := tablestore.NewSingleColumnCondition("c1", tablestore.ComparatorType(tablestore.CT_EQUAL), "浙江")
        condition.FilterIfMissing = true
    
        criteria := &tablestore.SingleRowQueryCriteria{
            TableName:     tableName,
            PrimaryKey:    pk,
            MaxVersion:    1,
            Filter:        condition,
        }
    
        getResp, err := client.GetRow(&tablestore.GetRowRequest{SingleRowQueryCriteria: criteria})
        if err != nil {
            fmt.Println("getrow failed with error:", err)
        } else {
            colMap := getResp.GetColumnMap()
            fmt.Println("length is ", len(colMap.Columns))
            fmt.Println("get row col0 result is ", getResp.Columns[0].ColumnName, getResp.Columns[0].Value)
        }
    }
  • 构造CompositeColumnValueFilter
    func GetRowWithCompositeColumnValueFilter(client *tablestore.TableStoreClient, tableName string) {
        fmt.Println("begin to get row")
        pk := new(tablestore.PrimaryKey)
        pk.AddPrimaryKeyColumn("pk1", "pk1value1")
        pk.AddPrimaryKeyColumn("pk2", int64(2))
        pk.AddPrimaryKeyColumn("pk3", []byte("pk3"))
    
        //设置条件为 (c1 == "浙江") AND (c2 == "杭州")
        filter := tablestore.NewCompositeColumnCondition(tablestore.LO_AND)
        filter1 := tablestore.NewSingleColumnCondition("c1", tablestore.CT_EQUAL, "浙江")
        filter2 := tablestore.NewSingleColumnCondition("c2", tablestore.CT_EQUAL, "杭州")
        filter.AddFilter(filter2)
        filter.AddFilter(filter1)
    
        criteria := &tablestore.SingleRowQueryCriteria{
            TableName:  tableName,
            PrimaryKey: pk,
            MaxVersion: 1,
            Filter:     filter,
        }
    
        getResp, err := client.GetRow(&tablestore.GetRowRequest{SingleRowQueryCriteria: criteria})
        if err != nil {
            fmt.Println("getrow failed with error:", err)
        } else {
            colMap := getResp.GetColumnMap()
            fmt.Println("length is ", len(colMap.Columns))
            fmt.Println("get row col0 result is ", getResp.Columns[0].ColumnName, getResp.Columns[0].Value)
        }
    }