Return-Path: Delivered-To: apmail-lucene-java-dev-archive@www.apache.org Received: (qmail 48653 invoked from network); 9 Jun 2008 08:37:33 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 9 Jun 2008 08:37:33 -0000 Received: (qmail 97332 invoked by uid 500); 9 Jun 2008 08:37:29 -0000 Delivered-To: apmail-lucene-java-dev-archive@lucene.apache.org Received: (qmail 97282 invoked by uid 500); 9 Jun 2008 08:37:29 -0000 Mailing-List: contact java-dev-help@lucene.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: java-dev@lucene.apache.org Delivered-To: mailing list java-dev@lucene.apache.org Received: (qmail 97273 invoked by uid 99); 9 Jun 2008 08:37:29 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 09 Jun 2008 01:37:29 -0700 X-ASF-Spam-Status: No, hits=2.0 required=10.0 tests=HTML_MESSAGE,SPF_PASS X-Spam-Check-By: apache.org Received-SPF: pass (athena.apache.org: domain of claudio.corsi@gmail.com designates 74.125.46.29 as permitted sender) Received: from [74.125.46.29] (HELO yw-out-2324.google.com) (74.125.46.29) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 09 Jun 2008 08:36:40 +0000 Received: by yw-out-2324.google.com with SMTP id 3so1062541ywj.5 for ; Mon, 09 Jun 2008 01:36:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:message-id:date:from:to :subject:in-reply-to:mime-version:content-type:references; bh=7q6z8i9OlqAzAFDASBteXQKKK9EsizeolY2d8WPD5qw=; b=qRFZj7yhSFHVH6fbsx/+d8NMis74a0XpQy54TdZgawEeyeIFmt5f/wt/thigEvC4wW aJRrU/kcE+8+LLggJ9a8J4NQ9Tem/98ydGS5hlzKG9ujsj7UFhpqwo7ZsXcJS9+gRPwZ n5NaEB6yvR7IXWNEuPizt3Bfe6w9bd6vWgh5g= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=message-id:date:from:to:subject:in-reply-to:mime-version :content-type:references; b=dun2U+da3C7diabMuQSc5mRDMxMxRy61mSs0odXxZGcID1c2GbNe5zxRyxEvBQ2+wc d7boVdwClws1yGaaVChh91wrMAP5b39qrmVph1ns5LYRkzL3L4Zo6gtRYjylnudZTxsM hRxDDe4FvY3p7XVRgb6odtCa8gEIB4dmgLK9I= Received: by 10.151.78.11 with SMTP id f11mr5922973ybl.34.1213000617111; Mon, 09 Jun 2008 01:36:57 -0700 (PDT) Received: by 10.150.136.18 with HTTP; Mon, 9 Jun 2008 01:36:56 -0700 (PDT) Message-ID: Date: Mon, 9 Jun 2008 10:36:56 +0200 From: "Claudio Corsi" To: java-dev@lucene.apache.org Subject: Re: Fwd: SpanNearQuery: how to get the "intra-span" matching positions? In-Reply-To: <200806061834.09280.paul.elschot@xs4all.nl> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_Part_15540_13306473.1213000616990" References: <200805302051.10287.paul.elschot@xs4all.nl> <200806061834.09280.paul.elschot@xs4all.nl> X-Virus-Checked: Checked by ClamAV on apache.org ------=_Part_15540_13306473.1213000616990 Content-Type: multipart/alternative; boundary="----=_Part_15541_197035.1213000616990" ------=_Part_15541_197035.1213000616990 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Content-Disposition: inline Hi! I've implemented a non efficient (but working) solution to the "intra-span" matching problem. With these modifications (see the attachment) I have a way to pick all the matching positions *inside* the current NearSpan using the new method matchingSpans() (to call after each next()). There are three files: 1) NearSpans.java (just an interface declaring the matchingSpans method, I need it for my framework, but it is not mandatory) 2) NearSpansUnordered.java 3) NearSpansOrdered.java (the package declaration is relative to my project, please ignore it!! ;) The files 2) and 3) are copies of the one I found in Lucene 2.3.1.NearSpansUnordered just provide the implementation of matchinSpans() without any other modifications to the code: it just cycles over the list of SpanCell kept inside the current instance and filter out the elements whose doc() is not equals to the current doc() of the Spans, and whose start()/end() mathcing positions are not "compatible" with the ones of the current Spans state. The case of NearSpansOrdered is a little bit more complicated. I had to maintain track of the subSpans states in the method shrinkToAfterShortestMatch(). So, I've introduced the subSpansCopy ArrayList and the inner class SpansCopy that just copies the doc()/start()/end() values of the passed span. Then I've used this list in the implementation of matchingSpans() in a way similar to NearSpansUnorderd. These copies and the matchingSpans() implementations are not very efficient. I think that this problem can be solved in a better way. But for my collection and my application it works fine and fast. Hope that these files will help someone else! Cheers. On Fri, Jun 6, 2008 at 6:34 PM, Paul Elschot wrote: > See below. > > Op Friday 06 June 2008 16:23:15 schreef Claudio Corsi: > > Hi, > > I'm trying to extend the NearSpansOrdered and NearSpansUnordered > > classes of the Lucene core in order to create a way to access to the > > inner positions of the current span (in a next() loop). Suppose that > > the current near span starts at position N and ends at position N+k, > > I would discover the starting/ending positions of all the inner > > clauses that generate such span. > > > > I'm working on the NearSpansOrdered class right now. I guess that > > this modification could be trivial to do, but it requires to me time > > to understand the code. Any hints about that? > > > > Actually (as a very inefficient way to proceed) I've added this > > method to call *after each next()*, but it doesn't work as aspected: > > > > public Spans[] matchingSpans() { > > > > ArrayList list = new ArrayList(); > > if (subSpans.length == 0) return null; > > for(int pos = 0; pos < subSpans.length; pos++) { > > if (subSpans[pos].doc() != matchDoc) continue; > > if (subSpans[pos].start() >= matchStart && > > subSpans[pos].end() <= matchEnd) > > list.add(subSpans[pos]); > > } > > return list.toArray(new Spans[0]); > > } > > > > As you can see, I'm just looping over the subSpans array, filtering > > the ones having doc() == matchDoc and which span starts/end inside > > the current near span (matchStart and matchEnd are the boundaries > > returned by start() and ends() of NearSpansOrdered). This technique > > doesn't work. Maybe the problem is that the subSpans are not in the > > rigth state afte the next() call? > > Correct. The reason is that a match must be minimal length, > and for that at least the matching subspans at the lowest > position needs to be advanced beyond its matching position. > This is the same for both the ordered and unordered case. > > So, to implement the matchingSpans() method, it will be necessary > to copy the subspans when they are at the matching position. > This will probably involve some fruitless copying for incomplete > matches that never become a real match. > > There is also a difference beyond ordered/unordered. > In the ordered case, no overlaps between the matching subspans > are allowed, and in the unordered case overlaps are allowed. > > Regards, > Paul Elschot > > --------------------------------------------------------------------- > To unsubscribe, e-mail: java-dev-unsubscribe@lucene.apache.org > For additional commands, e-mail: java-dev-help@lucene.apache.org > > -- Claudio Corsi ------=_Part_15541_197035.1213000616990 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Content-Disposition: inline Hi!
I've implemented a non efficient (but working) solution to the "intra-span" matching problem. With these modifications (see the attachment) I have a way to pick all the matching positions *inside* the current NearSpan using the new method matchingSpans() (to call after each next()).

There are three files:

1) NearSpans.java (just an interface declaring the matchingSpans method, I need it for my framework, but it is not mandatory)
2)
NearSpansUnordered.java
3) NearSpansOrdered.java

(the package declaration is relative to my project, please ignore it!! ;)

The files 2) and 3) are copies of the one I found in Lucene 2.3.1. NearSpansUnordered just provide the implementation of matchinSpans() without any other modifications to the code: it just cycles over the list of SpanCell kept inside the current instance and filter out the elements whose doc() is not equals to the current doc() of the Spans, and whose start()/end() mathcing positions are not "compatible" with the ones of the current Spans state.

The case of NearSpansOrdered is a little bit more complicated. I had to maintain track of the subSpans states in the method shrinkToAfterShortestMatch(). So, I've introduced the subSpansCopy ArrayList and the inner class SpansCopy that just copies the doc()/start()/end() values of the passed span. Then I've used this list in the implementation of matchingSpans() in a way similar to NearSpansUnorderd.

These copies and the matchingSpans() implementations are not very efficient. I think that this problem can be solved in a better way. But for my collection and my application it works fine and fast.

Hope that these files will help someone else!

Cheers.


On Fri, Jun 6, 2008 at 6:34 PM, Paul Elschot <paul.elschot@xs4all.nl> wrote:
See below.

Op Friday 06 June 2008 16:23:15 schreef Claudio Corsi:
> Hi,
> I'm trying to extend the NearSpansOrdered and NearSpansUnordered
> classes of the Lucene core in order to create a way to access to the
> inner positions of the current span (in a next() loop). Suppose that
> the current near span starts at position N and ends at position N+k,
> I would discover the starting/ending positions of all the inner
> clauses that generate such span.
>
> I'm working on the NearSpansOrdered class right now. I guess that
> this modification could be trivial to do, but it requires to me time
> to understand the code. Any hints about that?
>
> Actually (as a very inefficient way to proceed) I've added this
> method to call *after each next()*, but it doesn't work as aspected:
>
> public Spans[] matchingSpans() {
>
>       ArrayList<Spans> list = new ArrayList<Spans>();
>       if (subSpans.length == 0) return null;
>       for(int pos = 0; pos < subSpans.length; pos++) {
>           if (subSpans[pos].doc() != matchDoc) continue;
>           if (subSpans[pos].start() >= matchStart &&
> subSpans[pos].end() <= matchEnd)
>           list.add(subSpans[pos]);
>       }
>       return list.toArray(new Spans[0]);
> }
>
> As you can see, I'm just looping over the subSpans array, filtering
> the ones having doc() == matchDoc and which span starts/end inside
> the current near span (matchStart and matchEnd are the boundaries
> returned by start() and ends() of NearSpansOrdered). This technique
> doesn't work. Maybe the problem is that the subSpans are not in the
> rigth state afte the next() call?

Correct. The reason is that a match must be minimal length,
and for that at least the matching subspans at the lowest
position needs to be advanced beyond its matching position.
This is the same for both the ordered and unordered case.

So, to implement the matchingSpans() method, it will be necessary
to copy the subspans when they are at the matching position.
This will probably involve some fruitless copying for incomplete
matches that never become a real match.

There is also a difference beyond ordered/unordered.
In the ordered case, no overlaps between the matching subspans
are allowed, and in the unordered case overlaps are allowed.

Regards,
Paul Elschot

---------------------------------------------------------------------
To unsubscribe, e-mail: java-dev-unsubscribe@lucene.apache.org
For additional commands, e-mail: java-dev-help@lucene.apache.org




--
Claudio Corsi
------=_Part_15541_197035.1213000616990-- ------=_Part_15540_13306473.1213000616990 Content-Type: text/x-java; name=NearSpans.java Content-Transfer-Encoding: base64 X-Attachment-Id: f_fh8szcq00 Content-Disposition: attachment; filename=NearSpans.java cGFja2FnZSBpdC51bmlwaS5kaS5kYW50ZS5sdWNlbmU7CgppbXBvcnQgb3JnLmFwYWNoZS5sdWNl bmUuc2VhcmNoLnNwYW5zLlNwYW5zOwoKcHVibGljIGludGVyZmFjZSBOZWFyU3BhbnMgewoJCglw dWJsaWMgU3BhbnNbXSBtYXRjaGluZ1NwYW5zKCk7Cgp9Cg== ------=_Part_15540_13306473.1213000616990 Content-Type: text/x-java; name=NearSpansOrdered.java Content-Transfer-Encoding: base64 X-Attachment-Id: f_fh8t061o1 Content-Disposition: attachment; filename=NearSpansOrdered.java cGFja2FnZSBpdC51bmlwaS5kaS5kYW50ZS5sdWNlbmU7CgovKioKICogTGljZW5zZWQgdG8gdGhl IEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAqIGNv bnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJp YnV0ZWQgd2l0aAogKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJk aW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCiAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRv IFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCiAqICh0aGUgIkxpY2Vu c2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRo CiAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0 CiAqCiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoK ICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0 aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmli dXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElU SU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBM aWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFu ZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCgppbXBvcnQgamF2YS5pby5J T0V4Y2VwdGlvbjsKCmltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwppbXBvcnQgamF2YS51dGls LkFycmF5czsKaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwppbXBvcnQgamF2YS51dGlsLkxp c3Q7CgppbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuaW5kZXguSW5kZXhSZWFkZXI7CmltcG9ydCBv cmcuYXBhY2hlLmx1Y2VuZS5zZWFyY2guc3BhbnMuU3Bhbk5lYXJRdWVyeTsKaW1wb3J0IG9yZy5h cGFjaGUubHVjZW5lLnNlYXJjaC5zcGFucy5TcGFuUXVlcnk7CmltcG9ydCBvcmcuYXBhY2hlLmx1 Y2VuZS5zZWFyY2guc3BhbnMuU3BhbnM7CgovKiogQSBTcGFucyB0aGF0IGlzIGZvcm1lZCBmcm9t IHRoZSBvcmRlcmVkIHN1YnNwYW5zIG9mIGEgU3Bhbk5lYXJRdWVyeQogKiB3aGVyZSB0aGUgc3Vi c3BhbnMgZG8gbm90IG92ZXJsYXAgYW5kIGhhdmUgYSBtYXhpbXVtIHNsb3AgYmV0d2VlbiB0aGVt LgogKiA8cD4KICogVGhlIGZvcm1lZCBzcGFucyBvbmx5IGNvbnRhaW5zIG1pbmltdW0gc2xvcCBt YXRjaGVzLjxicj4KICogVGhlIG1hdGNoaW5nIHNsb3AgaXMgY29tcHV0ZWQgZnJvbSB0aGUgZGlz dGFuY2UocykgYmV0d2VlbgogKiB0aGUgbm9uIG92ZXJsYXBwaW5nIG1hdGNoaW5nIFNwYW5zLjxi cj4KICogU3VjY2Vzc2l2ZSBtYXRjaGVzIGFyZSBhbHdheXMgZm9ybWVkIGZyb20gdGhlIHN1Y2Nl c3NpdmUgU3BhbnMKICogb2YgdGhlIFNwYW5OZWFyUXVlcnkuCiAqIDxwPgogKiBUaGUgZm9ybWVk IHNwYW5zIG1heSBjb250YWluIG92ZXJsYXBzIHdoZW4gdGhlIHNsb3AgaXMgYXQgbGVhc3QgMS4K ICogRm9yIGV4YW1wbGUsIHdoZW4gcXVlcnlpbmcgdXNpbmcKICogPHByZT50MSB0MiB0MzwvcHJl PgogKiB3aXRoIHNsb3AgYXQgbGVhc3QgMSwgdGhlIGZyYWdtZW50OgogKiA8cHJlPnQxIHQyIHQx IHQzIHQyIHQzPC9wcmU+CiAqIG1hdGNoZXMgdHdpY2U6CiAqIDxwcmU+dDEgdDIgLi4gdDMgICAg ICA8L3ByZT4KICogPHByZT4gICAgICB0MSAuLiB0MiB0MzwvcHJlPgogKi8KcHVibGljIGNsYXNz IE5lYXJTcGFuc09yZGVyZWQgaW1wbGVtZW50cyBTcGFucywgTmVhclNwYW5zIHsKICBwcml2YXRl IGZpbmFsIGludCBhbGxvd2VkU2xvcDsKICBwcml2YXRlIGJvb2xlYW4gZmlyc3RUaW1lID0gdHJ1 ZTsKICBwcml2YXRlIGJvb2xlYW4gbW9yZSA9IGZhbHNlOwoKICAvKiogVGhlIHNwYW5zIGluIHRo ZSBzYW1lIG9yZGVyIGFzIHRoZSBTcGFuTmVhclF1ZXJ5ICovCiAgcHJpdmF0ZSBmaW5hbCBTcGFu c1tdIHN1YlNwYW5zOwogIAogIHByaXZhdGUgZmluYWwgTGlzdDxTcGFucz4gc3ViU3BhbnNDb3B5 ID0gbmV3IEFycmF5TGlzdDxTcGFucz4oKTsKICAKICBjbGFzcyBTcGFuc0NvcHkgaW1wbGVtZW50 cyBTcGFucyB7CgkgIHByaXZhdGUgaW50IGRvYywgc3RhcnQsIGVuZDsKCSAgcHVibGljIFNwYW5z Q29weShTcGFucyBzKSB7CgkJICBkb2MgPSBzLmRvYygpOyBzdGFydCA9IHMuc3RhcnQoKTsgZW5k ID0gcy5lbmQoKTsKCSAgfQoJICBwdWJsaWMgaW50IGRvYygpIHsgcmV0dXJuIGRvYzsgfQoJICBw dWJsaWMgaW50IHN0YXJ0KCkgeyByZXR1cm4gc3RhcnQ7IH0KCSAgcHVibGljIGludCBlbmQoKSB7 IHJldHVybiBlbmQ7IH0KCSAgCglwdWJsaWMgYm9vbGVhbiBuZXh0KCkgdGhyb3dzIElPRXhjZXB0 aW9uIHsgcmV0dXJuIGZhbHNlOyB9CglwdWJsaWMgYm9vbGVhbiBza2lwVG8oaW50IHRhcmdldCkg dGhyb3dzIElPRXhjZXB0aW9uIHsgcmV0dXJuIGZhbHNlOyB9CglwdWJsaWMgU3RyaW5nIHRvU3Ry aW5nKCkge3JldHVybiAiZG9jOiIgKyBkb2MgKyAiLCBzdGFydDoiICsgc3RhcnQgKyAiLCBlbmQ6 IiArIGVuZDsgfQogIH07CgogIC8qKiBJbmRpY2F0ZXMgdGhhdCBhbGwgc3ViU3BhbnMgaGF2ZSBz YW1lIGRvYygpICovCiAgcHJpdmF0ZSBib29sZWFuIGluU2FtZURvYyA9IGZhbHNlOwoKICBwcml2 YXRlIGludCBtYXRjaERvYyA9IC0xOwogIHByaXZhdGUgaW50IG1hdGNoU3RhcnQgPSAtMTsKICBw cml2YXRlIGludCBtYXRjaEVuZCA9IC0xOwoKICBwcml2YXRlIGZpbmFsIFNwYW5zW10gc3ViU3Bh bnNCeURvYzsKICBwcml2YXRlIGZpbmFsIENvbXBhcmF0b3Igc3BhbkRvY0NvbXBhcmF0b3IgPSBu ZXcgQ29tcGFyYXRvcigpIHsKICAgIHB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVj dCBvMikgewogICAgICByZXR1cm4gKChTcGFucylvMSkuZG9jKCkgLSAoKFNwYW5zKW8yKS5kb2Mo KTsKICAgIH0KICB9OwogIAogIHByaXZhdGUgU3Bhbk5lYXJRdWVyeSBxdWVyeTsKICAKICBwdWJs aWMgTmVhclNwYW5zT3JkZXJlZChTcGFuTmVhclF1ZXJ5IHNwYW5OZWFyUXVlcnksIEluZGV4UmVh ZGVyIHJlYWRlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgIGlmIChzcGFuTmVhclF1ZXJ5Lmdl dENsYXVzZXMoKS5sZW5ndGggPCAyKSB7CiAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRF eGNlcHRpb24oIkxlc3MgdGhhbiAyIGNsYXVzZXM6ICIgKyBzcGFuTmVhclF1ZXJ5KTsKICAgIH0K ICAgIGFsbG93ZWRTbG9wID0gc3Bhbk5lYXJRdWVyeS5nZXRTbG9wKCk7CiAgICBTcGFuUXVlcnlb XSBjbGF1c2VzID0gc3Bhbk5lYXJRdWVyeS5nZXRDbGF1c2VzKCk7CiAgICBzdWJTcGFucyA9IG5l dyBTcGFuc1tjbGF1c2VzLmxlbmd0aF07CiAgICBzdWJTcGFuc0J5RG9jID0gbmV3IFNwYW5zW2Ns YXVzZXMubGVuZ3RoXTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2xhdXNlcy5sZW5ndGg7IGkr KykgewogICAgICBzdWJTcGFuc1tpXSA9IGNsYXVzZXNbaV0uZ2V0U3BhbnMocmVhZGVyKTsKICAg ICAgc3ViU3BhbnNCeURvY1tpXSA9IHN1YlNwYW5zW2ldOyAvLyB1c2VkIGluIHRvU2FtZURvYygp CiAgICB9CiAgICBxdWVyeSA9IHNwYW5OZWFyUXVlcnk7IC8vIGtlcHQgZm9yIHRvU3RyaW5nKCkg b25seS4KICB9CgogIC8vIGluaGVyaXQgamF2YWRvY3MKICBwdWJsaWMgaW50IGRvYygpIHsgcmV0 dXJuIG1hdGNoRG9jOyB9CgogIC8vIGluaGVyaXQgamF2YWRvY3MKICBwdWJsaWMgaW50IHN0YXJ0 KCkgeyByZXR1cm4gbWF0Y2hTdGFydDsgfQoKICAvLyBpbmhlcml0IGphdmFkb2NzCiAgcHVibGlj IGludCBlbmQoKSB7IHJldHVybiBtYXRjaEVuZDsgfQoKICAvLyBpbmhlcml0IGphdmFkb2NzCiAg cHVibGljIGJvb2xlYW4gbmV4dCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CgoJaWYgKGZpcnN0VGlt ZSkgewoJCWZpcnN0VGltZSA9IGZhbHNlOwoJCWZvciAoaW50IGkgPSAwOyBpIDwgc3ViU3BhbnMu bGVuZ3RoOyBpKyspIHsKCQkJaWYgKCFzdWJTcGFuc1tpXS5uZXh0KCkpIHsKCQkJCW1vcmUgPSBm YWxzZTsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoJCX0KCQltb3JlID0gdHJ1ZTsKCX0KCQoJcmV0 dXJuIGFkdmFuY2VBZnRlck9yZGVyZWQoKTsKICB9CiAgCiAgcHVibGljIHZvaWQgc2F2ZVN1YlNw YW5zKFNwYW5zIHNwYW5zVG9Db3B5KSB7CgkgIHN1YlNwYW5zQ29weS5hZGQobmV3IFNwYW5zQ29w eShzcGFuc1RvQ29weSkpOwogIH0KCiAgLy8gaW5oZXJpdCBqYXZhZG9jcwogIHB1YmxpYyBib29s ZWFuIHNraXBUbyhpbnQgdGFyZ2V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgaWYgKGZpcnN0 VGltZSkgewogICAgICBmaXJzdFRpbWUgPSBmYWxzZTsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkg PCBzdWJTcGFucy5sZW5ndGg7IGkrKykgewogICAgICAgIGlmICghIHN1YlNwYW5zW2ldLnNraXBU byh0YXJnZXQpKSB7CiAgICAgICAgICBtb3JlID0gZmFsc2U7CiAgICAgICAgICByZXR1cm4gZmFs c2U7CiAgICAgICAgfQogICAgICB9CiAgICAgIG1vcmUgPSB0cnVlOwogICAgfSBlbHNlIGlmICht b3JlICYmIChzdWJTcGFuc1swXS5kb2MoKSA8IHRhcmdldCkpIHsKICAgICAgaWYgKHN1YlNwYW5z WzBdLnNraXBUbyh0YXJnZXQpKSB7CiAgICAgICAgaW5TYW1lRG9jID0gZmFsc2U7CiAgICAgIH0g ZWxzZSB7CiAgICAgICAgbW9yZSA9IGZhbHNlOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAg fQogICAgfQogICAgcmV0dXJuIGFkdmFuY2VBZnRlck9yZGVyZWQoKTsKICB9CiAgCiAgLyoqIEFk dmFuY2VzIHRoZSBzdWJTcGFucyB0byBqdXN0IGFmdGVyIGFuIG9yZGVyZWQgbWF0Y2ggd2l0aCBh IG1pbmltdW0gc2xvcAogICAqIHRoYXQgaXMgc21hbGxlciB0aGFuIHRoZSBzbG9wIGFsbG93ZWQg YnkgdGhlIFNwYW5OZWFyUXVlcnkuCiAgICogQHJldHVybiB0cnVlIGlmZiB0aGVyZSBpcyBzdWNo IGEgbWF0Y2guCiAgICovCiAgcHJpdmF0ZSBib29sZWFuIGFkdmFuY2VBZnRlck9yZGVyZWQoKSB0 aHJvd3MgSU9FeGNlcHRpb24gewogICAgd2hpbGUgKG1vcmUgJiYgKGluU2FtZURvYyB8fCB0b1Nh bWVEb2MoKSkpIHsKICAgICAgaWYgKHN0cmV0Y2hUb09yZGVyKCkgJiYgc2hyaW5rVG9BZnRlclNo b3J0ZXN0TWF0Y2goKSkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICB9CiAgICBy ZXR1cm4gZmFsc2U7IC8vIG5vIG1vcmUgbWF0Y2hlcwogIH0KCgogIC8qKiBBZHZhbmNlIHRoZSBz dWJTcGFucyB0byB0aGUgc2FtZSBkb2N1bWVudCAqLwogIHByaXZhdGUgYm9vbGVhbiB0b1NhbWVE b2MoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgQXJyYXlzLnNvcnQoc3ViU3BhbnNCeURvYywg c3BhbkRvY0NvbXBhcmF0b3IpOwogICAgaW50IGZpcnN0SW5kZXggPSAwOwogICAgaW50IG1heERv YyA9IHN1YlNwYW5zQnlEb2Nbc3ViU3BhbnNCeURvYy5sZW5ndGggLSAxXS5kb2MoKTsKICAgIHdo aWxlIChzdWJTcGFuc0J5RG9jW2ZpcnN0SW5kZXhdLmRvYygpICE9IG1heERvYykgewogICAgICBp ZiAoISBzdWJTcGFuc0J5RG9jW2ZpcnN0SW5kZXhdLnNraXBUbyhtYXhEb2MpKSB7CiAgICAgICAg bW9yZSA9IGZhbHNlOwogICAgICAgIGluU2FtZURvYyA9IGZhbHNlOwogICAgICAgIHJldHVybiBm YWxzZTsKICAgICAgfQogICAgICBtYXhEb2MgPSBzdWJTcGFuc0J5RG9jW2ZpcnN0SW5kZXhdLmRv YygpOwogICAgICBpZiAoKytmaXJzdEluZGV4ID09IHN1YlNwYW5zQnlEb2MubGVuZ3RoKSB7CiAg ICAgICAgZmlyc3RJbmRleCA9IDA7CiAgICAgIH0KICAgIH0KICAgIGZvciAoaW50IGkgPSAwOyBp IDwgc3ViU3BhbnNCeURvYy5sZW5ndGg7IGkrKykgewogICAgICBhc3NlcnQgKHN1YlNwYW5zQnlE b2NbaV0uZG9jKCkgPT0gbWF4RG9jKQogICAgICAgICAgICAgOiAiIE5lYXJTcGFuc09yZGVyZWQu dG9TYW1lRG9jKCkgc3BhbnMgIiArIHN1YlNwYW5zQnlEb2NbMF0KICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgKyAiXG4gYXQgZG9jICIgKyBzdWJTcGFuc0J5RG9jW2ldLmRvYygpCiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgYnV0IHNob3VsZCBiZSBhdCAiICsg bWF4RG9jOwogICAgfQogICAgaW5TYW1lRG9jID0gdHJ1ZTsKICAgIHJldHVybiB0cnVlOwogIH0K ICAKICAvKiogQ2hlY2sgd2hldGhlciB0d28gU3BhbnMgaW4gdGhlIHNhbWUgZG9jdW1lbnQgYXJl IG9yZGVyZWQuCiAgICogQHBhcmFtIHNwYW5zMSAKICAgKiBAcGFyYW0gc3BhbnMyIAogICAqIEBy ZXR1cm4gdHJ1ZSBpZmYgc3BhbnMxIHN0YXJ0cyBiZWZvcmUgc3BhbnMyCiAgICogICAgICAgICAg ICAgIG9yIHRoZSBzcGFucyBzdGFydCBhdCB0aGUgc2FtZSBwb3NpdGlvbiwKICAgKiAgICAgICAg ICAgICAgYW5kIHNwYW5zMSBlbmRzIGJlZm9yZSBzcGFuczIuCiAgICovCiAgc3RhdGljIGZpbmFs IGJvb2xlYW4gZG9jU3BhbnNPcmRlcmVkKFNwYW5zIHNwYW5zMSwgU3BhbnMgc3BhbnMyKSB7CiAg ICBhc3NlcnQgc3BhbnMxLmRvYygpID09IHNwYW5zMi5kb2MoKSA6ICJkb2MxICIgKyBzcGFuczEu ZG9jKCkgKyAiICE9IGRvYzIgIiArIHNwYW5zMi5kb2MoKTsKICAgIGludCBzdGFydDEgPSBzcGFu czEuc3RhcnQoKTsKICAgIGludCBzdGFydDIgPSBzcGFuczIuc3RhcnQoKTsKICAgIC8qIERvIG5v dCBjYWxsIGRvY1NwYW5zT3JkZXJlZChpbnQsaW50LGludCxpbnQpIHRvIGF2b2lkIGludm9raW5n IC5lbmQoKSA6ICovCiAgICByZXR1cm4gKHN0YXJ0MSA9PSBzdGFydDIpID8gKHNwYW5zMS5lbmQo KSA8IHNwYW5zMi5lbmQoKSkgOiAoc3RhcnQxIDwgc3RhcnQyKTsKICB9CgogIC8qKiBMaWtlIHtA bGluayAjZG9jU3BhbnNPcmRlcmVkKFNwYW5zLFNwYW5zKX0sIGJ1dCB1c2UgdGhlIHNwYW5zCiAg ICogc3RhcnRzIGFuZCBlbmRzIGFzIHBhcmFtZXRlcnMuCiAgICovCiAgcHJpdmF0ZSBzdGF0aWMg ZmluYWwgYm9vbGVhbiBkb2NTcGFuc09yZGVyZWQoaW50IHN0YXJ0MSwgaW50IGVuZDEsIGludCBz dGFydDIsIGludCBlbmQyKSB7CiAgICByZXR1cm4gKHN0YXJ0MSA9PSBzdGFydDIpID8gKGVuZDEg PCBlbmQyKSA6IChzdGFydDEgPCBzdGFydDIpOwogIH0KCiAgLyoqIE9yZGVyIHRoZSBzdWJTcGFu cyB3aXRoaW4gdGhlIHNhbWUgZG9jdW1lbnQgYnkgYWR2YW5jaW5nIGFsbCBsYXRlciBzcGFucwog ICAqIGFmdGVyIHRoZSBwcmV2aW91cyBvbmUuCiAgICovCiAgcHJpdmF0ZSBib29sZWFuIHN0cmV0 Y2hUb09yZGVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgIG1hdGNoRG9jID0gc3ViU3BhbnNb MF0uZG9jKCk7CiAgICBmb3IgKGludCBpID0gMTsgaW5TYW1lRG9jICYmIChpIDwgc3ViU3BhbnMu bGVuZ3RoKTsgaSsrKSB7CiAgICAgIHdoaWxlICghIGRvY1NwYW5zT3JkZXJlZChzdWJTcGFuc1tp LTFdLCBzdWJTcGFuc1tpXSkpIHsKICAgICAgICBpZiAoISBzdWJTcGFuc1tpXS5uZXh0KCkpIHsK ICAgICAgICAgIGluU2FtZURvYyA9IGZhbHNlOwogICAgICAgICAgbW9yZSA9IGZhbHNlOwogICAg ICAgICAgYnJlYWs7CiAgICAgICAgfSBlbHNlIGlmIChtYXRjaERvYyAhPSBzdWJTcGFuc1tpXS5k b2MoKSkgewogICAgICAgICAgaW5TYW1lRG9jID0gZmFsc2U7CiAgICAgICAgICBicmVhazsKICAg ICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBpblNhbWVEb2M7CiAgfQoKICAvKiogVGhl IHN1YlNwYW5zIGFyZSBvcmRlcmVkIGluIHRoZSBzYW1lIGRvYywgc28gdGhlcmUgaXMgYSBwb3Nz aWJsZSBtYXRjaC4KICAgKiBDb21wdXRlIHRoZSBzbG9wIHdoaWxlIG1ha2luZyB0aGUgbWF0Y2gg YXMgc2hvcnQgYXMgcG9zc2libGUgYnkgYWR2YW5jaW5nCiAgICogYWxsIHN1YlNwYW5zIGV4Y2Vw dCB0aGUgbGFzdCBvbmUgaW4gcmV2ZXJzZSBvcmRlci4KICAgKi8KICBwcml2YXRlIGJvb2xlYW4g c2hyaW5rVG9BZnRlclNob3J0ZXN0TWF0Y2goKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgbWF0 Y2hTdGFydCA9IHN1YlNwYW5zW3N1YlNwYW5zLmxlbmd0aCAtIDFdLnN0YXJ0KCk7CiAgICBtYXRj aEVuZCA9IHN1YlNwYW5zW3N1YlNwYW5zLmxlbmd0aCAtIDFdLmVuZCgpOwogICAgaW50IG1hdGNo U2xvcCA9IDA7CiAgICBpbnQgbGFzdFN0YXJ0ID0gbWF0Y2hTdGFydDsKICAgIGludCBsYXN0RW5k ID0gbWF0Y2hFbmQ7CiAgICAKICAgIHN1YlNwYW5zQ29weS5jbGVhcigpOwogICAgc2F2ZVN1YlNw YW5zKHN1YlNwYW5zW3N1YlNwYW5zLmxlbmd0aCAtIDFdKTsKICAgIAogICAgZm9yIChpbnQgaSA9 IHN1YlNwYW5zLmxlbmd0aCAtIDI7IGkgPj0gMDsgaS0tKSB7CiAgICAgIFNwYW5zIHByZXZTcGFu cyA9IHN1YlNwYW5zW2ldOwogICAgICBpbnQgcHJldlN0YXJ0ID0gcHJldlNwYW5zLnN0YXJ0KCk7 CiAgICAgIGludCBwcmV2RW5kID0gcHJldlNwYW5zLmVuZCgpOwogICAgICAKICAgICAgd2hpbGUg KHRydWUpIHsgLy8gQWR2YW5jZSBwcmV2U3BhbnMgdW50aWwgYWZ0ZXIgKGxhc3RTdGFydCwgbGFz dEVuZCkKICAgIAkgIAogICAgCXNhdmVTdWJTcGFucyhwcmV2U3BhbnMpOwogICAgCSAgCiAgICAg ICAgaWYgKCFwcmV2U3BhbnMubmV4dCgpKSB7CiAgICAgICAgCWluU2FtZURvYyA9IGZhbHNlOwoJ CQltb3JlID0gZmFsc2U7CgkJCWJyZWFrOyAvLyBDaGVjayByZW1haW5pbmcgc3ViU3BhbnMgZm9y IGZpbmFsIG1hdGNoLgoJCX0gCiAgICAgICAgZWxzZSAKICAgICAgICAJaWYgKG1hdGNoRG9jICE9 IHByZXZTcGFucy5kb2MoKSkgewoJCQkJaW5TYW1lRG9jID0gZmFsc2U7IC8vIFRoZSBsYXN0IHN1 YlNwYW5zIGlzIG5vdCBhZHZhbmNlZAoJCQkJYnJlYWs7IC8vIENoZWNrIHJlbWFpbmluZyBzdWJT cGFucyBmb3IgbGFzdCBtYXRjaCBpbiB0aGlzIGRvY3VtZW50LgogICAgICAgIAl9IAogICAgICAg IAllbHNlIHsKCQkJCWludCBwcFN0YXJ0ID0gcHJldlNwYW5zLnN0YXJ0KCk7CgkJCQlpbnQgcHBF bmQgPSBwcmV2U3BhbnMuZW5kKCk7IC8vIENhbm5vdCBhdm9pZCBpbnZva2luZyAuZW5kKCkKCgkJ CQlpZiAoIWRvY1NwYW5zT3JkZXJlZChwcFN0YXJ0LCBwcEVuZCwgbGFzdFN0YXJ0LCBsYXN0RW5k KSkgewoJCQkJCWJyZWFrOyAvLyBDaGVjayByZW1haW5pbmcgc3ViU3BhbnMuCgkJCQl9IAoJCQkJ ZWxzZSB7IC8vIHByZXZTcGFucyBzdGlsbCBiZWZvcmUgKGxhc3RTdGFydCwgbGFzdEVuZCkKCQkJ CQlwcmV2U3RhcnQgPSBwcFN0YXJ0OwoJCQkJCXByZXZFbmQgPSBwcEVuZDsKCQkJCX0KCQkJfQog ICAgICB9CiAgICAgIAogICAgICBhc3NlcnQgcHJldlN0YXJ0IDw9IG1hdGNoU3RhcnQ7CiAgICAg IGlmIChtYXRjaFN0YXJ0ID4gcHJldkVuZCkgeyAvLyBPbmx5IG5vbiBvdmVybGFwcGluZyBzcGFu cyBhZGQgdG8gc2xvcC4KICAgICAgICBtYXRjaFNsb3AgKz0gKG1hdGNoU3RhcnQgLSBwcmV2RW5k KTsKICAgICAgfQogICAgICAvKiBEbyBub3QgYnJlYWsgb24gKG1hdGNoU2xvcCA+IGFsbG93ZWRT bG9wKSBoZXJlIHRvIG1ha2Ugc3VyZQogICAgICAgKiB0aGF0IHN1YlNwYW5zWzBdIGlzIGFkdmFu Y2VkIGFmdGVyIHRoZSBtYXRjaCwgaWYgYW55LgogICAgICAgKi8KICAgICAgbWF0Y2hTdGFydCA9 IHByZXZTdGFydDsKICAgICAgbGFzdFN0YXJ0ID0gcHJldlN0YXJ0OwogICAgICBsYXN0RW5kID0g cHJldkVuZDsKICAgIH0KICAgIHJldHVybiBtYXRjaFNsb3AgPD0gYWxsb3dlZFNsb3A7IC8vIG9y ZGVyZWQgYW5kIGFsbG93ZWQgc2xvcAogIH0KCiAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsK ICAgIHJldHVybiBnZXRDbGFzcygpLmdldE5hbWUoKSArICIoIitxdWVyeS50b1N0cmluZygpKyIp QCIrCiAgICAgIChmaXJzdFRpbWU/IlNUQVJUIjoobW9yZT8oZG9jKCkrIjoiK3N0YXJ0KCkrIi0i K2VuZCgpKToiRU5EIikpOwogIH0KICAKICBwdWJsaWMgU3BhbnNbXSBtYXRjaGluZ1NwYW5zKCkg ewoJICAKCSAgQXJyYXlMaXN0PFNwYW5zPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTcGFucz4oKTsK CgkgIGlmIChzdWJTcGFuc0NvcHkuc2l6ZSgpID09IDApIHJldHVybiBudWxsOwoJICAKCSAgZm9y KGludCBrID0gMDsgayA8IHN1YlNwYW5zQ29weS5zaXplKCk7IGsrKykgewoJCSAgCgkJICBpZiAo c3ViU3BhbnNDb3B5LmdldChrKS5kb2MoKSAhPSBtYXRjaERvYykgY29udGludWU7CgkJICAKCQkg IGlmIChzdWJTcGFuc0NvcHkuZ2V0KGspLnN0YXJ0KCkgPj0gbWF0Y2hTdGFydCAmJiBzdWJTcGFu c0NvcHkuZ2V0KGspLmVuZCgpIDw9IG1hdGNoRW5kKQoJCQkgIGxpc3QuYWRkKHN1YlNwYW5zQ29w eS5nZXQoaykpOwoJICB9CgkgIAoJICByZXR1cm4gbGlzdC50b0FycmF5KG5ldyBTcGFuc1swXSk7 CiAgfQp9Cgo= ------=_Part_15540_13306473.1213000616990 Content-Type: text/x-java; name=NearSpansUnordered.java Content-Transfer-Encoding: base64 X-Attachment-Id: f_fh8t09hh2 Content-Disposition: attachment; filename=NearSpansUnordered.java cGFja2FnZSBpdC51bmlwaS5kaS5kYW50ZS5sdWNlbmU7CgovKioKICogTGljZW5zZWQgdG8gdGhl IEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAqIGNv bnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJp YnV0ZWQgd2l0aAogKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJk aW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCiAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRv IFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCiAqICh0aGUgIkxpY2Vu c2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRo CiAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0 CiAqCiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoK ICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0 aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmli dXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElU SU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBM aWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFu ZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCgppbXBvcnQgamF2YS5pby5J T0V4Y2VwdGlvbjsKCmltcG9ydCBqYXZhLnV0aWwuTGlzdDsKaW1wb3J0IGphdmEudXRpbC5BcnJh eUxpc3Q7CgppbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuaW5kZXguSW5kZXhSZWFkZXI7CmltcG9y dCBvcmcuYXBhY2hlLmx1Y2VuZS5zZWFyY2guc3BhbnMuU3Bhbk5lYXJRdWVyeTsKaW1wb3J0IG9y Zy5hcGFjaGUubHVjZW5lLnNlYXJjaC5zcGFucy5TcGFuUXVlcnk7CmltcG9ydCBvcmcuYXBhY2hl Lmx1Y2VuZS5zZWFyY2guc3BhbnMuU3BhbnM7CmltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS51dGls LlByaW9yaXR5UXVldWU7CgpwdWJsaWMgY2xhc3MgTmVhclNwYW5zVW5vcmRlcmVkIGltcGxlbWVu dHMgU3BhbnMsIE5lYXJTcGFucyB7CiAgcHJpdmF0ZSBTcGFuTmVhclF1ZXJ5IHF1ZXJ5OwoKICBw cml2YXRlIExpc3Qgb3JkZXJlZCA9IG5ldyBBcnJheUxpc3QoKTsgICAgICAgICAvLyBzcGFucyBp biBxdWVyeSBvcmRlcgogIHByaXZhdGUgaW50IHNsb3A7ICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIC8vIGZyb20gcXVlcnkKCiAgcHJpdmF0ZSBTcGFuc0NlbGwgZmlyc3Q7ICAgICAgICAg ICAgICAgICAgICAgICAgLy8gbGlua2VkIGxpc3Qgb2Ygc3BhbnMKICBwcml2YXRlIFNwYW5zQ2Vs bCBsYXN0OyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzb3J0ZWQgYnkgZG9jIG9ubHkKCiAg cHJpdmF0ZSBpbnQgdG90YWxMZW5ndGg7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VtIG9m IGN1cnJlbnQgbGVuZ3RocwoKICBwcml2YXRlIENlbGxRdWV1ZSBxdWV1ZTsgICAgICAgICAgICAg ICAgICAgICAgICAvLyBzb3J0ZWQgcXVldWUgb2Ygc3BhbnMKICBwcml2YXRlIFNwYW5zQ2VsbCBt YXg7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXggZWxlbWVudCBpbiBxdWV1ZQoKICBw cml2YXRlIGJvb2xlYW4gbW9yZSA9IHRydWU7ICAgICAgICAgICAgICAgICAgICAvLyB0cnVlIGlm ZiBub3QgZG9uZQogIHByaXZhdGUgYm9vbGVhbiBmaXJzdFRpbWUgPSB0cnVlOyAgICAgICAgICAg ICAgIC8vIHRydWUgYmVmb3JlIGZpcnN0IG5leHQoKQoKICBwcml2YXRlIGNsYXNzIENlbGxRdWV1 ZSBleHRlbmRzIFByaW9yaXR5UXVldWUgewogICAgcHVibGljIENlbGxRdWV1ZShpbnQgc2l6ZSkg ewogICAgICBpbml0aWFsaXplKHNpemUpOwogICAgfQogICAgCiAgICBwcm90ZWN0ZWQgZmluYWwg Ym9vbGVhbiBsZXNzVGhhbihPYmplY3QgbzEsIE9iamVjdCBvMikgewogICAgICBTcGFuc0NlbGwg c3BhbnMxID0gKFNwYW5zQ2VsbClvMTsKICAgICAgU3BhbnNDZWxsIHNwYW5zMiA9IChTcGFuc0Nl bGwpbzI7CiAgICAgIGlmIChzcGFuczEuZG9jKCkgPT0gc3BhbnMyLmRvYygpKSB7CiAgICAgICAg cmV0dXJuIE5lYXJTcGFuc09yZGVyZWQuZG9jU3BhbnNPcmRlcmVkKHNwYW5zMSwgc3BhbnMyKTsK ICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gc3BhbnMxLmRvYygpIDwgc3BhbnMyLmRvYygp OwogICAgICB9CiAgICB9CiAgfQoKCiAgLyoqIFdyYXBzIGEgU3BhbnMsIGFuZCBjYW4gYmUgdXNl ZCB0byBmb3JtIGEgbGlua2VkIGxpc3QuICovCiAgcHJpdmF0ZSBjbGFzcyBTcGFuc0NlbGwgaW1w bGVtZW50cyBTcGFucyB7CiAgICBwcml2YXRlIFNwYW5zIHNwYW5zOwogICAgcHJpdmF0ZSBTcGFu c0NlbGwgbmV4dDsKICAgIHByaXZhdGUgaW50IGxlbmd0aCA9IC0xOwogICAgcHJpdmF0ZSBpbnQg aW5kZXg7CgogICAgcHVibGljIFNwYW5zQ2VsbChTcGFucyBzcGFucywgaW50IGluZGV4KSB7CiAg ICAgIHRoaXMuc3BhbnMgPSBzcGFuczsKICAgICAgdGhpcy5pbmRleCA9IGluZGV4OwogICAgfQoK ICAgIHB1YmxpYyBib29sZWFuIG5leHQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICByZXR1 cm4gYWRqdXN0KHNwYW5zLm5leHQoKSk7CiAgICB9CgogICAgcHVibGljIGJvb2xlYW4gc2tpcFRv KGludCB0YXJnZXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgIHJldHVybiBhZGp1c3Qoc3Bh bnMuc2tpcFRvKHRhcmdldCkpOwogICAgfQogICAgCiAgICBwcml2YXRlIGJvb2xlYW4gYWRqdXN0 KGJvb2xlYW4gY29uZGl0aW9uKSB7CiAgICAgIGlmIChsZW5ndGggIT0gLTEpIHsKICAgICAgICB0 b3RhbExlbmd0aCAtPSBsZW5ndGg7ICAvLyBzdWJ0cmFjdCBvbGQgbGVuZ3RoCiAgICAgIH0KICAg ICAgaWYgKGNvbmRpdGlvbikgewogICAgICAgIGxlbmd0aCA9IGVuZCgpIC0gc3RhcnQoKTsgCiAg ICAgICAgdG90YWxMZW5ndGggKz0gbGVuZ3RoOyAvLyBhZGQgbmV3IGxlbmd0aAoKICAgICAgICBp ZiAobWF4ID09IG51bGwgfHwgZG9jKCkgPiBtYXguZG9jKCkKICAgICAgICAgICAgfHwgKGRvYygp ID09IG1heC5kb2MoKSkgJiYgKGVuZCgpID4gbWF4LmVuZCgpKSkgewogICAgICAgICAgbWF4ID0g dGhpczsKICAgICAgICB9CiAgICAgIH0KICAgICAgbW9yZSA9IGNvbmRpdGlvbjsKICAgICAgcmV0 dXJuIGNvbmRpdGlvbjsKICAgIH0KCiAgICBwdWJsaWMgaW50IGRvYygpIHsgcmV0dXJuIHNwYW5z LmRvYygpOyB9CiAgICBwdWJsaWMgaW50IHN0YXJ0KCkgeyByZXR1cm4gc3BhbnMuc3RhcnQoKTsg fQogICAgcHVibGljIGludCBlbmQoKSB7IHJldHVybiBzcGFucy5lbmQoKTsgfQoKICAgIHB1Ymxp YyBTdHJpbmcgdG9TdHJpbmcoKSB7IHJldHVybiBzcGFucy50b1N0cmluZygpICsgIiMiICsgaW5k ZXg7IH0KICB9CgoKICBwdWJsaWMgTmVhclNwYW5zVW5vcmRlcmVkKFNwYW5OZWFyUXVlcnkgcXVl cnksIEluZGV4UmVhZGVyIHJlYWRlcikKICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICB0aGlz LnF1ZXJ5ID0gcXVlcnk7CiAgICB0aGlzLnNsb3AgPSBxdWVyeS5nZXRTbG9wKCk7CgogICAgU3Bh blF1ZXJ5W10gY2xhdXNlcyA9IHF1ZXJ5LmdldENsYXVzZXMoKTsKICAgIHF1ZXVlID0gbmV3IENl bGxRdWV1ZShjbGF1c2VzLmxlbmd0aCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IGNsYXVzZXMu bGVuZ3RoOyBpKyspIHsKICAgICAgU3BhbnNDZWxsIGNlbGwgPQogICAgICAgIG5ldyBTcGFuc0Nl bGwoY2xhdXNlc1tpXS5nZXRTcGFucyhyZWFkZXIpLCBpKTsKICAgICAgb3JkZXJlZC5hZGQoY2Vs bCk7CiAgICB9CiAgfQoKICBwdWJsaWMgYm9vbGVhbiBuZXh0KCkgdGhyb3dzIElPRXhjZXB0aW9u IHsKICAgIGlmIChmaXJzdFRpbWUpIHsKICAgICAgaW5pdExpc3QodHJ1ZSk7CiAgICAgIGxpc3RU b1F1ZXVlKCk7IC8vIGluaXRpYWxpemUgcXVldWUKICAgICAgZmlyc3RUaW1lID0gZmFsc2U7CiAg ICB9IGVsc2UgaWYgKG1vcmUpIHsKICAgICAgaWYgKG1pbigpLm5leHQoKSkgeyAvLyB0cmlnZ2Vy IGZ1cnRoZXIgc2Nhbm5pbmcKICAgICAgICBxdWV1ZS5hZGp1c3RUb3AoKTsgLy8gbWFpbnRhaW4g cXVldWUKICAgICAgfSBlbHNlIHsKICAgICAgICBtb3JlID0gZmFsc2U7CiAgICAgIH0KICAgIH0K CiAgICB3aGlsZSAobW9yZSkgewoKICAgICAgYm9vbGVhbiBxdWV1ZVN0YWxlID0gZmFsc2U7Cgog ICAgICBpZiAobWluKCkuZG9jKCkgIT0gbWF4LmRvYygpKSB7ICAgICAgICAgICAgIC8vIG1haW50 YWluIGxpc3QKICAgICAgICBxdWV1ZVRvTGlzdCgpOwogICAgICAgIHF1ZXVlU3RhbGUgPSB0cnVl OwogICAgICB9CgogICAgICAvLyBza2lwIHRvIGRvYyB3LyBhbGwgY2xhdXNlcwoKICAgICAgd2hp bGUgKG1vcmUgJiYgZmlyc3QuZG9jKCkgPCBsYXN0LmRvYygpKSB7CiAgICAgICAgbW9yZSA9IGZp cnN0LnNraXBUbyhsYXN0LmRvYygpKTsgICAgICAgICAgLy8gc2tpcCBmaXJzdCB1cCB0byBsYXN0 CiAgICAgICAgZmlyc3RUb0xhc3QoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5k IG1vdmUgaXQgdG8gdGhlIGVuZAogICAgICAgIHF1ZXVlU3RhbGUgPSB0cnVlOwogICAgICB9Cgog ICAgICBpZiAoIW1vcmUpIHJldHVybiBmYWxzZTsKCiAgICAgIC8vIGZvdW5kIGRvYyB3LyBhbGwg Y2xhdXNlcwoKICAgICAgaWYgKHF1ZXVlU3RhbGUpIHsgICAgICAgICAgICAgICAgICAgICAgICAg ICAvLyBtYWludGFpbiB0aGUgcXVldWUKICAgICAgICBsaXN0VG9RdWV1ZSgpOwogICAgICAgIHF1 ZXVlU3RhbGUgPSBmYWxzZTsKICAgICAgfQoKICAgICAgaWYgKGF0TWF0Y2goKSkgewogICAgICAg IHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIAogICAgICBtb3JlID0gbWluKCkubmV4dCgpOwog ICAgICBpZiAobW9yZSkgewogICAgICAgIHF1ZXVlLmFkanVzdFRvcCgpOyAgICAgICAgICAgICAg ICAgICAgICAvLyBtYWludGFpbiBxdWV1ZQogICAgICB9CiAgICB9CiAgICByZXR1cm4gZmFsc2U7 ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gbW9yZSBtYXRjaGVzCiAgfQoK ICBwdWJsaWMgYm9vbGVhbiBza2lwVG8oaW50IHRhcmdldCkgdGhyb3dzIElPRXhjZXB0aW9uIHsK ICAgIGlmIChmaXJzdFRpbWUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbml0 aWFsaXplCiAgICAgIGluaXRMaXN0KGZhbHNlKTsKICAgICAgZm9yIChTcGFuc0NlbGwgY2VsbCA9 IGZpcnN0OyBtb3JlICYmIGNlbGwhPW51bGw7IGNlbGw9Y2VsbC5uZXh0KSB7CiAgICAgICAgbW9y ZSA9IGNlbGwuc2tpcFRvKHRhcmdldCk7ICAgICAgICAgICAgICAgLy8gc2tpcCBhbGwKICAgICAg fQogICAgICBpZiAobW9yZSkgewogICAgICAgIGxpc3RUb1F1ZXVlKCk7CiAgICAgIH0KICAgICAg Zmlyc3RUaW1lID0gZmFsc2U7CiAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgLy8gbm9ybWFsIGNhc2UKICAgICAgd2hpbGUgKG1vcmUgJiYgbWluKCkuZG9j KCkgPCB0YXJnZXQpIHsgICAgICAvLyBza2lwIGFzIG5lZWRlZAogICAgICAgIGlmIChtaW4oKS5z a2lwVG8odGFyZ2V0KSkgewogICAgICAgICAgcXVldWUuYWRqdXN0VG9wKCk7CiAgICAgICAgfSBl bHNlIHsKICAgICAgICAgIG1vcmUgPSBmYWxzZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAg IHJldHVybiBtb3JlICYmIChhdE1hdGNoKCkgfHwgIG5leHQoKSk7CiAgfQoKICBwcml2YXRlIFNw YW5zQ2VsbCBtaW4oKSB7IHJldHVybiAoU3BhbnNDZWxsKXF1ZXVlLnRvcCgpOyB9CgogIHB1Ymxp YyBpbnQgZG9jKCkgeyByZXR1cm4gbWluKCkuZG9jKCk7IH0KICBwdWJsaWMgaW50IHN0YXJ0KCkg eyByZXR1cm4gbWluKCkuc3RhcnQoKTsgfQogIHB1YmxpYyBpbnQgZW5kKCkgeyByZXR1cm4gbWF4 LmVuZCgpOyB9CgoKICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgcmV0dXJuIGdldENs YXNzKCkuZ2V0TmFtZSgpICsgIigiK3F1ZXJ5LnRvU3RyaW5nKCkrIilAIisKICAgICAgKGZpcnN0 VGltZT8iU1RBUlQiOihtb3JlPyhkb2MoKSsiOiIrc3RhcnQoKSsiLSIrZW5kKCkpOiJFTkQiKSk7 CiAgfQoKICBwcml2YXRlIHZvaWQgaW5pdExpc3QoYm9vbGVhbiBuZXh0KSB0aHJvd3MgSU9FeGNl cHRpb24gewogICAgZm9yIChpbnQgaSA9IDA7IG1vcmUgJiYgaSA8IG9yZGVyZWQuc2l6ZSgpOyBp KyspIHsKICAgICAgU3BhbnNDZWxsIGNlbGwgPSAoU3BhbnNDZWxsKW9yZGVyZWQuZ2V0KGkpOwog ICAgICBpZiAobmV4dCkKICAgICAgICBtb3JlID0gY2VsbC5uZXh0KCk7ICAgICAgICAgICAgICAg ICAgICAgICAvLyBtb3ZlIHRvIGZpcnN0IGVudHJ5CiAgICAgIGlmIChtb3JlKSB7CiAgICAgICAg YWRkVG9MaXN0KGNlbGwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRkIHRvIGxpc3QK ICAgICAgfQogICAgfQogIH0KCiAgcHJpdmF0ZSB2b2lkIGFkZFRvTGlzdChTcGFuc0NlbGwgY2Vs bCkgewogICAgaWYgKGxhc3QgIT0gbnVsbCkgewkJCSAgLy8gYWRkIG5leHQgdG8gZW5kIG9mIGxp c3QKICAgICAgbGFzdC5uZXh0ID0gY2VsbDsKICAgIH0gZWxzZQogICAgICBmaXJzdCA9IGNlbGw7 CiAgICBsYXN0ID0gY2VsbDsKICAgIGNlbGwubmV4dCA9IG51bGw7CiAgfQoKICBwcml2YXRlIHZv aWQgZmlyc3RUb0xhc3QoKSB7CiAgICBsYXN0Lm5leHQgPSBmaXJzdDsJCQkgIC8vIG1vdmUgZmly c3QgdG8gZW5kIG9mIGxpc3QKICAgIGxhc3QgPSBmaXJzdDsKICAgIGZpcnN0ID0gZmlyc3QubmV4 dDsKICAgIGxhc3QubmV4dCA9IG51bGw7CiAgfQoKICBwcml2YXRlIHZvaWQgcXVldWVUb0xpc3Qo KSB7CiAgICBsYXN0ID0gZmlyc3QgPSBudWxsOwogICAgd2hpbGUgKHF1ZXVlLnRvcCgpICE9IG51 bGwpIHsKICAgICAgYWRkVG9MaXN0KChTcGFuc0NlbGwpcXVldWUucG9wKCkpOwogICAgfQogIH0K ICAKICBwcml2YXRlIHZvaWQgbGlzdFRvUXVldWUoKSB7CiAgICBxdWV1ZS5jbGVhcigpOyAvLyBy ZWJ1aWxkIHF1ZXVlCiAgICBmb3IgKFNwYW5zQ2VsbCBjZWxsID0gZmlyc3Q7IGNlbGwgIT0gbnVs bDsgY2VsbCA9IGNlbGwubmV4dCkgewogICAgICBxdWV1ZS5wdXQoY2VsbCk7ICAgICAgICAgICAg ICAgICAgICAgIC8vIGFkZCB0byBxdWV1ZSBmcm9tIGxpc3QKICAgIH0KICB9CgogIHByaXZhdGUg Ym9vbGVhbiBhdE1hdGNoKCkgewogICAgcmV0dXJuIChtaW4oKS5kb2MoKSA9PSBtYXguZG9jKCkp CiAgICAgICAgJiYgKChtYXguZW5kKCkgLSBtaW4oKS5zdGFydCgpIC0gdG90YWxMZW5ndGgpIDw9 IHNsb3ApOwogIH0KICAKICBwdWJsaWMgU3BhbnNbXSBtYXRjaGluZ1NwYW5zKCkgewoJICAKCSAg QXJyYXlMaXN0PFNwYW5zPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTcGFucz4oKTsKCgkgIGlmIChm aXJzdCA9PSBudWxsKSByZXR1cm4gbnVsbDsKCSAgCgkgIGZvciAoU3BhbnNDZWxsIGNlbGwgPSBm aXJzdDsgY2VsbCAhPSBudWxsOyBjZWxsID0gY2VsbC5uZXh0KSB7CgkgICAgICAKCSAgICAgIGlm IChjZWxsLmRvYygpICE9IGRvYygpKSBjb250aW51ZTsKCSAgICAgIAoJICAgICAgaWYgKGNlbGwu c3RhcnQoKSA+PSBzdGFydCgpICYmIGNlbGwuZW5kKCkgPD0gZW5kKCkpCgkJCSAgbGlzdC5hZGQo Y2VsbCk7CgkgIH0KCSAgCgkgIHJldHVybiBsaXN0LnRvQXJyYXkobmV3IFNwYW5zWzBdKTsKICB9 Cn0K ------=_Part_15540_13306473.1213000616990 Content-Type: text/plain; charset=us-ascii --------------------------------------------------------------------- To unsubscribe, e-mail: java-dev-unsubscribe@lucene.apache.org For additional commands, e-mail: java-dev-help@lucene.apache.org ------=_Part_15540_13306473.1213000616990--