Search.java :  » Wiki-Engine » ocwiki » org » ocwiki » module » search » Java Open Source

Java Open Source » Wiki Engine » ocwiki 
ocwiki » org » ocwiki » module » search » Search.java
package org.ocwiki.module.search;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Hashtable;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.ocwiki.data.MultichoiceQuestion;
import org.ocwiki.data.File;
import org.ocwiki.data.Test;
import org.ocwiki.data.TestStructure;
import org.ocwiki.data.TextArticle;
import org.ocwiki.data.Topic;

public class Search {

  private static Map<Class<?>, String> entityAliases = null;
  static {
    entityAliases = new Hashtable<Class<?>, String>();
    entityAliases.put(MultichoiceQuestion.class, "basequestion");
    entityAliases.put(Test.class, "test");
    entityAliases.put(TestStructure.class, "teststructure");
    entityAliases.put(TextArticle.class, "textarticle");
    entityAliases.put(Topic.class, "topic");
    entityAliases.put(File.class, "file");
  }

  private static String getAlias(Class<?> clazz) {
    return entityAliases.get(clazz);
  }
  
  public static List<Class<?>> getAllSearchAbleClasses(){
    return new ArrayList<Class<?>>(entityAliases.keySet());
  }
  
  public Search(){
    elements = new ArrayList<SearchElement>();
  }

  private List<SearchElement> elements;

  public void addSearchElement(SearchElement element){
    elements.add(element);
  }
  
  public void addSearchElement(SearchOperator operator,ISearchElement element){
    addSearchElement(new SearchElement(operator, element));
  }
  
  public List<SearchElement> getElements() {
    return elements;
  }

  public String buildSearchQueryForClass(Class<?> clazz) {
    StringBuilder sb = new StringBuilder();
    sb.append("from ").append(clazz.getName()).append(" as ").append(
        getAlias(clazz));
    if (elements.size() > 0) {
      sb.append(" where ");
      for (SearchElement iSE : elements) {
        if(iSE.getElement().getSearchAbleClasses().contains(clazz)){
          if(iSE.getOperator()!=null){
            sb.append(iSE.getOperator().toString().toLowerCase());
          }
          sb.append(" ( ");
          sb.append(iSE.getElement().getQueryElement(getAlias(clazz)));
          sb.append(" ) ");
        }        
      }
    }
    return sb.toString();
  }

  public static class SearchElement {
    private SearchOperator operator;
    private ISearchElement element;

    public SearchOperator getOperator() {
      return operator;
    }

    public void setOperator(SearchOperator operator) {
      this.operator = operator;
    }

    public ISearchElement getElement() {
      return element;
    }

    public void setElement(ISearchElement element) {
      this.element = element;
    }

    public SearchElement(SearchOperator operator, ISearchElement element) {
      super();
      this.operator = operator;
      this.element = element;
    }
  }

  public static enum SearchOperator {

    AND(new String[] { "and", "va", "v" }), OR(new String[] { "or",
        "hoac", "hoc" });

    private Set<String> aliases = null;

    SearchOperator(String[] aliases) {
      this.aliases = new HashSet<String>();
      for (String iS : aliases) {
        this.aliases.add(iS);
      }
    }

    public static Set<String> getAllKeyWords() {
      HashSet<String> tempSet = new HashSet<String>();
      for (SearchOperator iSO : SearchOperator.values()) {
        tempSet.addAll(iSO.aliases);
      }
      return tempSet;
    }

    public static SearchOperator getOperator(String alias) {
      for (SearchOperator iSO : SearchOperator.values()) {
        if (iSO.aliases.contains(alias)) {
          return iSO;
        }
      }
      return null;
    }
  }
}
java2s.com  | Contact Us | Privacy Policy
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.