[core-dev] Re: [codepatch] PATRICIA

Roger Kapsi <[email protected]> Fri, 13 May 2005 17:03:27 +0200
Newsgroups gmane.network.gnutella.limewire.core.devel
Message-ID <[email protected]>
--Apple-Mail-32-250454650
Content-Transfer-Encoding: 7bit
Content-Type: text/plain;
	charset=US-ASCII;
	delsp=yes;
	format=flowed


Yes, AND'ed. The code looks so OR'ish! :) OK here it is...

The start and end index is send via GGEP and all quotes are stripped  
from the query. I think one (unsigned) byte per index is enough but  
it is using two per index at the moment -- you want maybe change it.

See also my note in FileManager.CharSeqPrefixComparator.



--Apple-Mail-32-250454650
Content-Transfer-Encoding: base64
Content-Type: application/zip;
	x-unix-mode=0644;
	name="Archive.zip"
Content-Disposition: attachment;
	filename=Archive.zip

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

--Apple-Mail-32-250454650
Content-Transfer-Encoding: 7bit
Content-Type: text/plain;
	charset=US-ASCII;
	delsp=yes;
	format=flowed


On May 12, 2005, at 7:27 PM, Sam Berlin wrote:

> I assume you mean all results AND'ed?  Your Patricia implementation  
> looks good, and it's nice that it supports more than just chars.   
> Might be interesting to look around for places that use unique sets  
> of IpPorts (HashSets of InetAddress too) and see if using a  
> Patricia tree with the InetAddress comparator would be better.
>
> I especially like using the CharSequence.  That's just what it's  
> meant to be used for.  :)
>
> Thanks,
>  Sam
>
> On May 12, 2005, at 7:26 AM, Roger Kapsi wrote:
>
>
>>
>> LimeWire doesn't strip the quotes, BearShare seems to strip them  
>> and for GnucDNA spammer it is the signal to return even more junk. :)
>>
>> GGEP is a good idea. One phrase per query and all results OR'ed?  
>> Everything else screams for an automaton IMO.
>>
>> Patricia is indeed cool, to cite a childish guy: "Roger loves  
>> Patricia". :) Although it is not necessarily required for phrase  
>> searching. It would even work with the current Trie if you split  
>> the Strings in a similar fashion as I'm doing it in the Keyword  
>> class, or rather switch Trie from String type keys to CharSequence  
>> to narrow the memory requirements down.
>>
>> cu
>>  Roger
>>
>>
>> On May 12, 2005, at 4:28 AM, Sam Berlin wrote:
>>
>>
>>> Hmm -- do existing clients strip invalid characters from  
>>> queries?  So if a
>>> search goes out like "LimeWire Rocks" and it includes the quotes,  
>>> would
>>> existing LimeWires match this against entries with 'LimeWire' and  
>>> 'Rocks'
>>> (without the quotes)?
>>>
>>> If so, it shouldn't be a problem to just start sending searches  
>>> that include
>>> quotes and let older servents send bad results (which we can  
>>> filter on the
>>> client side).
>>>
>>> If not, I don't think adding more entries into QRP is the way to  
>>> go, because
>>> the tables already are too populated.  Perhaps a GGEP field in  
>>> the search
>>> that includes the index of the begin & end quotes (so that a  
>>> search can be:
>>> "LimeWire Rocks" p2p, and find all results that have 'p2p AND  
>>> "LimeWire
>>> Rocks"').  The plain-text query would be 'LimeWire Rocks p2p',  
>>> and the GGEP
>>> field would be something like '0, 15', meaning that there's a  
>>> begin quote at
>>> 0th character & an end quote at the 15th character.
>>>
>>> Aside from this QRP problem (which is a big problem, and is part  
>>> of the
>>> reason that searching for phrases is difficult), your patch is  
>>> awesome.
>>> Super awesome.
>>>
>>> Thanks,
>>>  Sam
>>>
>>>
>>>
>>>> -----Original Message-----
>>>> From: Roger Kapsi [mailto:[email protected]]
>>>> Sent: Wednesday, May 11, 2005 6:25 PM
>>>> To: Sam Berlin
>>>> Cc: [email protected]
>>>> Subject: Re: [codepatch] PATRICIA
>>>>
>>>> ... or I forgot the QRP! :)
>>>>
>>>> OK, I have two ideas.
>>>>
>>>> #1 Ultrapeers check if a query starts and ends with quotes
>>>> and if so they ignore them. Simple but doesn't conform to the
>>>> QRP spec.
>>>>
>>>> #2 Additionally to the pure keywords we could add all
>>>> permutations with quotes to the QRP. Not necessarily all
>>>> permutations, for files for example only the file name and
>>>> only certain combinations.
>>>>
>>>> some file.txt
>>>>
>>>> some
>>>> file
>>>> txt
>>>> "some
>>>> some"
>>>> "file
>>>> file"
>>>> "txt
>>>> txt"
>>>>
>>>> The combinations "some", "file" and "txt" make no sense IMO.
>>>>
>>>> Opinions, comments!?
>>>>
>>>> cu
>>>>   Roger
>>>>
>>>>
>>>> On May 11, 2005, at 10:17 PM, Sam Berlin wrote:
>>>>
>>>>
>>>>
>>>>> This looks fantastic.  Will the searching for quoted
>>>>>
>>>>>
>>>> phrases work with
>>>>
>>>>
>>>>> QRP already (and just be slightly more inefficient because
>>>>>
>>>>>
>>>> there'll be
>>>>
>>>>
>>>>> more false positives) or...?
>>>>>
>>>>> Thanks,
>>>>>  Sam
>>>>>
>>>>> On May 11, 2005, at 3:10 PM, Roger Kapsi wrote:
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>> Hi,
>>>>>>
>>>>>> this patch switches FileManager from Trie to PatriciaMap, adds
>>>>>> support for queries with quoted phrases and reduces the number of
>>>>>> IntSet instances.
>>>>>>
>>>>>> cu
>>>>>>  Roger
>>>>>>
>>>>>> <Archive.zip>_______________________________________________
>>>>>> codepatch mailing list
>>>>>> [email protected]
>>>>>> http://www.limewire.org/mailman/listinfo/codepatch
>>>>>>
>>>>>>
>>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>
>>>>
>>>>
>>>
>>>
>>>
>>
>>
>
>


--Apple-Mail-32-250454650
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
core-dev mailing list
[email protected]
http://www.limewire.org/mailman/listinfo/core-dev

--Apple-Mail-32-250454650--