diff src/main/java/de/mpiwg/itgroup/ismi/search/beans/SimpleSearchBean.java @ 1:2e911857a759

(none)
author jurzua
date Wed, 29 Oct 2014 14:00:28 +0000
parents
children 42193ad7b28c
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/de/mpiwg/itgroup/ismi/search/beans/SimpleSearchBean.java	Wed Oct 29 14:00:28 2014 +0000
@@ -0,0 +1,365 @@
+package de.mpiwg.itgroup.ismi.search.beans;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.faces.event.ActionEvent;
+import javax.faces.event.ValueChangeEvent;
+import javax.faces.model.SelectItem;
+
+import org.apache.commons.lang.StringUtils;
+import org.apache.log4j.Logger;
+import org.mpi.openmind.repository.bo.Attribute;
+import org.mpi.openmind.repository.bo.Entity;
+import org.mpi.openmind.repository.bo.Relation;
+import org.mpi.openmind.repository.bo.utils.EntitySortByNormalizedOwnValue;
+import org.mpi.openmind.repository.services.utils.AttributeFilter;
+
+import de.mpiwg.itgroup.ismi.auxObjects.ResultSet;
+import de.mpiwg.itgroup.ismi.entry.beans.AbstractISMIBean;
+import de.mpiwg.itgroup.ismi.entry.beans.SessionBean;
+
+public class SimpleSearchBean extends AbstractISMIBean implements Serializable{
+
+	private static final long serialVersionUID = -1363042229412197533L;
+
+	private static Logger logger = Logger.getLogger(SimpleSearchBean.class);
+	
+	public static String NO_ROLE_PERSON = "Person without role";
+	
+	private String inputMethod = "latin";
+	private String searchTerm;
+	
+	public static List<SelectItem> modeList = new ArrayList<SelectItem>();
+	public static String AUTHORS_TITLES = "People and Titles";
+	public static String TITLES = "Titles";
+	public static String AUTHORS = "People";
+	
+	public static List<AttributeFilter> filters = new ArrayList<AttributeFilter>();
+	public static List<AttributeFilter> titlesFilters = new ArrayList<AttributeFilter>();
+	public static List<AttributeFilter> authorsFilters = new ArrayList<AttributeFilter>();
+	private static AttributeFilter filter1 = new AttributeFilter();
+	private static AttributeFilter filter2 = new AttributeFilter();
+	private static AttributeFilter filter3 = new AttributeFilter();
+	private static AttributeFilter filter4 = new AttributeFilter();
+	private static AttributeFilter filter5 = new AttributeFilter();
+	private static AttributeFilter filter6 = new AttributeFilter();
+	private static AttributeFilter filter7 = new AttributeFilter();
+	
+	private Map<String, ResultSet> resultMap;
+	private List<String> resultSetNames;
+
+	public String selectedMode;
+
+	static{
+		modeList.add(new SelectItem(AUTHORS));
+		modeList.add(new SelectItem(TITLES));
+		modeList.add(new SelectItem(AUTHORS_TITLES));
+	}
+	
+	public SimpleSearchBean() {
+		this.selectedMode = modeList.get(0).getValue().toString();
+	}
+	
+	
+	public void listenerSearch(ActionEvent event){
+		try {
+			this.simpleSearchAction();	
+		} catch (Exception e) {
+			logger.error(e.getMessage(), e);
+		}
+		
+	}
+	
+	public void listenerModeValueChange(ValueChangeEvent event){
+		this.selectedMode = (String)event.getNewValue();
+	}
+	
+	public void setInputMethod(String inputMethod) {
+		this.inputMethod = inputMethod;
+	}
+	public String getInputMethod() {
+		return inputMethod;
+	}
+	public void setSearchTerm(String searchTerm) {
+		this.searchTerm = searchTerm;
+	}
+	public String getSearchTerm() {
+		return searchTerm;
+	}
+	
+	public void simpleSearchAction() throws Exception{
+		search0(getSearchTerm(), getSelectedMode());
+	}
+	
+	public List<SelectItem> getModeList() {
+		return modeList;
+	}
+
+	public String getSelectedMode() {
+		return selectedMode;
+	}
+	public void setSelectedMode(String selectedMode) {
+		this.selectedMode = selectedMode;
+	}
+	
+	//######################################################
+	//######################################################
+	//######################################################
+	
+	public static Long SEC_05 = new Long(5000);
+	public static Long SEC_10 = new Long(10000);
+	public static Long SEC_20 = new Long(20000);
+	public static Long SEC_30 = new Long(30000);
+
+	private int maxResult = -1	;
+	private int counter = 0;
+	
+	public void search0(String term, String mode) throws Exception{
+
+        if (StringUtils.isNotEmpty(term)) {
+        	StringBuilder sb = new StringBuilder();	
+        	long start = System.currentTimeMillis();
+        	this.resultMap = new HashMap<String, ResultSet>();
+        	List<Long> usedIdList = new ArrayList<Long>(); 
+        	this.counter = 0;
+        	
+        	boolean includeTitles = (SimpleSearchBean.TITLES.equals(mode) || SimpleSearchBean.AUTHORS_TITLES.equals(mode)) ? true : false;
+        	boolean includeAuthors = (SimpleSearchBean.AUTHORS.equals(mode) || SimpleSearchBean.AUTHORS_TITLES.equals(mode) ? true : false);
+        	
+        	Map<Entity, Attribute> map = new HashMap<Entity, Attribute>();
+        	if(includeAuthors && includeTitles){
+        		map = getWrapper().searchEntityByAttributeFilter0(term, filters, -1);
+        	}else if(includeAuthors){
+        		map = getWrapper().searchEntityByAttributeFilter0(term, authorsFilters, -1);
+        	}else if(includeTitles){
+        		map = getWrapper().searchEntityByAttributeFilter0(term, titlesFilters, -1);
+        	}
+        	//System.out.println("getWrapper().searchEntityByAttributeFilter0= " + (System.currentTimeMillis() - start));
+        	sb.append("\n\n***********************\n");
+        	sb.append("getWrapper().searchEntityByAttributeFilter0= " + (System.currentTimeMillis() - start) + "\n");
+        	
+        	for(Entity ent : map.keySet()){
+        		if(counter == 1000 || (System.currentTimeMillis() - start) > SEC_20){
+        			break;
+        		}
+        		Attribute att = map.get(ent);
+        		if(ent.getObjectClass().equals(ALIAS)){
+        			AliasStructure aliasStructure = getAliasStructure(ent, att);
+        			if(aliasStructure.target != null && !usedIdList.contains(aliasStructure.target.getId())){
+        				usedIdList.add(aliasStructure.target.getId());
+        				if(includeAuthors && aliasStructure.target.getObjectClass().equals(PERSON)){
+        					this.insertPerson(aliasStructure.target, att, aliasStructure.description);
+            			}else if(includeTitles && aliasStructure.target.getObjectClass().equals(TEXT)){
+            				this.insertTitle(aliasStructure.target, att, aliasStructure.description);
+            			}	
+        			}
+        		}else if(!usedIdList.contains(ent.getId())){
+        			usedIdList.add(ent.getId());
+        			String d = att.getObjectClass() + "=" + att.getOwnValue();
+        			if(ent.getObjectClass().equals(PERSON)){
+            			this.insertPerson(ent, att, d);
+            		}else if(ent.getObjectClass().equals(TEXT)){
+            			this.insertTitle(ent, att, d);
+            		}
+        		} 
+        	}
+        	
+           	for(String key : resultMap.keySet()){
+           		ResultSet rs = resultMap.get(key);
+           		//System.out.println(key + "= " + rs.getResults().size());
+        		Collections.sort(rs.getResults(), new EntitySortByNormalizedOwnValue());
+        	}
+        	
+           	this.resultSetNames = new ArrayList<String>(getResultMap().keySet());
+        	Collections.sort(this.resultSetNames);
+        	
+        	
+        	long end = System.currentTimeMillis();
+        	sb.append("Word: " + term + "\n");
+        	sb.append("includeTitles: " + includeTitles + "\n");
+        	sb.append("includeAuthors: " + includeAuthors + "\n");
+        	sb.append("Simple search time execution= " + (end - start) + "\n");
+        	sb.append("***********************\n");
+        	sb.append("\n");
+        	logger.info(sb.toString());
+        	
+        }
+	}
+	
+	private void insertTitle(Entity ent, Attribute att, String description){
+		if(resultMap.get("Title") == null){
+			resultMap.put("Title", new ResultSet("Title"));
+		}
+		resultMap.get("Title").setTuple(ent, att);
+		resultMap.get("Title").setDescription(ent, description);
+		counter++;
+	}
+	
+	private void insertPerson(Entity ent, Attribute att, String description){
+		List<String> roleNameList = getCache().getRoleList(ent.getId());
+		for(String roleName : getCache().getRoleList(ent.getId())){
+			if(resultMap.get(roleName) == null){
+				resultMap.put(roleName, new ResultSet(roleName));
+			}
+			resultMap.get(roleName).setTuple(ent, att);
+			resultMap.get(roleName).setDescription(ent, description);
+		}
+		if(roleNameList.isEmpty()){
+			if(resultMap.get(NO_ROLE_PERSON) == null){
+				resultMap.put(NO_ROLE_PERSON, new ResultSet(NO_ROLE_PERSON));
+			}
+			resultMap.get(NO_ROLE_PERSON).setTuple(ent, att);
+			resultMap.get(NO_ROLE_PERSON).setDescription(ent, description);
+		}
+		counter++;
+	}
+	
+    public List<String> getResultSetNames(){
+    	return this.resultSetNames;
+    }
+    
+    /**
+     * TODO do it more clever!
+     * rules:
+     * ----Text
+     * is_prime_alias_title_of
+     * is_alias_title_of
+     * is_alias_incipit_of
+     * is_alias_explicit_of
+     * ----Person
+     * is_prime_alias_name_of
+     * is_alias_name_of
+     * @param alias
+     * @return
+     */
+    private AliasStructure getAliasStructure(Entity alias, Attribute att) throws Exception{
+    	AliasStructure structure = new AliasStructure();
+    	structure.aliasAtt = att;
+    	List<Relation> list = null;
+    	list = getWrapper().getSourceRelations(alias, "is_prime_alias_title_of", "TEXT", 1);
+    	if(list.size() > 0)
+    		structure.setRelation(list.get(0));
+    	list = getWrapper().getSourceRelations(alias, "is_alias_title_of", "TEXT", 1);
+    	if(list.size() > 0)
+    		structure.setRelation(list.get(0));
+    	list = getWrapper().getSourceRelations(alias, "is_alias_incipit_of", "TEXT", 1);
+    	if(list.size() > 0)
+    		structure.setRelation(list.get(0));
+    	list = getWrapper().getSourceRelations(alias, "is_alias_explicit_of", "TEXT", 1);
+    	if(list.size() > 0)
+    		structure.setRelation(list.get(0));
+    	list = getWrapper().getSourceRelations(alias, "is_prime_alias_name_of", "PERSON", 1);
+    	if(list.size() > 0)
+    		structure.setRelation(list.get(0));
+        list = getWrapper().getSourceRelations(alias, "is_alias_name_of", "PERSON", 1); 
+    	if(list.size() > 0)
+    		structure.setRelation(list.get(0));
+    	return structure;
+    }
+    
+    public int getMaxResult() {
+		return maxResult;
+	}
+
+	public void setMaxResult(int maxResult) {
+		this.maxResult = maxResult;
+	}
+    public int getCounter() {
+		return counter;
+	}
+
+	public void setCounter(int counter) {
+		this.counter = counter;
+	}	
+	
+	
+	public Map<String, ResultSet> getResultMap() {
+		return resultMap;
+	}
+
+
+	public void setResultMap(Map<String, ResultSet> resultMap) {
+		this.resultMap = resultMap;
+	}
+	
+	private class AliasStructure{
+		public Entity target = null;
+		public Entity alias = null;
+		public Relation rel = null;
+		public String description = "";
+		public Attribute aliasAtt = null;
+		
+		public void setRelation(Relation rel){
+			this.rel = rel;
+			this.target = rel.getTarget();
+			this.alias = rel.getSource();
+			this.description = rel.getOwnValue() + " <- ALIAS [alias=" +  aliasAtt.getOwnValue() + "]";
+		}
+	}
+	
+	static{
+		filter1.setEntObjectClass("PERSON");
+    	filter1.setName("name");
+    	//filter1.setNormalize(true);
+    	
+    	filter2.setEntObjectClass("TEXT");
+    	filter2.setName("title");
+    	//filter2.setNormalize(true);
+    	
+    	filter3.setEntObjectClass("PERSON");
+    	filter3.setName("name_translit");
+    	
+    	//filter3.setNormalize(true);
+    	
+    	filter4.setEntObjectClass("TEXT");
+    	filter4.setName("title_translit");
+    	
+    	//filter4.setNormalize(true);
+    	
+    	filter5.setEntObjectClass("TEXT");
+    	filter5.setName("full_title");
+    	
+    	//filter4.setNormalize(true);   
+    	
+    	filter6.setEntObjectClass("TEXT");
+    	filter6.setName("full_title_translit");
+    	
+    	
+    	//filers for alias
+    	filter7.setEntObjectClass("ALIAS");
+    	filter7.setName("alias");
+    	
+    	authorsFilters.add(filter1);
+    	authorsFilters.add(filter3);
+    	authorsFilters.add(filter7);
+    	
+    	titlesFilters.add(filter2);
+    	titlesFilters.add(filter4);
+    	titlesFilters.add(filter5);
+    	titlesFilters.add(filter6);
+    	titlesFilters.add(filter7);
+    	
+    	/*
+    	filter1.setOwnValue(search);
+    	filter2.setOwnValue(search);
+    	filter3.setOwnValue(search);
+    	filter4.setOwnValue(search);
+    	filter5.setOwnValue(search);
+    	filter6.setOwnValue(search);
+    	filter7.setOwnValue(search);
+    	*/
+    	
+    	filters.add(filter1);
+    	filters.add(filter2);
+    	filters.add(filter3);
+    	filters.add(filter4);
+    	filters.add(filter5);
+    	filters.add(filter6);
+    	filters.add(filter7);
+	}
+}