использование нескольких логических операций, таких как ИЛИ, И, НЕ в Aerospike

#c# #aerospike

#c# #aerospike

Вопрос:

У меня есть данные, как показано ниже :

  -------- ----------- --------- --------- 
| COMPANY| COLOR     | OWNER   | MODEL   |
 -------- ----------- --------- --------- 
|Benz    | Red       | p1      | ABC     |
 -------- ----------- --------- --------- 
|BMW     | Blue      | P2      | XYZ     |
 -------- ----------- --------- --------- 
|Ferrari | YelloW    | P3      | PQR     |
 -------- ----------- --------- --------- 
|Audi    | Blue        P4      | MNO     |
------------------------------------------
 

Теперь мне нужны записи, в которых либо компания Benz, либо цвет синий, либо владелец P2. Я просмотрел документацию Aerospike, но не смог найти никакого способа, с помощью которого мы могли бы выполнять такие операции в одном запросе. Я хочу смоделировать этот SQL-запрос в aerospike с помощью C # client:

 select * from tablename where (company = Benz or Color = Blue or Owner = P1)
 

Комментарии:

1. Не используется areospike, но выражения, возможно, то, что вы ищете aerospike.com/docs/guide/expressions/logical

Ответ №1:

Вы можете использовать выражения в Aerospike именно для этого. Приведенный ниже пример Java, более доступный в примерах клиентской библиотеки Aerospike Java (публичное хранилище). Это из QueryExp.java . (Для клиента C # см.: QueryExp.cs в клиентском коде 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 amp;amp; 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();
    }
}