package org.openntf.domino.graph2.builtin.search; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import org.openntf.domino.big.IndexDatabase; import org.openntf.domino.graph2.annotations.AdjacencyUnique; import org.openntf.domino.graph2.annotations.IncidenceUnique; import org.openntf.domino.graph2.annotations.TypedProperty; import org.openntf.domino.graph2.builtin.DEdgeFrame; import org.openntf.domino.graph2.builtin.DVertexFrame; import com.tinkerpop.blueprints.Direction; import com.tinkerpop.blueprints.Vertex; import com.tinkerpop.frames.InVertex; import com.tinkerpop.frames.OutVertex; import com.tinkerpop.frames.modules.javahandler.JavaHandler; import com.tinkerpop.frames.modules.javahandler.JavaHandlerClass; import com.tinkerpop.frames.modules.javahandler.JavaHandlerContext; import com.tinkerpop.frames.modules.typedgraph.TypeValue; @TypeValue(IndexDatabase.VALUE_FORM_NAME) @JavaHandlerClass(Value.ValueImpl.class) public interface Value extends DVertexFrame { @TypeValue(ContainsTerm.LABEL) public static interface ContainsTerm extends DEdgeFrame { public static final String LABEL = "ContainsTerm"; @InVertex public Value getValue(); @OutVertex public Term getTerm(); } @TypedProperty("value") public String getValue(); @TypedProperty("value") public void setValue(String value); @JavaHandler @TypedProperty("Hits") public Map getHits(); @JavaHandler @TypedProperty("HitRepls") public List<CharSequence> getHitRepls(); @AdjacencyUnique(label = ContainsTerm.LABEL, direction = Direction.IN) public Iterable<Term> getTerms(); @AdjacencyUnique(label = ContainsTerm.LABEL, direction = Direction.IN) public ContainsTerm addTerm(Term term); @AdjacencyUnique(label = ContainsTerm.LABEL, direction = Direction.IN) public void removeTerm(Term term); @IncidenceUnique(label = ContainsTerm.LABEL, direction = Direction.IN) public Iterable<ContainsTerm> getContainsTerms(); @IncidenceUnique(label = ContainsTerm.LABEL, direction = Direction.IN) public int countContainsTerms(); @IncidenceUnique(label = ContainsTerm.LABEL, direction = Direction.IN) public void removeContainsTerm(ContainsTerm containsTerm); public static abstract class ValueImpl extends DVertexFrameImpl implements Value, JavaHandlerContext<Vertex> { @Override public Map getHits() { Map<CharSequence, Object> result = new LinkedHashMap<CharSequence, Object>(); for (CharSequence replid : getHitRepls()) { String itemname = IndexDatabase.VALUE_MAP_PREFIX + replid; Vertex v = asVertex(); Object raw = v.getProperty(itemname); // System.out.println("TEMP DEBUG getting value location map from item " + itemname + " from vertex " // + String.valueOf(v.getId()) + " (id: " + System.identityHashCode(raw) + ")"); if (raw instanceof Map) { Map m = (Map) raw; for (Object key : m.keySet()) { // System.out.println("TEMP DEBUG " + String.valueOf(key) + ":" + String.valueOf(m.get(key)) + " (" // + m.get(key).getClass().getName() + ")"); } } result.put(replid, this.asVertex().getProperty(itemname)); } return result; } @Override public List<CharSequence> getHitRepls() { System.out.println("TEMP DEBUG getting value hit repl list"); List<CharSequence> result = new ArrayList<CharSequence>(); Map<CharSequence, Object> map = this.asMap(); for (CharSequence cs : map.keySet()) { String str = cs.toString(); if (str.startsWith(IndexDatabase.VALUE_MAP_PREFIX)) { result.add(str.substring(IndexDatabase.VALUE_MAP_PREFIX.length())); } } return result; } } }