Hello everyone,
I was wondering if there was any efficient way to search and return the first non null result in a distributed cache. For now I have used the Map-Reduce framework to perform a basic search but I do not think this is quite optimal (well it is not !).
Here is my example :
public class Session {
private String userId;
}
public static class GetSessionByUserIdMapper implements Mapper<String, Session, String, Session>{
private static final long serialVersionUID = 1L;
private String userId;
public GetSessionByUserIdMapper(String userId){
this.userId = userId;
}
@Override
public void map(String key, Session value, Collector<String, Session> collector) {
if (value.getUserId().equals(userId)){
collector.emit(value.getUserId(), value);
// at that moment we would be done
// is it possible to stop the map reduce operation and return this value ?
}
}
}
public static class GetSessionByUserIdReducer implements Reducer<String, Session>{
private static final long serialVersionUID = 1L;
@Override
public Session reduce(String reducedKey, Iterator<Session> iter) {
if (! iter.hasNext()){
return null;
}
return iter.next();
}
}
public static class GetSessionByUserIdCollator implements Collator<String, Session, Session>{
@Override
public Session collate(Map<String, Session> reducedResults)
{
Iterator<Session> iterator = reducedResults.values().iterator();
if (iterator.hasNext()){
return iterator.next();
}
return null;
}
}
That is a lot of operations to perform this quite simple task.
I'm aware of the existence of the Infinispan-HibernateSearch-Lucene bridge and I know it would technically work, though I would really like to far from that approach.
Is there any other way to perform this task ?
Big thanks,