en utilisant plusieurs opérations logiques comme OU, ET, PAS dans Aerospike
Nov 22 2020
J'ai des données comme ci-dessous:
+--------+-----------+---------+---------+
| COMPANY| COLOR | OWNER | MODEL |
+--------+-----------+---------+---------+
|Benz | Red | p1 | ABC |
+--------+-----------+---------+---------+
|BMW | Blue | P2 | XYZ |
+--------+-----------+---------+---------+
|Ferrari | YelloW | P3 | PQR |
+--------+-----------+---------+---------+
|Audi | Blue + P4 | MNO |
------------------------------------------
Maintenant, je veux les enregistrements où soit la société est Benz, soit la couleur est bleue, soit le propriétaire est P2. J'ai parcouru la documentation Aerospike mais je n'ai trouvé aucun moyen d'effectuer de telles opérations en une seule requête. Je veux simuler cette requête SQL dans aerospike avec le client C #:
select * from tablename where (company = Benz or Color = Blue or Owner = P1)
Réponses
1 pgupta Nov 23 2020 at 22:36
Vous pouvez utiliser des expressions dans Aerospike pour faire exactement cela. Exemple Java ci-dessous, plus disponible dans les exemples Aerospike Java Client Library (repo public). Cela vient de QueryExp.java. (Pour le client C #, voir: QueryExp.cs dans le code client Csharp / Framework / AerospikeDemo)
private void runQuery1(
AerospikeClient client,
Parameters params,
String binName
) throws Exception {
int begin = 10;
int end = 40;
console.info("Query Predicate: (bin2 > 126 && bin2 <= 140) || (bin2 = 360)");
Statement stmt = new Statement();
stmt.setNamespace(params.namespace);
stmt.setSetName(params.set);
// Filter applied on query itself. Filter can only reference an indexed bin.
stmt.setFilter(Filter.range(binName, begin, end));
// Predicates are applied on query results on server side.
// Predicates can reference any bin.
QueryPolicy policy = new QueryPolicy(client.queryPolicyDefault);
policy.filterExp = Exp.build(
Exp.or(
Exp.and(
Exp.gt(Exp.intBin("bin2"), Exp.val(126)),
Exp.le(Exp.intBin("bin2"), Exp.val(140))),
Exp.eq(Exp.intBin("bin2"), Exp.val(360))));
RecordSet rs = client.query(policy, stmt);
try {
while (rs.next()) {
Record record = rs.getRecord();
console.info("Record: " + record.toString());
}
}
finally {
rs.close();
}
}