布尔字段上的 Aerospike 过滤器表达式不起作用
Aerospike filter expression on boolean fields not working
我在 Java 中编写了以下 Aerospike 过滤器。 Field1
和 Field2
都是布尔值。出于某种原因,“filterByField.ValidBoth”条件不会产生 true,尽管记录符合条件。
因为它是一个布尔值,我使用 1 表示真,0 表示假。
我是不是漏掉了什么?
public Exp getFilterByFieldFilter(FilterByField filterByField) {
if (filterByField == null || "".equals(filterByField)) {
return Exp.val(true);
}
if (filterByField == filterByField.All) {
return Exp.val(true);
} else if (filterByField == filterByField.ValidBoth) {
return Exp.and(Exp.eq(Exp.intBin("Field1"), Exp.val(0)),
Exp.eq(Exp.intBin("Field2"), Exp.val(0)));
}
}
从我通过 AQL 从数据库结果中看到的,那些未设置为 true 的内容不会反映在结果集中。
我是否应该将我的过滤器写成另一种检查这种情况的方法?如果是这样,那情况会是什么样子?
我尝试检查 Exp.val(NULL) 但出现错误。
这是我通过 AQL 设置的数据库结果
[
{
"PK": "1",
"Name": "ABC",
"Field1": 1,
"Field2": 1
},
{
"PK": "2",
"Name": "EFG",
"Field1": 1
},
{
"PK": "3",
"Name": "XYZ",
}
]
如果 bin 名称 Field1 和 Field2 包含布尔值,那么您的表达式应该以这种方式构造(无论所需的逻辑是什么):
Exp.eq(Exp.boolBin("Field1"), Exp.val(false))
我测试了下面的构造,似乎对我有用:
WritePolicy wPolicy = new WritePolicy();
Bin b1 = new Bin("Field1", Value.get(0));
Bin b2 = new Bin("Field2", Value.get(0));
Bin b3 = new Bin("Data", Value.get("data"));
wPolicy.recordExistsAction = RecordExistsAction.REPLACE;
client.put(wPolicy, key, b1, b2, b3);
//client.put(wPolicy, key, b1, b3);
Exp condFilter = Exp.and(
Exp.eq(Exp.intBin("Field1"),Exp.val(0) ),
Exp.eq(Exp.intBin("Field2"),Exp.val(0) )
);
Policy policy = new Policy();
policy.filterExp = Exp.build(condFilter);
Record record = client.get(policy, key);
System.out.println("Read back the record.");
System.out.println("Record values are:");
System.out.println(record);
//Get record without filter condition
record = client.get(null, key);
System.out.println(record);
有效条件:
Read back the record.
Record values are:
(gen:18),(exp:0),(bins:(Field1:0),(Field2:0),(Data:data))
(gen:18),(exp:0),(bins:(Field1:0),(Field2:0),(Data:data))
无效条件(无 Field2 bin):
Read back the record.
Record values are:
null
(gen:19),(exp:0),(bins:(Field1:0),(Data:data))
我在 Java 中编写了以下 Aerospike 过滤器。 Field1
和 Field2
都是布尔值。出于某种原因,“filterByField.ValidBoth”条件不会产生 true,尽管记录符合条件。
因为它是一个布尔值,我使用 1 表示真,0 表示假。
我是不是漏掉了什么?
public Exp getFilterByFieldFilter(FilterByField filterByField) {
if (filterByField == null || "".equals(filterByField)) {
return Exp.val(true);
}
if (filterByField == filterByField.All) {
return Exp.val(true);
} else if (filterByField == filterByField.ValidBoth) {
return Exp.and(Exp.eq(Exp.intBin("Field1"), Exp.val(0)),
Exp.eq(Exp.intBin("Field2"), Exp.val(0)));
}
}
从我通过 AQL 从数据库结果中看到的,那些未设置为 true 的内容不会反映在结果集中。
我是否应该将我的过滤器写成另一种检查这种情况的方法?如果是这样,那情况会是什么样子?
我尝试检查 Exp.val(NULL) 但出现错误。
这是我通过 AQL 设置的数据库结果
[
{
"PK": "1",
"Name": "ABC",
"Field1": 1,
"Field2": 1
},
{
"PK": "2",
"Name": "EFG",
"Field1": 1
},
{
"PK": "3",
"Name": "XYZ",
}
]
如果 bin 名称 Field1 和 Field2 包含布尔值,那么您的表达式应该以这种方式构造(无论所需的逻辑是什么):
Exp.eq(Exp.boolBin("Field1"), Exp.val(false))
我测试了下面的构造,似乎对我有用:
WritePolicy wPolicy = new WritePolicy();
Bin b1 = new Bin("Field1", Value.get(0));
Bin b2 = new Bin("Field2", Value.get(0));
Bin b3 = new Bin("Data", Value.get("data"));
wPolicy.recordExistsAction = RecordExistsAction.REPLACE;
client.put(wPolicy, key, b1, b2, b3);
//client.put(wPolicy, key, b1, b3);
Exp condFilter = Exp.and(
Exp.eq(Exp.intBin("Field1"),Exp.val(0) ),
Exp.eq(Exp.intBin("Field2"),Exp.val(0) )
);
Policy policy = new Policy();
policy.filterExp = Exp.build(condFilter);
Record record = client.get(policy, key);
System.out.println("Read back the record.");
System.out.println("Record values are:");
System.out.println(record);
//Get record without filter condition
record = client.get(null, key);
System.out.println(record);
有效条件:
Read back the record.
Record values are:
(gen:18),(exp:0),(bins:(Field1:0),(Field2:0),(Data:data))
(gen:18),(exp:0),(bins:(Field1:0),(Field2:0),(Data:data))
无效条件(无 Field2 bin):
Read back the record.
Record values are:
null
(gen:19),(exp:0),(bins:(Field1:0),(Data:data))