
es.urjc.etsii.grafo.events.MemoryEventStorage Maven / Gradle / Ivy
package es.urjc.etsii.grafo.events;
import es.urjc.etsii.grafo.events.types.MorkEvent;
import es.urjc.etsii.grafo.events.types.SolutionGeneratedEvent;
import es.urjc.etsii.grafo.io.Instance;
import es.urjc.etsii.grafo.solution.Solution;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ConcurrentSkipListMap;
import java.util.stream.Stream;
/**
* Store historical event data
*/
@Service
public class MemoryEventStorage, I extends Instance> extends AbstractEventStorage {
/**
* Use a tree as events may be processed unordered, but should be retrieved ordered by range query
*/
private final ConcurrentSkipListMap eventLog = new ConcurrentSkipListMap<>();
/**
* Constructor for MemoryEventStorage.
*/
protected MemoryEventStorage(){}
/**
* Store in memory the given event
*
* @param event event to save
*/
public void storeEvent(MorkEvent event){
int eventId = event.getEventId();
if(eventLog.containsKey(eventId)){
throw new IllegalStateException("Repeated event id + " + eventId);
}
eventLog.put(eventId, event);
}
/**
* {@inheritDoc}
*
* Retrieve events by range [from, to).
*/
public List getEvents(int from, int to){
if(to < from){
throw new IllegalArgumentException(String.format("Invalid parameters: 'to' is less or equals to 'from', %s <= %s", to, from));
}
return new ArrayList<>(eventLog.subMap(from, to).values());
}
@Override
public MorkEvent getEvent(int id) {
var event = eventLog.get(id);
if(event == null){
throw new IllegalArgumentException("No event with ID " + id);
}
return event;
}
/** {@inheritDoc} */
@SuppressWarnings("unchecked")
public Stream> getGeneratedSolEventForExp(String experimentName){
return this.eventLog.values().stream()
.filter(e -> e instanceof SolutionGeneratedEvent)
.map(e -> (SolutionGeneratedEvent) e)
.filter(e -> e.getExperimentName().equals(experimentName));
}
/** {@inheritDoc} */
@SuppressWarnings("unchecked")
public Stream getEventsByType(Class type){
return (Stream) this.eventLog.values().stream()
.filter(type::isInstance);
}
/**
* getAllEvents.
*
* @return a {@link java.util.stream.Stream} object.
*/
public Stream getAllEvents(){
return this.eventLog.values().stream();
}
/**
* getLastEvent.
*
* @return a {@link MorkEvent} object.
*/
public MorkEvent getLastEvent(){
return eventLog.lastEntry().getValue();
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy