/*************************************************** * * cismet GmbH, Saarbruecken, Germany * * ... and it just works. * ****************************************************/ /* * SearchResult.java * * Created on 19. November 2003, 14:46 */ package Sirius.server.search; import Sirius.server.middleware.types.*; import Sirius.server.middleware.types.Node; import Sirius.server.search.searchparameter.*; import java.util.*; /** * DOCUMENT ME! * * @author schlob * @version $Revision$, $Date$ */ public class SearchResult implements java.io.Serializable { //~ Static fields/initializers --------------------------------------------- private static final transient org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger( SearchResult.class); // vor\u00FCbergehend public static int NODE = 1; public static int COLLECTION = 2; public static int VALUE = 3; public static int OBJECT = 4; public static int MAX_HITS = 500; //~ Instance fields -------------------------------------------------------- protected HashSet filter = new HashSet(); protected boolean filterSet = false; protected Object data; private HashSet retainer; //~ Constructors ----------------------------------------------------------- /** * Creates a new SearchResult object. * * @param srs DOCUMENT ME! */ public SearchResult(final SearchResult srs) { this.data = srs.data; } /** * Creates a new SearchResult object. * * @param nodes DOCUMENT ME! */ public SearchResult(final MetaObjectNode[] nodes) { this.data = new HashSet(); for (int i = 0; i < nodes.length; i++) { ((HashSet)this.data).add(nodes[i]); } } /** * Creates a new SearchResult object. * * @param data DOCUMENT ME! */ public SearchResult(final MetaObject[] data) { this.data = data; } /** * Creates a new SearchResult object. * * @param data DOCUMENT ME! */ public SearchResult(final Object data) { this.data = data; } //~ Methods ---------------------------------------------------------------- /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public boolean isObject() { return data instanceof MetaObject[]; } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public boolean isNode() { return (data instanceof MetaObjectNode[]) || (data instanceof HashSet); } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public boolean isSearchParameter() { return !(isNode() || isObject()); } /** * DOCUMENT ME! * * @return DOCUMENT ME! * * @throws Exception DOCUMENT ME! */ public MetaObjectNode[] getNodes() throws Exception { if (isNode()) { // System.out.println("nodes: " + ((Collection)this.data).size()); return (MetaObjectNode[])((Collection)this.data).toArray( new MetaObjectNode[((Collection)this.data).size()]); } else { throw new Exception("SearchResult.data no Node[]"); // NOI18N } } /** * DOCUMENT ME! * * @return DOCUMENT ME! * * @throws Exception DOCUMENT ME! */ public MetaObject[] getObjects() throws Exception { if (isObject()) { return (MetaObject[])data; } else { throw new Exception("SearchResult.data no MetaObject[]"); // NOI18N } } /** * DOCUMENT ME! * * @return DOCUMENT ME! * * @throws Exception DOCUMENT ME! */ public Object getSearchParameter() throws Exception { if (isSearchParameter()) { return data; } else { throw new Exception("SearchResult.data no SearchParameter"); // NOI18N } } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public java.lang.Object getResult() { return data; } /** * DOCUMENT ME! * * @param nodes DOCUMENT ME! * * @throws Exception DOCUMENT ME! */ public void addAll(final Sirius.server.middleware.types.MetaObjectNode[] nodes) throws Exception { if (logger.isDebugEnabled()) { logger.debug("addAll nodes invoked"); // NOI18N } final HashSet result = new HashSet(nodes.length); // f\u00FCge nodes Hashset hinzu for (int i = 0; i < nodes.length; i++) { result.add(nodes[i]); } if (logger.isDebugEnabled()) { logger.debug("newly added:" + result + " retainer :" + retainer + " already in:" + ((HashSet)data)); // NOI18N } ((HashSet)data).addAll(result); if (retainerSet()) { data = intersect(intersect(result, retainer), (HashSet)data); } // else // ((HashSet)data).addAll(result); } /** * DOCUMENT ME! * * @param sr DOCUMENT ME! * * @throws Exception DOCUMENT ME! */ public void addAll(final SearchResult sr) throws Exception { if (sr.isNode()) { addAll(sr.getNodes()); } else if (sr.isSearchParameter()) { if (logger.isDebugEnabled()) { logger.debug("Info :: no merging of search parameters, overwrite data"); // NOI18N } this.data = sr.data; } } /** * DOCUMENT ME! * * @param nodes DOCUMENT ME! * * @throws Exception DOCUMENT ME! */ public void addAllAndFilter(final Sirius.server.middleware.types.MetaObjectNode[] nodes) throws Exception { if (logger.isDebugEnabled()) { logger.debug("addAllandfilter nodes invoked"); // NOI18N } // no filtering necessary if (!filterSet) { addAll(nodes); } else { // Vector tmp = new Vector(nodes.length); for (int i = 0; i < nodes.length /*&& ((HashSet) this.data).size()<=MAX_HITS*/; i++) { MetaObjectNode o = null; if (nodes[i] instanceof Sirius.server.middleware.types.MetaObjectNode) { o = (MetaObjectNode)nodes[i]; } else { if (logger != null) { logger.error( "tried to add a node that was no node:-) type:" + nodes[i].getClass() // NOI18N + "\n node contains" + nodes[i]); // NOI18N } // element auslassen n\u00E4chstes probieren continue; } if (filter.contains(new Integer(o.getClassId()))) { ((HashSet)this.data).add(o); } } // addAll((MetaObjectNode[])tmp.toArray(new MetaObjectNode[tmp.size()])); } } /** * DOCUMENT ME! * * @param classIds DOCUMENT ME! */ public void setFilter(final int[] classIds) { filter = new HashSet(classIds.length); for (int i = 0; i < classIds.length; i++) { filter.add(new Integer(classIds[i])); } filterSet = true; } /** * DOCUMENT ME! * * @param filterSet DOCUMENT ME! */ public void setFilterActive(final boolean filterSet) { this.filterSet = filterSet; } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public boolean isFilterActive() { return filterSet; } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public boolean isFull() { if (isObject()) { return ((MetaObject[])data).length >= MAX_HITS; } else if (isNode()) { // return ((Node[])data).length>=MAX_HITS; return ((Collection)this.data).size() >= MAX_HITS; } else { return false; // na ja } } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public boolean isEmpty() { if (isObject()) { return ((MetaObject[])data).length == 0; } else if (isNode()) { return ((Collection)this.data).size() == 0; } else { return true; // na ja } } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public int capacity() { if (isObject()) { return MAX_HITS - ((MetaObject[])data).length; } else if (isNode()) { return MAX_HITS - ((Collection)this.data).size(); } else { return MAX_HITS; // na ja } } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public HashSet getRetainer() { return retainer; } /** * DOCUMENT ME! * * @param retainer DOCUMENT ME! */ public void setRetainer(final HashSet retainer) { this.retainer = retainer; } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public boolean retainerSet() { return retainer != null; } /** * DOCUMENT ME! * * @param a DOCUMENT ME! * @param b DOCUMENT ME! * * @return DOCUMENT ME! */ public static HashSet intersect(final HashSet a, final HashSet b) { if (logger.isDebugEnabled()) { logger.debug("intersect \na " + a + "\nb" + b); // NOI18N } final HashSet c = new HashSet(); final Iterator<Node> iter = a.iterator(); while (iter.hasNext()) { final Object o = iter.next(); if (logger.isDebugEnabled()) { logger.debug("check whether element of a is in b" + o); // NOI18N } if (b.contains(o)) { c.add(o); if (logger.isDebugEnabled()) { logger.debug("mutual element added to c" + o); // NOI18N } } else if (logger.isDebugEnabled()) { logger.debug("element not added to c as it is not in b" + o); // NOI18N } } return c; } }