Spring-data-aerospike incompatibility

spring
index
java

#1

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

why 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

/* 
 * 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;
	}
}

#2

Thanks for drawing our attention to this.

The aerospike-spring-data should be updated from “text” to “string”

Appreciate a pull-request to make the correction.

Thanks!


#3

I’ve done a lot of changes to make the repo fit our needs in the company

  1. Fix the index information retrieval incompatibility
  2. Add support to EnumToString and StringToEnum Converters
  3. Add support to LocalDateTimeToString and StringToLocalDateTime Converters
  4. Add support to ZonedDateTimeToString and StringToZonedDateTime Converters
  5. Honor @Document annotation collection property.

You can find all the changes here and it passes all the test cases too but I feel this is heavily crafted to our need and not Generic anymore


#4

Thanks will take a look.