1
|
1 package de.mpiwg.itgroup.ismi.search.beans;
|
|
2
|
|
3 import java.io.Serializable;
|
|
4 import java.util.ArrayList;
|
|
5 import java.util.Collections;
|
|
6 import java.util.List;
|
|
7
|
|
8 import org.apache.commons.lang.StringUtils;
|
|
9 import org.mpi.openmind.repository.bo.Entity;
|
|
10 import org.mpi.openmind.repository.utils.NormalizerUtils;
|
|
11 import org.mpi.openmind.search.utils.ResultEntry;
|
|
12 import org.mpi.openmind.search.utils.SAttributeMultipleName;
|
|
13 import org.mpi.openmind.search.utils.SAttributeUniqueName;
|
|
14 import org.mpi.openmind.search.utils.SEntity;
|
|
15 import org.mpi.openmind.search.utils.SRelLongKey;
|
|
16 import org.mpi.openmind.search.utils.SRelation;
|
|
17 import org.mpi.openmind.search.utils.SRelationMultipleName;
|
|
18 import org.mpi.openmind.search.utils.SRelationUniqueName;
|
|
19
|
|
20 import de.mpiwg.itgroup.ismi.entry.beans.ApplicationBean;
|
|
21
|
|
22 /**
|
|
23 * 2) List of all witnesses for a title
|
|
24 * (the list should distinguish which witnesses go with a particular title version)
|
|
25 * @author jurzua
|
|
26 *
|
|
27 */
|
|
28 public class Witness4TitleQuery extends AbstractQuery implements Serializable{
|
|
29
|
|
30 private static final long serialVersionUID = -1460003809678104919L;
|
|
31
|
|
32 private String titleName;
|
|
33 private List<SRelLongKey> titleWitnessKeyList;
|
|
34
|
|
35 public Witness4TitleQuery(ApplicationBean appBean){
|
|
36 super(appBean);
|
|
37 this.exportUrlRoot = ApplicationBean.urlISMIExportServiceTitles;
|
|
38 }
|
|
39
|
|
40 @Override
|
|
41 public void reset(){
|
|
42 super.reset();
|
|
43 this.titleName = null;
|
|
44 this.rs = null;
|
|
45 this.titleWitnessKeyList = null;
|
|
46 }
|
|
47
|
|
48 @Override
|
|
49 protected void search(){
|
|
50
|
|
51 List<ResultEntry> rs0 = this.execute01(titleName);
|
|
52 List<ResultEntry> rs1 = null;
|
|
53 if(StringUtils.isNotEmpty(titleName)){
|
|
54 rs1 = this.execute02(titleName);
|
|
55 }
|
|
56 rs = loadResultSet(rs0, rs1);
|
|
57
|
|
58 List<Long> idLongList = new ArrayList<Long>();
|
|
59 for(Object e : rs){
|
|
60 ResultEntry02 entry = (ResultEntry02)e;
|
|
61 if(!idLongList.contains(entry.titleId))
|
|
62 idLongList.add(entry.titleId);
|
|
63 }
|
|
64 this.idList = ApplicationBean.generateIdList(idLongList);
|
|
65
|
|
66 this.exportDirkUrl = ApplicationBean.generateExportURL(exportUrlRoot, idList, "xml");
|
|
67 }
|
|
68
|
|
69 private List<ResultEntry02> loadResultSet(List<ResultEntry> rs0, List<ResultEntry> rs1){
|
|
70 List<ResultEntry02> currentRs = new ArrayList<ResultEntry02>();
|
|
71 titleWitnessKeyList = new ArrayList<SRelLongKey>();
|
|
72
|
|
73 int count = 0;
|
|
74
|
|
75 for(ResultEntry re : rs0){
|
|
76 Entity title = getOm().getEntityById(re.getEntMap().get(0));
|
|
77 Entity witness = getOm().getEntityById(re.getEntMap().get(1));
|
|
78
|
|
79 List<Entity> subjectList = getOm().getTargetsForSourceRelation(title.getId(), "has_subject", "SUBJECT", 1);
|
|
80 String subject = (subjectList.size() == 0) ? null : subjectList.get(0).getOwnValue();
|
|
81
|
|
82 currentRs.add(new ResultEntry02(title, witness, subject));
|
|
83 putTitleWitnessKeyList(title.getId(), witness.getId());
|
|
84 count++;
|
|
85 if(count >= MAX_RS){
|
|
86 break;
|
|
87 }
|
|
88 }
|
|
89
|
|
90 if(rs1 != null && count < MAX_RS){
|
|
91 for(ResultEntry re : rs1){
|
|
92 Entity title = getOm().getEntityById(re.getEntMap().get(0));
|
|
93 Entity witness = getOm().getEntityById(re.getEntMap().get(1));
|
|
94 if(!containsTitleWitnessKeyList(title.getId(), witness.getId())){
|
|
95
|
|
96 Entity alias = getOm().getEntityById(re.getEntMap().get(1));
|
|
97 String alias2Person = re.getRel(1, 0);
|
|
98 List<Entity> subjectList = getOm().getTargetsForSourceRelation(title.getId(), "has_subject", "SUBJECT", 1);
|
|
99 String subject = (subjectList.size() == 0) ? null : subjectList.get(0).getOwnValue();
|
|
100
|
|
101 currentRs.add(new ResultEntry02(title, witness, subject, alias.getOwnValue(), alias2Person));
|
|
102 putTitleWitnessKeyList(title.getId(), witness.getId());
|
|
103 count++;
|
|
104 if(count >= MAX_RS){
|
|
105 break;
|
|
106 }
|
|
107 }
|
|
108 }
|
|
109 }
|
|
110
|
|
111 Collections.sort(currentRs);
|
|
112
|
|
113 return currentRs;
|
|
114 }
|
|
115
|
|
116 private void putTitleWitnessKeyList(Long titleId, Long witness){
|
|
117 titleWitnessKeyList.add(new SRelLongKey(titleId, witness));
|
|
118 }
|
|
119
|
|
120 private boolean containsTitleWitnessKeyList(Long titleId, Long witnessId){
|
|
121 return titleWitnessKeyList.contains(new SRelLongKey(titleId, witnessId));
|
|
122 }
|
|
123
|
|
124 private List<ResultEntry> execute01(String titleName){
|
|
125
|
|
126 List<SEntity> entFilters = new ArrayList<SEntity>();
|
|
127 List<SRelation> relFilters = new ArrayList<SRelation>();
|
|
128
|
|
129
|
|
130 SEntity text = new SEntity(0, "TEXT");
|
|
131 if(StringUtils.isNotEmpty(titleName)){
|
|
132 text.addAtt(new SAttributeMultipleName(titleName, "full_title_translit", "full_title"));
|
|
133 }
|
|
134 entFilters.add(text);
|
|
135
|
|
136 SEntity witness = new SEntity(1, "WITNESS");
|
|
137 entFilters.add(witness);
|
|
138
|
|
139 SRelationUniqueName is_exemplar_of = new SRelationUniqueName(witness, text, "is_exemplar_of");
|
|
140 relFilters.add(is_exemplar_of);
|
|
141
|
|
142 return this.appBean.getSS().search(entFilters, relFilters);
|
|
143 }
|
|
144
|
|
145 private List<ResultEntry> execute02(String titleName){
|
|
146
|
|
147 List<SEntity> entFilters = new ArrayList<SEntity>();
|
|
148 List<SRelation> relFilters = new ArrayList<SRelation>();
|
|
149
|
|
150
|
|
151 SEntity text = new SEntity(0, "TEXT");
|
|
152 entFilters.add(text);
|
|
153
|
|
154 SEntity alias = new SEntity(1, "ALIAS");
|
|
155 alias.addAtt(new SAttributeUniqueName("alias", titleName));
|
|
156 entFilters.add(alias);
|
|
157
|
|
158 SEntity witness = new SEntity(2, "WITNESS");
|
|
159 entFilters.add(witness);
|
|
160
|
|
161 SRelationMultipleName is_alias = new SRelationMultipleName(alias, text,
|
|
162 "is_prime_alias_title_of", "is_alias_title_of",
|
|
163 "is_alias_explicit_of", "is_alias_incipit_of");
|
|
164 SRelationUniqueName is_exemplar_of = new SRelationUniqueName(witness, text, "is_exemplar_of");
|
|
165 relFilters.add(is_exemplar_of);
|
|
166 relFilters.add(is_alias);
|
|
167
|
|
168 return this.appBean.getSS().search(entFilters, relFilters);
|
|
169 }
|
|
170
|
|
171 public class ResultEntry02 implements Comparable<ResultEntry02>, Serializable{
|
|
172 private static final long serialVersionUID = -2672042198162179468L;
|
|
173
|
|
174 public Long titleId;
|
|
175 public String titleOv;
|
|
176 public String titleNOv;
|
|
177 public String alias;
|
|
178 public String alias2Title;
|
|
179 public Long witnessId;
|
|
180 public String witnessOv;
|
|
181 public String witnessNOv;
|
|
182 public String subject;
|
|
183
|
|
184 public ResultEntry02(Entity title, Entity witness, String subject){
|
|
185 this.set(title, witness, subject);
|
|
186
|
|
187 }
|
|
188
|
|
189 public ResultEntry02(Entity title, Entity witness, String subject, String alias, String alias2Title){
|
|
190 this.set(title, witness, subject);
|
|
191 this.alias = alias;
|
|
192 this.alias2Title = alias2Title;
|
|
193 }
|
|
194
|
|
195 private void set(Entity title, Entity witness, String subject){
|
|
196 this.subject = subject;
|
|
197
|
|
198 this.titleId = title.getId();
|
|
199 this.titleOv = title.getOwnValue();
|
|
200 this.titleNOv = title.getNormalizedOwnValue();
|
|
201
|
|
202 this.witnessId = witness.getId();
|
|
203 this.witnessOv = witness.getOwnValue();
|
|
204 this.witnessNOv = witness.getNormalizedOwnValue();
|
|
205 }
|
|
206
|
|
207 @Override
|
|
208 public int compareTo(ResultEntry02 o) {
|
|
209 if(!this.titleId.equals(o.titleId)){
|
|
210
|
|
211 //comparing subject
|
|
212 if(StringUtils.isNotEmpty(subject) && StringUtils.isNotEmpty(o.subject)){
|
|
213 int comparisonSubject = this.subject.compareTo(o.subject);
|
|
214 if(comparisonSubject != 0){
|
|
215 return comparisonSubject;
|
|
216 }
|
|
217 }else{
|
|
218 if(StringUtils.isNotEmpty(subject)){
|
|
219 return -1;
|
|
220 }else if(StringUtils.isNotEmpty(o.subject)){
|
|
221 return 1;
|
|
222 }
|
|
223 }
|
|
224
|
|
225 //comparing title
|
|
226 int comparisonTitle = NormalizerUtils.normalizedToCompare(titleNOv).compareTo(
|
|
227 NormalizerUtils.normalizedToCompare(o.titleNOv));
|
|
228 if(comparisonTitle != 0){
|
|
229 return comparisonTitle;
|
|
230 }
|
|
231 }else{
|
|
232 if(!this.witnessId.equals(o.witnessId)){
|
|
233 //comparing witness
|
|
234 int comparisonWitness = NormalizerUtils.normalizedToCompare(titleNOv).compareTo(
|
|
235 NormalizerUtils.normalizedToCompare(o.titleNOv));
|
|
236 return comparisonWitness;
|
|
237 }
|
|
238 }
|
|
239 return 0;
|
|
240 }
|
|
241
|
|
242 public Long getTitleId() {
|
|
243 return titleId;
|
|
244 }
|
|
245
|
|
246 public String getTitleOv() {
|
|
247 return titleOv;
|
|
248 }
|
|
249
|
|
250 public String getTitleNOv() {
|
|
251 return titleNOv;
|
|
252 }
|
|
253
|
|
254 public String getAlias() {
|
|
255 return alias;
|
|
256 }
|
|
257
|
|
258 public String getAlias2Title() {
|
|
259 return alias2Title;
|
|
260 }
|
|
261
|
|
262 public Long getWitnessId() {
|
|
263 return witnessId;
|
|
264 }
|
|
265
|
|
266 public String getWitnessOv() {
|
|
267 return witnessOv;
|
|
268 }
|
|
269
|
|
270 public String getWitnessNOv() {
|
|
271 return witnessNOv;
|
|
272 }
|
|
273
|
|
274 public String getSubject() {
|
|
275 return subject;
|
|
276 }
|
|
277 }
|
|
278
|
|
279 public String getTitleName() {
|
|
280 return titleName;
|
|
281 }
|
|
282
|
|
283 public void setTitleName(String titleName) {
|
|
284 this.titleName = titleName;
|
|
285 }
|
|
286 }
|