Spring-data-aerospike与aql创建的索引不兼容

时间:2016-06-10 17:44:38

标签: java spring-data aerospike

我的机器上安装了aerospike server v 3.8.3,我尝试在aql中使用以下命令创建索引:

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

以下是aql> show indexes命令

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

spring-data-aerospike期望使用以下bin构建索引

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

文档herehere

中提到了这两种格式

索引创建中存在不兼容性,我应该修复spring-data-aerospike还是修复索引以匹配spring-data-aerospike

中的预期输出

com/aerospike/helper/model/Index.java第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;
    }
}

1 个答案:

答案 0 :(得分:1)

修复spring-data-aerospike ,因为aerospike-server改变了自48f1ae5以来的行为。

在服务器(as/src/base/secondary_index.c)中响应'show indexes'的代码是:

/*
 * 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)
{
......

您可以在link

中查看更改