package com.buschmais.xo.neo4j.remote.impl.model.state;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import com.buschmais.xo.api.XOException;
import com.buschmais.xo.neo4j.remote.impl.model.RemoteDirection;
import com.buschmais.xo.neo4j.remote.impl.model.RemoteLabel;
import com.buschmais.xo.neo4j.remote.impl.model.RemoteRelationship;
import com.buschmais.xo.neo4j.remote.impl.model.RemoteRelationshipType;
public class NodeState extends AbstractPropertyContainerState {
private StateTracker<RemoteLabel, Set<RemoteLabel>> labels = new StateTracker<>(new HashSet<>());
private Map<RemoteRelationshipType, StateTracker<RemoteRelationship, Set<RemoteRelationship>>> outgoingRelationships = new HashMap<>();
private Map<RemoteRelationshipType, StateTracker<RemoteRelationship, Set<RemoteRelationship>>> incomingRelationships = new HashMap<>();
public NodeState() {
super(null);
}
public NodeState(Set<RemoteLabel> labels, Map<String, Object> readCache) {
super(readCache);
this.labels = new StateTracker<>(labels);
}
public StateTracker<RemoteLabel, Set<RemoteLabel>> getLabels() {
return labels;
}
public Map<RemoteRelationshipType, StateTracker<RemoteRelationship, Set<RemoteRelationship>>> getOutgoingRelationships() {
return outgoingRelationships;
}
public StateTracker<RemoteRelationship, Set<RemoteRelationship>> getOutgoingRelationships(RemoteRelationshipType type) {
return outgoingRelationships.get(type);
}
public StateTracker<RemoteRelationship, Set<RemoteRelationship>> getIncomingRelationships(RemoteRelationshipType type) {
return incomingRelationships.get(type);
}
public StateTracker<RemoteRelationship, Set<RemoteRelationship>> getRelationships(RemoteDirection remoteDirection, RemoteRelationshipType type) {
switch (remoteDirection) {
case OUTGOING:
return getOutgoingRelationships(type);
case INCOMING:
return getIncomingRelationships(type);
default:
throw new XOException("Unknown direction " + remoteDirection);
}
}
public void setRelationships(RemoteDirection remoteDirection, RemoteRelationshipType type,
StateTracker<RemoteRelationship, Set<RemoteRelationship>> relationships) {
switch (remoteDirection) {
case OUTGOING:
outgoingRelationships.put(type, relationships);
break;
case INCOMING:
incomingRelationships.put(type, relationships);
break;
default:
throw new XOException("Unknown direction " + remoteDirection);
}
}
@Override
public void flush() {
super.flush();
labels.flush();
for (StateTracker<RemoteRelationship, Set<RemoteRelationship>> tracker : outgoingRelationships.values()) {
tracker.flush();
}
for (StateTracker<RemoteRelationship, Set<RemoteRelationship>> tracker : incomingRelationships.values()) {
tracker.flush();
}
}
@Override
public void clear() {
super.clear();
outgoingRelationships.clear();
incomingRelationships.clear();
}
}