Author: gttersen
Date: 2007-05-08 16:54:07 +0200 (Tue, 08 May 2007)
New Revision: 5019
Modified:
branches/2.12/core-api/src/main/java/no/schibstedsok/searchportal/mode/command/NavigationCommand.java
branches/2.12/core-api/src/main/java/no/schibstedsok/searchportal/mode/command/NewsAggregatorSearchCommand.java
Log:
NewsAggregator changes
Modified:
branches/2.12/core-api/src/main/java/no/schibstedsok/searchportal/mode/command/NavigationCommand.java
===================================================================
---
branches/2.12/core-api/src/main/java/no/schibstedsok/searchportal/mode/command/NavigationCommand.java
2007-05-08 12:55:26 UTC (rev 5018)
+++
branches/2.12/core-api/src/main/java/no/schibstedsok/searchportal/mode/command/NavigationCommand.java
2007-05-08 14:54:07 UTC (rev 5019)
@@ -1,6 +1,7 @@
package no.schibstedsok.searchportal.mode.command;
import no.schibstedsok.searchportal.datamodel.generic.StringDataObject;
+import no.schibstedsok.searchportal.datamodel.generic.StringDataObjectSupport;
import no.schibstedsok.searchportal.mode.config.NavigationCommandConfig;
import no.schibstedsok.searchportal.result.FastSearchResult;
import no.schibstedsok.searchportal.result.Modifier;
@@ -142,6 +143,7 @@
match = true;
if (selectedValue == null &&
option.isDefaultSelect()) {
navigator.setSelected(true);
+ selectedValue = new
StringDataObjectSupport("dummy");
}
if (option.getDisplayName() != null) {
navigator.setName(option.getDisplayName());
Modified:
branches/2.12/core-api/src/main/java/no/schibstedsok/searchportal/mode/command/NewsAggregatorSearchCommand.java
===================================================================
---
branches/2.12/core-api/src/main/java/no/schibstedsok/searchportal/mode/command/NewsAggregatorSearchCommand.java
2007-05-08 12:55:26 UTC (rev 5018)
+++
branches/2.12/core-api/src/main/java/no/schibstedsok/searchportal/mode/command/NewsAggregatorSearchCommand.java
2007-05-08 14:54:07 UTC (rev 5019)
@@ -23,6 +23,11 @@
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Date;
import java.util.HashMap;
import java.util.List;
@@ -87,10 +92,14 @@
}
private SearchResult getClusterResult(NewsAggregatorCommandConfig config,
StringDataObject clusterId, String xmlFile) {
+ SearchResult searchResult;
try {
final NewsAggregatorXmlParser newsAggregatorXmlParser = new
NewsAggregatorXmlParser();
final InputStream inputStream = getInputStream(config, xmlFile);
- SearchResult searchResult =
newsAggregatorXmlParser.parseCluster(config, inputStream,
clusterId.getString(), getOffset(), this);
+ final StringDataObject sortObject =
datamodel.getParameters().getValue(config.getUserSortParameter());
+ final String sort = sortObject == null ? null :
sortObject.getString();
+ searchResult = newsAggregatorXmlParser.parseCluster(config,
inputStream, clusterId.getString(), getOffset(), sort, this);
+ addSortModifiers((FastSearchResult) searchResult,
config.getUserSortParameter(), "relevance", "descending", "ascending");
if (searchResult != null && searchResult.getHitCount() > 0) {
return searchResult;
}
@@ -99,9 +108,19 @@
} catch (JDOMException e) {
LOG.debug("Falling back to search instead of xml parse", e);
}
- return search(config, clusterId.getString());
+ searchResult = search(config, clusterId.getString());
+ if (searchResult instanceof FastSearchResult) {
+ addSortModifiers((FastSearchResult) searchResult,
config.getUserSortParameter(), "descending", "ascending");
+ }
+ return searchResult;
}
+ private void addSortModifiers(FastSearchResult searchResult, String id,
String... modifierNames) {
+ for (String modifierName : modifierNames) {
+ searchResult.addModifier(id, new Modifier(modifierName, -1, null));
+ }
+ }
+
private SearchResult search(NewsAggregatorCommandConfig config, String
clusterId) {
LOG.debug("------ Running search to get clusters ---------");
LOG.debug("clusterId=" + clusterId);
@@ -119,8 +138,10 @@
private SearchResult getPageResult(NewsAggregatorCommandConfig config,
String xmlFile) {
final NewsAggregatorXmlParser newsAggregatorXmlParser = new
NewsAggregatorXmlParser();
+ SearchResult searchResult;
try {
- SearchResult searchResult =
newsAggregatorXmlParser.parseFullPage(config, getOffset(),
getInputStream(config, xmlFile), this);
+ searchResult = newsAggregatorXmlParser.parseFullPage(config,
getOffset(), getInputStream(config, xmlFile), this);
+ addSortModifiers((FastSearchResult) searchResult,
config.getUserSortParameter(), "descending", "ascending");
if (searchResult != null && searchResult.getHitCount() > 0) {
return searchResult;
}
@@ -129,7 +150,11 @@
} catch (IOException e) {
LOG.debug("Falling back to search instead of xml parse", e);
}
- return search(config, null);
+ searchResult = search(config, null);
+ if (searchResult instanceof FastSearchResult) {
+ addSortModifiers((FastSearchResult) searchResult,
config.getUserSortParameter(), "descending", "ascending");
+ }
+ return searchResult;
}
private InputStream getInputStream(NewsAggregatorCommandConfig config,
String xmlFile) throws IOException {
@@ -159,7 +184,7 @@
private static final String ATTRIBUTE_TYPE = "type";
private static final String ELEMENT_CATEGORY = "category";
private static final String ELEMENT_COLLAPSEID = "collapseid";
- private static final String ELEMENT_GEONAVIGATION = "geonavigation";
+ private static final String ATTRIBUTE_TIMESTAMP = "timestamp";
private static final String ATTRIBUTE_NAME = "name";
private static final String ATTRIBUTE_XML = "xml";
private static final String ELEMENT_COUNTS = "counts";
@@ -174,7 +199,7 @@
return saxBuilder.build(inputStream);
}
- public FastSearchResult parseCluster(NewsAggregatorCommandConfig
config, InputStream inputStream, String clusterId, int offset,
NewsAggregatorSearchCommand searchCommand) throws JDOMException, IOException {
+ public FastSearchResult parseCluster(NewsAggregatorCommandConfig
config, InputStream inputStream, String clusterId, int offset, String sort,
NewsAggregatorSearchCommand searchCommand) throws JDOMException, IOException {
try {
LOG.debug("Parsing cluster: " + clusterId);
final FastSearchResult searchResult = new
FastSearchResult(searchCommand);
@@ -183,7 +208,7 @@
List<Element> clusters = root.getChildren(ELEMENT_CLUSTER);
for (Element cluster : clusters) {
if
(cluster.getAttributeValue(ATTRIBUTE_CLUSTERID).equals(clusterId)) {
- handleFlatCluster(config, cluster, searchCommand,
searchResult, offset);
+ handleFlatCluster(config, cluster, searchCommand,
searchResult, offset, sort);
handleRelated(config,
cluster.getChild(ELEMENT_RELATED), searchResult);
break;
}
@@ -278,31 +303,42 @@
}
}
- private void handleFlatCluster(NewsAggregatorCommandConfig config,
Element cluster, SearchCommand searchCommand, SearchResult searchResult, int
offset) {
+ private void handleFlatCluster(NewsAggregatorCommandConfig config,
Element cluster, SearchCommand searchCommand, SearchResult searchResult, int
offset, String sort) {
if (cluster != null) {
final Element entryCollectionElement =
cluster.getChild(ELEMENT_ENTRY_COLLECTION);
if (entryCollectionElement != null) {
- int offsetCount = 0;
final List<Element> entryList =
entryCollectionElement.getChildren();
searchResult.setHitCount(entryList.size());
-
final HashMap<String, SearchResultItem> collapseMap = new
HashMap<String, SearchResultItem>();
- offset = config.isIgnoreOffset() ? 0 : offset;
- for (int i = offset; i < entryList.size(); i++) {
- Element entry = entryList.get(i);
+ final SearchResult tmpSearchResult = new
BasicSearchResult(searchCommand);
+ // Collecting all results from xml. (This must be done if
we want correct collpsing funtionality
+ for (Element entry : entryList) {
final SearchResultItem searchResultItem = new
BasicSearchResultItem();
handleEntry(entry, searchResultItem);
- if (addResult(config, searchResultItem, searchResult,
searchCommand, collapseMap)) {
- offsetCount++;
- }
+ addResult(config, searchResultItem, tmpSearchResult,
searchCommand, collapseMap, true);
}
- if (offsetCount < entryList.size()) {
- addNextOffsetField(offsetCount, searchResult);
+ sortResults(tmpSearchResult, sort);
+ offset = config.isIgnoreOffset() ? 0 : offset;
+ int lastIndex =
Math.min(tmpSearchResult.getResults().size(), offset +
config.getResultsToReturn());
+ for (int i = offset; i < lastIndex; i++) {
+
searchResult.addResult(tmpSearchResult.getResults().get(i));
}
+
+ if ((offset + config.getResultsToReturn()) <
tmpSearchResult.getResults().size()) {
+ addNextOffsetField(offset +
config.getResultsToReturn(), searchResult);
+ }
}
}
}
+ private void sortResults(SearchResult searchResult, String sort) {
+ if ("ascending".equals(sort)) {
+ Collections.sort(searchResult.getResults(),
DateFieldSearchResultComparator.getInstance());
+ } else if ("descending".equals(sort)) {
+ Collections.sort(searchResult.getResults(),
Collections.reverseOrder(DateFieldSearchResultComparator.getInstance()));
+ }
+ }
+
private int handleCluster(NewsAggregatorCommandConfig config, Element
cluster, SearchCommand searchCommand, SearchResult searchResult) {
if (cluster != null) {
final SearchResultItem searchResultItem = new
BasicSearchResultItem();
@@ -345,7 +381,7 @@
private void addResult(NewsAggregatorCommandConfig config,
SearchResultItem nestedResultItem,
SearchResult nestedSearchResult,
SearchCommand searchCommand) {
- addResult(config, nestedResultItem, nestedSearchResult,
searchCommand, null);
+ addResult(config, nestedResultItem, nestedSearchResult,
searchCommand, null, false);
}
@@ -353,7 +389,8 @@
SearchResultItem nestedResultItem,
SearchResult nestedSearchResult,
SearchCommand searchCommand,
- HashMap<String, SearchResultItem>
collapseMap) {
+ HashMap<String, SearchResultItem>
collapseMap,
+ boolean noMax) {
// Check if entry is duplicate and should be a subresult
SearchResultItem collapseParent = null;
String collapseId = nestedResultItem.getField(ELEMENT_COLLAPSEID);
@@ -362,7 +399,7 @@
}
if (collapseParent == null) {
// Skipping add if max returned results has been reached.
- if (nestedSearchResult.getResults().size() <
config.getResultsToReturn()) {
+ if (noMax || nestedSearchResult.getResults().size() <
config.getResultsToReturn()) {
// No duplicate in results or should not be collapsed
nestedSearchResult.addResult(nestedResultItem);
if (collapseMap != null) {
@@ -384,4 +421,45 @@
}
}
+ private static class DateFieldSearchResultComparator implements
Comparator<SearchResultItem> {
+ private final SimpleDateFormat sdf = new
SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
+ private static final String DATE_FIELD_NAME =
NewsAggregatorXmlParser.ATTRIBUTE_TIMESTAMP;
+ private static DateFieldSearchResultComparator myInstance = new
DateFieldSearchResultComparator();
+
+ public static DateFieldSearchResultComparator getInstance() {
+ return myInstance;
+ }
+
+ private DateFieldSearchResultComparator() {
+ }
+
+ public int compare(SearchResultItem resultItem1, SearchResultItem
resultItem2) {
+ String dateField1 = resultItem1.getField(DATE_FIELD_NAME);
+ String dateField2 = resultItem2.getField(DATE_FIELD_NAME);
+ if (dateField1 == null || dateField1.length() == 0) {
+ if (dateField2 == null || dateField2.length() == 0) {
+ return 0;
+ } else {
+ return -1;
+ }
+ } else {
+ if (dateField2 == null || dateField2.length() == 0) {
+ return 1;
+ } else {
+ try {
+ Date date1 = sdf.parse(dateField1);
+ Date date2 = sdf.parse(dateField2);
+ if (date1.before(date2)) {
+ return -1;
+ } else if (date1.after(date2)) {
+ return 1;
+ }
+ } catch (ParseException e) {
+ LOG.error("Could not parse date field, sort will not
work.", e);
+ }
+ return 0;
+ }
+ }
+ }
+ }
}
_______________________________________________
Kernel-commits mailing list
[email protected]
http://sesat.no/mailman/listinfo/kernel-commits