You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@nutch.apache.org by Hal Finkel <ha...@halssoftware.com> on 2007/07/22 01:36:21 UTC
Re: web2 spellcheck problem - patch
Hello again,
I finally figured out what the problem is (SearchForm.clone() needs to
deep copy the KeyValue objects), and so I have attached a patch. The
patch also fixes a problem with the setValue() method which leads to an
incorrect proposal URL being generated.
-Hal
Hal Finkel wrote:
> Hello,
>
> I have come across an odd problem with the web2 spellcheck plugin. When
> there is a spelling suggestion, the value of the "query" parameter in
> the form which provides the next button is not set to the original query
> but rather the query suggested by the spellcheck plugin.
>
> I have enabled the plugin on a website I'm setting up:
> http://utilitysearch.info, so you can observe the behavior yourself. I
> am using a trunk checkout from 2007-06-27.
>
> As a quick thought, it seems that even though the spell check controller
> is cloning the form object, the original object is still being contaminated:
> SearchForm form=(SearchForm)serviceLocator.getSearchForm().clone();
>
> If anyone has any ideas as to what could be causing this problem, I
> would appreciate some assistance.
>
> Thank you,
> Hal
>
Re: web2 spellcheck problem - patch
Posted by Dmitry <dm...@hotmail.com>.
Hal,
thanks , its good point, because i did not understand before the strange
behavier (updated the SearchForm.clone())
thanks,
DT
www.ejinz.com
----- Original Message -----
From: "Hal Finkel" <ha...@halssoftware.com>
To: <nu...@lucene.apache.org>
Sent: Saturday, July 21, 2007 6:36 PM
Subject: Re: web2 spellcheck problem - patch
> Hello again,
>
> I finally figured out what the problem is (SearchForm.clone() needs to
> deep copy the KeyValue objects), and so I have attached a patch. The
> patch also fixes a problem with the setValue() method which leads to an
> incorrect proposal URL being generated.
>
> -Hal
>
> Hal Finkel wrote:
>> Hello,
>>
>> I have come across an odd problem with the web2 spellcheck plugin. When
>> there is a spelling suggestion, the value of the "query" parameter in
>> the form which provides the next button is not set to the original query
>> but rather the query suggested by the spellcheck plugin.
>>
>> I have enabled the plugin on a website I'm setting up:
>> http://utilitysearch.info, so you can observe the behavior yourself. I
>> am using a trunk checkout from 2007-06-27.
>>
>> As a quick thought, it seems that even though the spell check controller
>> is cloning the form object, the original object is still being
>> contaminated:
>> SearchForm form=(SearchForm)serviceLocator.getSearchForm().clone();
>>
>> If anyone has any ideas as to what could be causing this problem, I
>> would appreciate some assistance.
>>
>> Thank you,
>> Hal
>>
>
>
--------------------------------------------------------------------------------
> ---
> contrib/web2/src/main/java/org/apache/nutch/webapp/common/SearchForm.java.orig
> 2007-06-27 11:17:34.000000000 -0700
> +++
> contrib/web2/src/main/java/org/apache/nutch/webapp/common/SearchForm.java
> 2007-07-21 16:20:14.000000000 -0700
> @@ -126,6 +126,13 @@
> public String toString() {
> return value.toString();
> }
> +
> + public boolean equals(Object other) {
> + if (this == other) return true;
> + if (!(other instanceof KeyValue)) return false;
> + KeyValue okv = (KeyValue) other;
> + return this.key.equals(okv.key) && this.value.equals(okv.value);
> + }
> }
>
> /**
> @@ -149,6 +156,9 @@
> */
> public void setValue(String key, String value) {
> if (n_values.containsKey(key)) {
> + if(active.contains(n_values.get(key)))
> + active.remove(active.indexOf(n_values.get(key)));
> +
> ((KeyValue) n_values.get(key)).setValue(value);
> } else {
> n_values.put(key, new KeyValue(key, value));
> @@ -303,9 +313,21 @@
>
> public Object clone(){
> SearchForm newForm=new SearchForm(new HashMap());
> - newForm.active.addAll(active);
> newForm.o_values.putAll(o_values);
> - newForm.n_values.putAll(n_values);
> +
> + // make sure we have a deep copy of all KeyValue objects which can be
> modified
> + Iterator j = n_values.entrySet().iterator();
> + while (j.hasNext()) {
> + KeyValue kv = (KeyValue) ((Map.Entry) j.next()).getValue();
> + newForm.n_values.put(kv.getKey(), new KeyValue(kv.getKey(),
> kv.getValue()));
> + }
> +
> + Iterator i = active.iterator();
> + while (i.hasNext()) {
> + KeyValue kv = (KeyValue) i.next();
> + newForm.active.add(new KeyValue(kv.getKey(), kv.getValue()));
> + }
> +
> return newForm;
> }
>
>