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

(none)
author jurzua
date Wed, 29 Oct 2014 14:00:28 +0000
parents
children 4aa8c425685d
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/Titles4PersonQuery.java	Wed Oct 29 14:00:28 2014 +0000
@@ -0,0 +1,473 @@
+package de.mpiwg.itgroup.ismi.search.beans;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.faces.model.SelectItem;
+
+import org.apache.commons.lang.StringUtils;
+import org.mpi.openmind.repository.bo.Entity;
+import org.mpi.openmind.repository.bo.Relation;
+import org.mpi.openmind.repository.utils.NormalizerUtils;
+import org.mpi.openmind.search.utils.ResultEntry;
+import org.mpi.openmind.search.utils.SAttributeMultipleName;
+import org.mpi.openmind.search.utils.SAttributeUniqueName;
+import org.mpi.openmind.search.utils.SEntity;
+import org.mpi.openmind.search.utils.SRelLongKey;
+import org.mpi.openmind.search.utils.SRelation;
+import org.mpi.openmind.search.utils.SRelationMultipleName;
+import org.mpi.openmind.search.utils.SRelationUniqueName;
+
+import de.mpiwg.itgroup.ismi.entry.beans.ApplicationBean;
+
+public class Titles4PersonQuery extends AbstractQuery implements Serializable{
+	
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = -5342126098161866749L;
+	private String personName;
+	private String roleName = "Author";
+	private static List<SelectItem> roleList;
+	private List<SRelLongKey> personTitleKeyList;
+	
+	private boolean displayCodex = false;
+	private boolean displayAlias = false;
+	
+	public Titles4PersonQuery(ApplicationBean appBean){
+		super(appBean);
+		this.exportUrlRoot = ApplicationBean.urlISMIExportServiceAuthors;
+	}
+	
+	//"Author", "Annotator", "Copyist", "Corrector", "Dedicatee", "Illuminator", "Illustrator", "Owner", "Patron", "inspector"
+	static{
+		roleList = new ArrayList<SelectItem>();
+		roleList.add(new SelectItem("Author"));
+		roleList.add(new SelectItem("Annotator"));
+		roleList.add(new SelectItem("Copyist"));
+		roleList.add(new SelectItem("Corrector"));
+		roleList.add(new SelectItem("Dedicatee"));
+		roleList.add(new SelectItem("Illuminator"));
+		roleList.add(new SelectItem("Illustrator"));
+		roleList.add(new SelectItem("Owner"));
+		roleList.add(new SelectItem("Patron"));
+		roleList.add(new SelectItem("Inspector"));
+	}
+	
+	@Override
+	public void reset(){
+		super.reset();
+		this.personName = null;
+		this.roleName = "Author";
+		this.rs = null;
+		this.personTitleKeyList = null;
+		this.displayAlias = false;
+		this.displayCodex = false;
+	}
+	
+	@Override
+	protected void search(){
+		
+		this.displayAlias = false;
+		this.displayCodex = false;
+		
+		List<ResultEntry> rs0 = this.execute01(personName, roleName);
+		List<ResultEntry> rs1 = null;
+		if(StringUtils.isNotEmpty(personName)){
+			rs1 = this.execute02(personName, roleName);
+		}
+		rs = loadResultSet(rs0, rs1);
+		
+		List<Long> idLongList = new ArrayList<Long>();
+		for(Object e : rs){
+			Titles4PersonEntry entry = (Titles4PersonEntry)e;
+			if(!idLongList.contains(entry.getPersonId()))
+				idLongList.add(entry.getPersonId());
+		}
+		this.idList = ApplicationBean.generateIdList(idLongList);
+		
+		this.exportDirkUrl = ApplicationBean.generateExportURL(exportUrlRoot, idList, "xml");
+	}
+	
+	
+	
+	private List<Titles4PersonEntry> loadResultSet(List<ResultEntry> rs0, List<ResultEntry> rs1){
+		List<Titles4PersonEntry> currentRS = new ArrayList<Titles4PersonEntry>();
+		
+		List<Long> personIdList = new ArrayList<Long>();
+		
+		
+		for(ResultEntry re : rs0){
+			Entity person = getOm().getEntityById(re.getEntMap().get(1));
+			personIdList.add(person.getId());
+			currentRS.addAll(getEntryFromPerson(person, null, null, this.roleName));
+		}
+		
+		if(rs1 != null){
+			for(ResultEntry re : rs1){
+				Entity person = getOm().getEntityById(re.getEntMap().get(1));
+				if(!personIdList.contains(person.getId())){
+					String alias = getOm().getEntityById(re.getEntMap().get(2)).getOwnValue();
+					String alias2Person = re.getRel(2, 1);
+					currentRS.addAll(getEntryFromPerson(person, alias, alias2Person, this.roleName));
+					this.displayAlias = true;
+				}
+			}
+		}
+			
+		return currentRS;
+	}
+	
+	
+	/**
+	 * Possible ways to find a title from a given person
+	 * 1- TEXT is_exemplar_of WITNESS is_part_of CODEX owned_by PERSON
+	 * 2-
+	 * TEXT was_created_by PERSON
+	 * TEXT had_patron PERSON
+	 * TEXT was_dedicated_to PERSON
+	 */
+	private List<Titles4PersonEntry> getEntryFromPerson(Entity person, String alias, String alias2Person, String role){
+		//rs.add(new Titles4PersonEntry(person, title, title2Person, codex, codex2Person, alias, alias2Person, role, subject, ));
+		List<Titles4PersonEntry> rs = new ArrayList<Titles4PersonQuery.Titles4PersonEntry>();
+		
+		List<Entity> entList = getOm().getSourcesForTargetRelation(person.getId(), "was_created_by", "TEXT", -1);
+		for(Entity title : entList){
+			String subject = getSubject(title);
+			rs.add(new Titles4PersonEntry(person, title, alias, alias2Person, role, subject, "TEXT was_created_by PERSON"));
+		}
+		
+		entList = getOm().getSourcesForTargetRelation(person.getId(), "had_patron", "TEXT", -1);
+		for(Entity title : entList){
+			String subject = getSubject(title);
+			rs.add(new Titles4PersonEntry(person, title, alias, alias2Person, role, subject, "TEXT had_patron PERSON"));
+		}
+		
+		
+		entList = getOm().getSourcesForTargetRelation(person.getId(), "was_dedicated_to", "TEXT", -1);
+		for(Entity title : entList){
+			String subject = getSubject(title);
+			rs.add(new Titles4PersonEntry(person, title, alias, alias2Person, role, subject, "TEXT was_dedicated_to PERSON"));
+		}		
+		
+		entList = getOm().getSourcesForTargetRelation(person.getId(), "owned_by", "CODEX", -1);
+		for(Entity codex : entList){
+			List<Entity> witnessList = getOm().getSourcesForTargetRelation(codex.getId(), "is_part_of", "WITNESS", -1);
+			for(Entity witness : witnessList){
+				List<Entity> textList = getOm().getTargetsForSourceRelation(witness.getId(), "is_exemplar_of", "TEXT", -1);
+				for(Entity title : textList){
+					String subject = getSubject(title); 
+					rs.add(new Titles4PersonEntry(person, title, codex, witness, alias, alias2Person, role, subject, 
+							"TEXT is_exemplar_of WITNESS is_part_of CODEX owned_by PERSON"));
+					this.displayCodex = true;
+					System.out.println("this.displayCodex = true;");
+				}
+			}	
+		}
+		
+		return rs;
+	}
+	
+	private String getSubject(Entity title){
+		List<Entity> subjectList = getOm().getTargetsForSourceRelation(title.getId(), "has_subject", "SUBJECT", 1);
+		return (subjectList.size() == 0) ? null : subjectList.get(0).getOwnValue();
+	}
+	
+	private List<ResultEntry> execute01(String personName, String roleName){
+		
+		List<SEntity> entFilters = new ArrayList<SEntity>();
+		List<SRelation> relFilters = new ArrayList<SRelation>();
+		
+		//The user can select between: 
+		//"Author", "Annotator", "Copyist", "Corrector", "Dedicatee", "Illuminator", "Illustrator", "Owner", "Patron", "inspector"
+		SEntity role = new SEntity(0, "ROLE");
+		role.addAtt(new SAttributeUniqueName("name", roleName));
+		entFilters.add(role);
+		
+		//alias, "is_prime_alias_name_of", "PERSON"
+		//alias, "is_alias_name_of", "PERSON"
+		SEntity person = new SEntity(1, "PERSON");
+		if(StringUtils.isNotEmpty(personName)){
+			person.addAtt(new SAttributeMultipleName(personName, "name_translit", "name"));
+		}
+		entFilters.add(person);
+		
+		SRelationUniqueName has_role = new SRelationUniqueName(person, role, "has_role");
+		relFilters.add(has_role);
+		
+		return this.appBean.getSS().search(entFilters, relFilters);		
+	}
+	
+	private List<ResultEntry> execute02(String personName, String roleName){
+		
+		List<SEntity> entFilters = new ArrayList<SEntity>();
+		List<SRelation> relFilters = new ArrayList<SRelation>();
+		
+		//The user can select between: 
+		//"Author", "Annotator", "Copyist", "Corrector", "Dedicatee", "Illuminator", "Illustrator", "Owner", "Patron", "inspector"
+		SEntity role = new SEntity(0, "ROLE");
+		role.addAtt(new SAttributeUniqueName("name", roleName));
+		entFilters.add(role);
+		
+		//alias, "is_prime_alias_name_of", "PERSON"
+		//alias, "is_alias_name_of", "PERSON"
+		SEntity person = new SEntity(1, "PERSON");
+		entFilters.add(person);
+		
+		SEntity alias = new SEntity(2, "ALIAS");
+		alias.addAtt(new SAttributeUniqueName("alias", personName));
+		entFilters.add(alias);
+		
+		SRelationMultipleName is_alias = new SRelationMultipleName(alias, person, "is_alias_name_of", "is_prime_alias_name_of");
+		SRelationUniqueName has_role = new SRelationUniqueName(person, role, "has_role");
+		relFilters.add(has_role);
+		relFilters.add(is_alias);
+		
+		return this.appBean.getSS().search(entFilters, relFilters);		
+	}
+	
+	public String getPersonName() {
+		return personName;
+	}
+
+	public void setPersonName(String personName) {
+		this.personName = personName;
+	}
+
+	public String getRoleName() {
+		return roleName;
+	}
+
+	public void setRoleName(String roleName) {
+		this.roleName = roleName;
+	}
+
+	public List<SRelLongKey> getPersonTitleKeyList() {
+		return personTitleKeyList;
+	}
+
+	public void setPersonTitleKeyList(List<SRelLongKey> personTitleKeyList) {
+		this.personTitleKeyList = personTitleKeyList;
+	}
+
+	public List<SelectItem> getRoleList() {
+		return roleList;
+	}
+
+	public boolean isDisplayCodex() {
+		return displayCodex;
+	}
+
+	public boolean isDisplayAlias() {
+		return displayAlias;
+	}
+
+
+
+	public class Titles4PersonEntry implements Comparable<Titles4PersonEntry>, Serializable{
+		private static final long serialVersionUID = 7798695003500406910L;
+		
+		private Long personId;
+		private String personOv;
+		private String personNOv;
+		
+		private Long titleId;
+		private String titleOv;
+		private String titleNOv;
+		
+		private Long codexId;
+		private String codexOv;
+		private String codex2Person;
+		
+		private Long witnessId;
+		private String witnessOv;
+		private String witnessNOv;
+		
+		private String alias;
+		private String alias2Person;
+		
+		private String role;
+		//private String title2Person;
+		private String subject;
+		
+		
+		
+		private String query;
+		
+		public Titles4PersonEntry(
+				Entity person,
+				Entity title,
+				Entity codex,
+				Entity witness,
+				String alias,
+				String alias2Person,
+				String role,
+				String subject,
+				String query
+				){
+			
+			set(person, title);
+			this.alias = alias;
+			this.alias2Person = alias2Person;
+			this.role = role;
+			this.subject = subject;
+			this.query = query;
+			if(codex != null){
+				this.codexId = codex.getId();
+				this.codexOv = codex.getOwnValue();
+			}
+			if(witness != null){
+				this.witnessId = witness.getId();
+				this.witnessOv = witness.getOwnValue();
+				this.witnessNOv = witness.getNormalizedOwnValue();
+			}
+		}
+		
+		public Titles4PersonEntry(
+				Entity person,
+				Entity title,
+				String alias,
+				String alias2Person,
+				String role,
+				String subject,
+				String query
+				){
+			
+			set(person, title);
+			this.alias = alias;
+			this.alias2Person = alias2Person;
+			this.role = role;
+			this.subject = subject;
+			this.query = query;
+		}
+		
+		private void set(Entity person, Entity title){
+			this.personId = person.getId();
+			this.personOv = person.getOwnValue();
+			this.personNOv = person.getNormalizedOwnValue();
+			
+			this.titleId = title.getId();
+			this.titleOv = title.getOwnValue();
+			this.titleNOv = title.getNormalizedOwnValue();
+		}
+		
+		public Long getPersonId() {
+			return personId;
+		}
+
+		public String getPersonOv() {
+			return personOv;
+		}
+
+		public String getPersonNOv() {
+			return personNOv;
+		}
+
+		public String getAlias() {
+			return alias;
+		}
+
+		public String getAlias2Person() {
+			return alias2Person;
+		}
+
+		public Long getTitleId() {
+			return titleId;
+		}
+
+		public String getTitleOv() {
+			return titleOv;
+		}
+
+		public String getTitleNOv() {
+			return titleNOv;
+		}
+
+		public String getRole() {
+			return role;
+		}
+
+		public String getSubject() {
+			return subject;
+		}
+		
+		public Long getCodexId() {
+			return codexId;
+		}
+
+		public String getCodexOv() {
+			return codexOv;
+		}
+
+		
+		public String getCodex2Person() {
+			return codex2Person;
+		}
+		
+		public String getQuery() {
+			return query;
+		}
+		
+		public Long getWitnessId() {
+			return witnessId;
+		}
+
+		public String getWitnessOv() {
+			return witnessOv;
+		}
+
+		public String getWitnessNOv() {
+			return witnessNOv;
+		}
+
+		@Override
+		public int compareTo(Titles4PersonEntry o) {
+			if(!this.personId.equals(o.personId)){
+				
+				int comparisonPerson = NormalizerUtils.normalizedToCompare(personNOv).compareTo(
+						NormalizerUtils.normalizedToCompare(o.personNOv));
+				if(comparisonPerson != 0){
+					return comparisonPerson;
+				}else{
+					if(StringUtils.isNotEmpty(role) && StringUtils.isNotEmpty(o.role)){
+						int comparisonRole = this.role.compareTo(o.role);
+						if(comparisonRole != 0){
+							return comparisonRole;
+						}
+					}else{
+						if(StringUtils.isNotEmpty(role)){
+							return -1;
+						}else if(StringUtils.isNotEmpty(o.role)){
+							return 1;
+						}	
+					}
+				}
+			}else{
+				if(!this.titleId.equals(o.titleId)){
+					//comparing subject
+					if(StringUtils.isNotEmpty(subject) && StringUtils.isNotEmpty(o.subject)){
+						int comparisonSubject = this.subject.compareTo(o.subject);
+						if(comparisonSubject != 0){
+							return comparisonSubject;
+						}
+					}else{
+						if(StringUtils.isNotEmpty(subject)){
+							return -1;
+						}else if(StringUtils.isNotEmpty(o.subject)){
+							return 1;
+						}	
+					}	
+					//comparing title
+					int comparisonTitle = NormalizerUtils.normalizedToCompare(titleNOv).compareTo(
+							NormalizerUtils.normalizedToCompare(o.titleNOv));
+					return comparisonTitle;
+				}
+			}
+			return 0;
+		}
+	}
+	
+}