Search code examples
javadatabaseaerospikeaql

How to Get record from aerospike using list in java?


My data at test.setName looks like this

| id    | cities              | lob        |
|-------|---------------------|------------|
| id123 | ["Cthdcn","Ctdel"]  | ["Lob132"] |
| id345 | ["Ctijs","Ctdelhi"] | ["LOB231"] |
| id765 | ["Cthui"]           | ["Lob875"] |

"cities" is already present as LIST INDEX, and want to get a particular record by specifying cities array like(["Ctijs","Ctdelhi"]) via java client.

I want to retrieve (get) records by specifying cities array using java. I am using the following method

    public Record testGet(String namespace, String set, String city, List<String> binNames) {
    Statement statement = new Statement();
    statement.setNamespace(namespace);
    statement.setSetName(set);
    Filter filter = Filter.contains("cities", IndexCollectionType.LIST, city);
    statement.setFilter(filter);
    RecordSet records = this.client.query((QueryPolicy)null, statement);
    return records.getRecord();
}

I am getting null. How can I retrieve that specific record? (AQL version 3.23.0)


Solution

  • Here is small script in AQL in a text file, list.aql , to replicate your test:

    list.aql:

    TRUNCATE test
    DROP INDEX test.setName idx_city
    SELECT * FROM test
    CREATE LIST INDEX idx_city ON test.setName (cities) STRING
    
    INSERT INTO test.setName (PK, id, cities, lob) VALUES ('key1', 'id123', LIST('["Cthdcn", "Ctdel"]'), LIST('["Lob132
    "]'))
    INSERT INTO test.setName (PK, id, cities, lob) VALUES ('key2', 'id345', LIST('["Ctijs", "Ctdelhi"]'), LIST('["LOB23
    1"]'))
    INSERT INTO test.setName (PK, id, cities, lob) VALUES ('key3', 'id765', LIST('["Cthui"]'), LIST('["Lob875"]'))
    
    select * from test.setName
    
    select * from test.setName in LIST where cities = 'Cthdcn'
    

    Output in aql:

    aql> run 'list.aql'
    TRUNCATE test
    OK
    
    DROP INDEX test.setName idx_city
    Error: (201)  Index does not exist on the system.
    
    SELECT * FROM test
    0 rows in set (0.156 secs)
    
    OK
    
    CREATE LIST INDEX idx_city ON test.setName (cities) STRING
    OK, 1 index added.
    
    INSERT INTO test.setName (PK, id, cities, lob) VALUES ('key1', 'id123', LIST('["Cthdcn", "Ctdel"]'), LIST('["Lob132"]'))
    OK, 1 record affected.
    
    INSERT INTO test.setName (PK, id, cities, lob) VALUES ('key2', 'id345', LIST('["Ctijs", "Ctdelhi"]'), LIST('["LOB231"]'))
    OK, 1 record affected.
    
    INSERT INTO test.setName (PK, id, cities, lob) VALUES ('key3', 'id765', LIST('["Cthui"]'), LIST('["Lob875"]'))
    OK, 1 record affected.
    
    select * from test.setName
    +---------+------------------------------+--------------------+
    | id      | cities                       | lob                |
    +---------+------------------------------+--------------------+
    | "id123" | LIST('["Cthdcn", "Ctdel"]')  | LIST('["Lob132"]') |
    | "id765" | LIST('["Cthui"]')            | LIST('["Lob875"]') |
    | "id345" | LIST('["Ctijs", "Ctdelhi"]') | LIST('["LOB231"]') |
    +---------+------------------------------+--------------------+
    3 rows in set (0.124 secs)
    
    OK
    
    select * from test.setName in LIST where cities = 'Cthdcn'
    +---------+-----------------------------+--------------------+
    | id      | cities                      | lob                |
    +---------+-----------------------------+--------------------+
    | "id123" | LIST('["Cthdcn", "Ctdel"]') | LIST('["Lob132"]') |
    +---------+-----------------------------+--------------------+
    1 row in set (0.001 secs)
    
    OK
    
    aql>
    

    In Java, you will have to iterate through the recordset to get each record that satisfies the query.

    RecordSet records = client.query( .....)
    while (records.next()){
      Record r = records.getRecord();
      ....
    }
    records.close()
    

    I just tested the following code:

    public void read () {
                    Record record = null;
                    Statement stmt = new Statement();
                    stmt.setSetName("setName");
                    stmt.setNamespace("test");
                    stmt.setIndexName("idx_city");
                    stmt.setFilter(Filter.contains("cities", IndexCollectionType.LIST, "Cthui"));
    
                    RecordSet recordSet = this.client.query(queryPolicy, stmt);
                while (recordSet.next()) {
                    record = recordSet.getRecord();
                    System.out.println(record.toString());
                }
    
             }
    

    and it worked for me.

    $ java -jar ./target/dm-predicateFilter-1.0-full.jar
    (gen:1),(exp:348432597),(bins:(id:id765),(cities:[Cthui]),(lob:[Lob875]))