Search code examples
javaspring-dataaerospike

Spring-data-aerospike incompatibility with aql created indexes


I have aerospike server v 3.8.3 installed on my machine and I tried to create an index using the following command in aql:

aql> CREATE INDEX indexA ON namespace.setA(binA) STRING 

Here is the result of aql> show indexes command

+----------------+--------+------------+---------+-------+------------+-------+------------+------------+
| ns             | bin    | indextype  | set     | state | indexname  | path  | sync_state | type       |
+----------------+--------+------------+---------+-------+------------+-------+------------+------------+
| "namespace"    | "binA" | "NONE"     | "setA"  | "RW"  | "indexA"   | "BinB | "synced"   | "STRING"   |
+----------------+--------+------------+---------+-------+------------+-------+------------+------------+

spring-data-aerospike is expecting the index to be constructed with the following bins

+----------------+-----------------+--------+----------+-------+-----------+------------+--------------+
| ns             | bins            | set    | num_bins | state | indexname | sync_state | type         |
+----------------+-----------------+--------+----------+-------+-----------+------------+--------------+
| "user_profile" | "last_activity" | "west" | 1        | "WO"  | "ix1"     | "synced"   | "INT SIGNED" |
+----------------+-----------------+--------+----------+-------+-----------+------------+--------------

The two formats are mentioned in the docs here and here

There is an incompatibility in the index creation and should I fix the spring-data-aerospike or fix the indices to match the expected output in spring-data-aerospike

com/aerospike/helper/model/Index.java line 79

/* 
 * Copyright 2012-2015 Aerospike, Inc.
 *
 * Portions may be licensed to Aerospike, Inc. under one or more contributor
 * license agreements.
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package com.aerospike.helper.model;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import com.aerospike.client.query.IndexType;
/**
 * This class represents a Secondary Index
 * created in the cluster.
 * 
 * @author peter
 *
 */
public class Index {

    protected Map<String, String> values;
    public Index(String info) {
        setIndexInfo(info);

    }
    public String getName() {
        return  values.get("indexname");

    }



    public List<NameValuePair> getValues(){
        List<NameValuePair> result = new ArrayList<NameValuePair>();
        Set<String> keys = this.values.keySet();
        for (String key : keys){
            NameValuePair nvp = new NameValuePair(this, key, this.values.get(key));
            result.add(nvp);
        }
        return result;
    }

    public void setIndexInfo(String info){
        //ns=phobos_sindex:set=longevity:indexname=str_100_idx:num_bins=1:bins=str_100_bin:type=TEXT:sync_state=synced:state=RW;
        if (!info.isEmpty()){
            String[] parts = info.split(":");
            if (values == null){
                values = new HashMap<String, String>();
            }
            for (String part : parts){
                kvPut(part, this.values);
            }
        }
    }
    private void kvPut(String kv, Map<String, String> map){
        String[] kvParts = kv.split("=");
        map.put(kvParts[0], kvParts[1]);
    };

    @Override
    public String toString() {
        return this.getName();
    }
    public String getBin() {
        return  values.get("bins");
    }
    public IndexType getType(){
        String indexTypeString = values.get("type");
        if (indexTypeString.equalsIgnoreCase("TEXT"))
            return IndexType.STRING;
        else
            return IndexType.NUMERIC;
    }
}

Solution

  • Fix the spring-data-aerospike as aerospike-server changed its behavior since 48f1ae5.

    The code which response to 'show indexes' at server (in as/src/base/secondary_index.c) is :

    /*
     * Client API to list all the indexes in a namespace, returns list of imd with
     * index information, Caller should free it up
     */
    int
    as_sindex_list_str(as_namespace *ns, cf_dyn_buf *db)
    {
    ......
    

    You can check the change in the link.