package com.buschmais.xo.neo4j.test.query;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import com.buschmais.xo.api.ResultIterator;
import com.buschmais.xo.api.XOException;
import com.buschmais.xo.neo4j.api.annotation.Cypher;
import com.buschmais.xo.neo4j.spi.Neo4jDatastore;
import com.buschmais.xo.neo4j.spi.Neo4jDatastoreSession;
import com.buschmais.xo.spi.datastore.Datastore;
import com.buschmais.xo.spi.datastore.DatastoreQuery;
import com.buschmais.xo.spi.datastore.DatastoreSession;
import com.buschmais.xo.spi.plugin.QueryLanguagePlugin;
/**
* Implementation of {@link com.buschmais.xo.spi.plugin.QueryLanguagePlugin}.
*/
public class CustomQueryLanguagePlugin implements QueryLanguagePlugin<CustomQueryLanguagePlugin.CustomQueryLanguage> {
private static final Pattern QUERY_PATTERN = Pattern.compile("(.*):(.*)=(.*)");
@Override
public Class<CustomQueryLanguage> init(Datastore<?, ?, ?, ?, ?> datastore) {
if (datastore instanceof Neo4jDatastore) {
return CustomQueryLanguage.class;
}
return null;
}
@Override
public DatastoreQuery<CustomQueryLanguage> createQuery(final DatastoreSession<?, ?, ?, ?, ?, ?, ?, ?, ?> session) {
return new DatastoreQuery<CustomQueryLanguage>() {
@Override
public ResultIterator<Map<String, Object>> execute(String query, Map<String, Object> parameters) {
Matcher matcher = QUERY_PATTERN.matcher(query);
if (matcher.matches()) {
final String label = matcher.group(1);
String key = matcher.group(2);
String value = matcher.group(3);
Neo4jDatastoreSession neo4jDatastoreSession = (Neo4jDatastoreSession) session;
String s = String.format("MATCH (n:%s{%s:{%s}}) RETURN n", label, key, key);
Map<String, Object> params = new HashMap<>();
params.put(key, value);
ResultIterator<Map<String,Object>> iterator = neo4jDatastoreSession.createQuery(Cypher.class).execute(s, params);
return new ResultIterator<Map<String, Object>>() {
@Override
public boolean hasNext() {
return iterator.hasNext();
}
@Override
public Map<String, Object> next() {
Map<String, Object> row = iterator.next();
Object node = row.get("n");
Map<String, Object> result = new HashMap<>();
result.put(label, node);
return result;
}
@Override
public void remove() {
}
@Override
public void close() {
iterator.close();
}
};
}
throw new XOException("Cannot parse query.");
}
@Override
public ResultIterator<Map<String, Object>> execute(CustomQueryLanguage query, Map<String, Object> parameters) {
return execute(query.value(), parameters);
}
};
}
@Retention(RetentionPolicy.RUNTIME)
public @interface CustomQueryLanguage {
String value();
}
}