Author: daniele
Date: 2007-03-09 15:09:09 +0100 (Fri, 09 Mar 2007)
New Revision: 4556
Modified:
trunk/core-api/src/main/java/no/schibstedsok/searchportal/mode/command/CatalogueAdsSearchCommand.java
trunk/core-api/src/main/java/no/schibstedsok/searchportal/mode/command/CatalogueSearchCommand.java
Log:
fixed sponsorbugg, GULD-246, and a little fix for GULD-207
Modified:
trunk/core-api/src/main/java/no/schibstedsok/searchportal/mode/command/CatalogueAdsSearchCommand.java
===================================================================
---
trunk/core-api/src/main/java/no/schibstedsok/searchportal/mode/command/CatalogueAdsSearchCommand.java
2007-03-09 13:25:51 UTC (rev 4555)
+++
trunk/core-api/src/main/java/no/schibstedsok/searchportal/mode/command/CatalogueAdsSearchCommand.java
2007-03-09 14:09:09 UTC (rev 4556)
@@ -8,72 +8,210 @@
package no.schibstedsok.searchportal.mode.command;
-import no.schibstedsok.searchportal.datamodel.DataModel;
-import no.schibstedsok.searchportal.query.LeafClause;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import no.schibstedsok.searchportal.query.AndClause;
+import no.schibstedsok.searchportal.query.DefaultOperatorClause;
+import no.schibstedsok.searchportal.query.OrClause;
import no.schibstedsok.searchportal.query.Query;
+import no.schibstedsok.searchportal.result.BasicSearchResult;
import no.schibstedsok.searchportal.result.SearchResult;
+import no.schibstedsok.searchportal.result.SearchResultItem;
+import no.schibstedsok.searchportal.datamodel.DataModel;
import org.apache.log4j.Logger;
/**
- *
- * A search command for the web search.
- * @author magnuse
+ *
*/
public class CatalogueAdsSearchCommand extends AdvancedFastSearchCommand {
- private static final Logger LOG =
Logger.getLogger(CatalogueAdsSearchCommand.class);
+ private static final Logger LOG = Logger
+ .getLogger(CatalogueAdsSearchCommand.class);
+ /**
+ * String that hold the original untransformed query supplied by the
user.
+ */
+ private String originalQuery;
- private String queryTwo=null;
+ private String queryGeo = null;
- /** Creates a new instance of WebSearchCommand.
- *
- * @param cxt Search command context.
- * @param parameters Search command parameters.
- */
- public CatalogueAdsSearchCommand(
- final Context cxt,
- final DataModel datamodel) {
+ /**
+ * Two types of queries are run by this command each time the command is
+ * executed.
+ *
+ * @author daniel
+ *
+ */
+ private enum QueryType {
+ GEO, INGENSTEDS
+ }
- super(cxt, datamodel);
+ private QueryType whichQueryToRun;
- // hvis "where" parametern er sendt inn, så tar vi og leser inn query
fra
- // den.
- if(getSingleParameter("where") != null &&
getSingleParameter("where").length()>0){
- final ReconstructedQuery rq =
createQuery(getSingleParameter("where"));
+ /**
+ * Creates a new instance of WebSearchCommand.
+ *
+ * @param cxt
+ * Search command context.
+ * @param parameters
+ * Search command parameters.
+ */
+ public CatalogueAdsSearchCommand(final Context cxt,
+ final DataModel datamodel) {
- final Query query = rq.getQuery();
+ super(cxt, datamodel);
- queryTwo = query.getQueryString();
- }else{
- queryTwo = "ingensteds";
- }
+ // hvis "where" parametern er sendt inn, så tar vi og leser inn
query
+ // fra
+ // den.
+ if (getSingleParameter("where") != null
+ && getSingleParameter("where").length() > 0) {
+ final ReconstructedQuery rq =
createQuery(getSingleParameter("where"));
- LOG.info("Search configuration name
"+getSearchConfiguration().getName());
- }
+ final Query query = rq.getQuery();
- @Override
- public SearchResult execute() {
- SearchResult r = null;
+ queryGeo = query.getQueryString();
+ } else {
+ queryGeo = "ingensteds";
+ }
- // TODO Auto-generated method stub
- r = super.execute();
- return r;
- }
+ LOG.info("Search configuration name "
+ + getSearchConfiguration().getName());
+ }
- /**
- * Legg til iypcfspkeywords forran alle ord.
- *
- */
- protected void visitImpl(final LeafClause clause) {
+ @Override
+ public SearchResult execute() {
+ SearchResult r = null;
+ SearchResult r2 = null;
- String term = getTransformedTerm(clause);
- appendToQueryRepresentation("(");
- appendToQueryRepresentation("( (iypcfspkeywords5:"+term+queryTwo+") OR
((iypcfspkeywords5:"+term+"ingensteds) ANDNOT
(iypcfspkeywords5:"+term+queryTwo+"))) OR");
- appendToQueryRepresentation("( (iypcfspkeywords4:"+term+queryTwo+") OR
((iypcfspkeywords4:"+term+"ingensteds) ANDNOT
(iypcfspkeywords4:"+term+queryTwo+"))) OR");
- appendToQueryRepresentation("(
(iypcfspkeywords3:"+term+queryTwo+") OR ((iypcfspkeywords3:"+term+"ingensteds)
ANDNOT (iypcfspkeywords3:"+term+queryTwo+"))) OR");
- appendToQueryRepresentation("(
(iypcfspkeywords2:"+term+queryTwo+") OR ((iypcfspkeywords2:"+term+"ingensteds)
ANDNOT (iypcfspkeywords2:"+term+queryTwo+"))) OR");
- appendToQueryRepresentation("(
(iypcfspkeywords1:"+term+queryTwo+") OR ((iypcfspkeywords1:"+term+"ingensteds)
ANDNOT (iypcfspkeywords1:"+term+queryTwo+")))");
- appendToQueryRepresentation(")");
- }
+ // Run first query, which fetch all sponsorlinks
+ // for a given geographic place.
+ whichQueryToRun = QueryType.GEO;
+ r = super.execute();
+
+ // if there was less than 5 sponsor links from a
+ // specific geographic place, we could add sponsor
+ // links that does not have any specific geographic.
+ if (r.getHitCount() < 5) {
+
+ SearchResultItem[] searchResults = new
SearchResultItem[5];
+ // sjekk om originalQuery finnes i noen av r2 sine
+ // treff resultater. Må string tokenize kommaseparert
string
+ // i hvert treff med "ingensteds;"
+ for (SearchResultItem item : r.getResults()) {
+
+ Pattern p = Pattern.compile("^" + originalQuery
+ + queryGeo+".*|.*;" +
originalQuery + queryGeo+".*");
+
+ int i = 0;
+ boolean found = false;
+ for(; i < 5 ; i++){
+
if(item.getField("iypspkeywords"+(i+1))!=null){
+ Matcher m =
p.matcher(item.getField("iypspkeywords"+(i+1)).trim().toLowerCase());
+ found = m.matches();
+
+ if(found){
+ break;
+ }
+ }
+ }
+
+ // hvis funnet, må vi sette inn vårt objekt på
riktig plass
+ // i søkeresultatet i første søket.
+ if(found){
+ searchResults[i] = item;
+ LOG.info("Fant sponsortreff for plass "
+ (i+1) + ", " + item.getField("iypspkeywords"+(i+1)));
+ }else{
+ LOG.error("Fant IKKE sponsortreff, det
er ikke mulig, " + item);
+ }
+ }
+
+ // run second query, which fetch all sponsorlinks
+ // for a given set of keywords, without geographic.
+
+ whichQueryToRun = QueryType.INGENSTEDS;
+ performQueryTransformation();
+ r2 = super.execute();
+
+ // sjekk om originalQuery finnes i noen av r2 sine
+ // treff resultater. Må string tokenize kommaseparert
string
+ // i hvert treff med "ingensteds;"
+ for (SearchResultItem item : r2.getResults()) {
+
+ Pattern p = Pattern.compile("^" + originalQuery
+ + "ingensteds.*|.*;" +
originalQuery + "ingensteds.*");
+
+ int i = 0;
+ boolean found = false;
+ for(; i < 5 ; i++){
+
if(item.getField("iypspkeywords"+(i+1))!=null){
+ Matcher m =
p.matcher(item.getField("iypspkeywords"+(i+1)).trim().toLowerCase());
+ found = m.matches();
+
+ if(found) break;
+ }
+ }
+
+ // hvis funnet, må vi sette inn vårt objekt på
riktig plass
+ // i søkeresultatet i første søket.
+ if(found && searchResults[i]==null){
+ searchResults[i]=item;
+ LOG.info("Fant sponsortreff for plass "
+ (i+1) + ", " + item.getField("iypspkeywords"+(i+1)));
+ }
+ }
+
+ // erstatt resultatet fra første query som returneres
ut herifra,
+ // med det prossesserte resultatet
+ r.getResults().clear();
+ for(SearchResultItem item:searchResults){
+ if(item!=null){
+ r.addResult(item);
+ }
+ }
+
+ // plass 5, er de som betalt mest, og skal da først i
lista.
+ // plass 1 er de som betalt minst og skal da sist i
lista.
+ java.util.Collections.reverse(r.getResults());
+
+ }
+
+ return r;
+ }
+
+ @Override
+ public String getTransformedQuery() {
+
+ originalQuery = super.getTransformedQuery().replaceAll(" ",
"").toLowerCase();
+ String query = null;
+
+ if (whichQueryToRun == QueryType.GEO) {
+ query = super.getTransformedQuery().replaceAll(" ", "")
+ + queryGeo.replaceAll(" ", "");
+ } else {
+ query = super.getTransformedQuery().replaceAll(" ", "")
+ + "ingensteds";
+ }
+ return "iypspkeywords5:" + query + " OR iypspkeywords4:" +
query + " OR iypspkeywords3:" + query
+ + " OR iypspkeywords2:" + query + " OR
iypspkeywords1:" + query;
+ }
+
+ @Override
+ protected void visitImpl(DefaultOperatorClause clause) {
+ clause.getFirstClause().accept(this);
+ clause.getSecondClause().accept(this);
+ }
+
+ @Override
+ protected void visitImpl(AndClause clause) {
+ clause.getFirstClause().accept(this);
+ clause.getSecondClause().accept(this);
+ }
+
+ @Override
+ protected void visitImpl(OrClause clause) {
+ clause.getFirstClause().accept(this);
+ clause.getSecondClause().accept(this);
+ }
+
}
Modified:
trunk/core-api/src/main/java/no/schibstedsok/searchportal/mode/command/CatalogueSearchCommand.java
===================================================================
---
trunk/core-api/src/main/java/no/schibstedsok/searchportal/mode/command/CatalogueSearchCommand.java
2007-03-09 13:25:51 UTC (rev 4555)
+++
trunk/core-api/src/main/java/no/schibstedsok/searchportal/mode/command/CatalogueSearchCommand.java
2007-03-09 14:09:09 UTC (rev 4556)
@@ -125,10 +125,14 @@
@Override
public String getTransformedQuery() {
String query = super.getTransformedQuery();
-
- if (queryTwo != null && queryTwo.length() > 0 &&
!query.equals("*")) {
+
+ if(query.equals("*") && (queryTwo==null ||
queryTwo.length()==0)){
+ return "";
+
+ }else if (queryTwo != null && queryTwo.length() > 0 &&
!query.equals("*")) {
query += ") " + QL_AND + " (" + queryTwo + ")";
query = "(" + query;
+
} else if (query.equals("*")) {
query = queryTwo;
}
_______________________________________________
Kernel-commits mailing list
[email protected]
http://sesat.no/mailman/listinfo/kernel-commits