Author: norman
Date: Wed Jan 12 15:07:55 2011
New Revision: 1058172
URL: http://svn.apache.org/viewvc?rev=1058172&view=rev
Log:
Merge IdRanges whenever possible to avoid not needed queries. See IMAP-211
Added:
james/imap/trunk/api/src/test/java/org/apache/james/imap/api/IdRangeTest.java
Modified:
james/imap/trunk/api/src/main/java/org/apache/james/imap/api/message/IdRange.java
james/imap/trunk/message/src/main/java/org/apache/james/imap/decode/base/AbstractImapCommandParser.java
james/imap/trunk/message/src/test/java/org/apache/james/imap/decode/parser/SearchCommandParserAndParenthesesTest.java
james/imap/trunk/message/src/test/java/org/apache/james/imap/decode/parser/SearchCommandParserNotTest.java
james/imap/trunk/message/src/test/java/org/apache/james/imap/decode/parser/SearchCommandParserOrTest.java
james/imap/trunk/message/src/test/java/org/apache/james/imap/decode/parser/SearchCommandParserSearchKeySequenceSetTest.java
james/imap/trunk/message/src/test/java/org/apache/james/imap/decode/parser/SearchCommandParserTopLevelAndTest.java
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/AbstractMailboxProcessor.java
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/SearchProcessor.java
james/imap/trunk/processor/src/test/java/org/apache/james/imap/processor/SearchProcessorTest.java
Modified:
james/imap/trunk/api/src/main/java/org/apache/james/imap/api/message/IdRange.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/api/src/main/java/org/apache/james/imap/api/message/IdRange.java?rev=1058172&r1=1058171&r2=1058172&view=diff
==============================================================================
---
james/imap/trunk/api/src/main/java/org/apache/james/imap/api/message/IdRange.java
(original)
+++
james/imap/trunk/api/src/main/java/org/apache/james/imap/api/message/IdRange.java
Wed Jan 12 15:07:55 2011
@@ -19,6 +19,11 @@
package org.apache.james.imap.api.message;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
/**
* Represents a range of UID or MSN values.
*/
@@ -34,6 +39,7 @@ public class IdRange {
}
public IdRange(long lowVal, long highVal) {
+ if (lowVal > highVal) throw new IllegalArgumentException("LowVal must
be <= HighVal");
_lowVal = lowVal;
_highVal = highVal;
}
@@ -45,6 +51,16 @@ public class IdRange {
public long getHighVal() {
return _highVal;
}
+
+ public void setLowVal(long lowVal) {
+ if (lowVal > _highVal) throw new IllegalArgumentException("LowVal must
be <= HighVal");
+ _lowVal = lowVal;
+ }
+
+ public void setHighVal(long highVal) {
+ if (_lowVal > highVal) throw new IllegalArgumentException("LowVal must
be <= HighVal");
+ _highVal = highVal;
+ }
/**
* Return true if the {...@link IdRange} includes the given value
@@ -96,5 +112,43 @@ public class IdRange {
return retValue;
}
+
+ /**
+ * Utility method which will copy the given {...@link List} and try to
merge the
+ * {...@link IdRange} in the copy before return it.
+ *
+ *
+ * @param ranges
+ * @return mergedRanges
+ */
+ public static List<IdRange> mergeRanges(final List<IdRange> ranges) {
+ List<IdRange> copy = new ArrayList<IdRange>(ranges);
+ Collections.sort(copy, IdRangeComperator.INSTANCE);
+
+ for (int i = 0; i < copy.size() -1; i++) {
+ IdRange current = copy.get(i);
+ IdRange next = copy.get(i +1);
+ if (current.getHighVal() >= next.getLowVal() -1) {
+ if (next.getHighVal() > current.getHighVal()) {
+ current.setHighVal(next.getHighVal());
+ }
+ // remove the merged id range and decrease the count
+ copy.remove(next);
+ i--;
+ }
+ }
+ return copy;
+
+ }
+
+ private static class IdRangeComperator implements Comparator<IdRange> {
+
+ private static IdRangeComperator INSTANCE = new IdRangeComperator();
+
+ public int compare(IdRange range1, IdRange range2) {
+ return (int) (range1.getLowVal() - range2.getLowVal());
+ }
+
+ }
}
Added:
james/imap/trunk/api/src/test/java/org/apache/james/imap/api/IdRangeTest.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/api/src/test/java/org/apache/james/imap/api/IdRangeTest.java?rev=1058172&view=auto
==============================================================================
---
james/imap/trunk/api/src/test/java/org/apache/james/imap/api/IdRangeTest.java
(added)
+++
james/imap/trunk/api/src/test/java/org/apache/james/imap/api/IdRangeTest.java
Wed Jan 12 15:07:55 2011
@@ -0,0 +1,130 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one *
+ * or more contributor license agreements. See the NOTICE file *
+ * distributed with this work for additional information *
+ * regarding copyright ownership. The ASF licenses this file *
+ * to you under the Apache License, Version 2.0 (the *
+ * "License"); you may not use this file except in compliance *
+ * with the License. You may obtain a copy of the License at *
+ * *
+ * http://www.apache.org/licenses/LICENSE-2.0 *
+ * *
+ * Unless required by applicable law or agreed to in writing, *
+ * software distributed under the License is distributed on an *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
+ * KIND, either express or implied. See the License for the *
+ * specific language governing permissions and limitations *
+ * under the License. *
+ ****************************************************************/
+package org.apache.james.imap.api;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import static org.junit.Assert.*;
+
+import org.apache.james.imap.api.message.IdRange;
+import org.junit.Test;
+
+public class IdRangeTest {
+
+ @Test
+ public void testNotMerge() {
+ IdRange r = new IdRange(0, 2);
+ IdRange r2 = new IdRange(4, 5);
+ IdRange r3 = new IdRange(7, 10);
+
+ List<IdRange> ranges = new ArrayList<IdRange>();
+ ranges.add(r);
+ ranges.add(r2);
+ ranges.add(r3);
+
+ List<IdRange> merged = IdRange.mergeRanges(ranges);
+ assertEquals(3, merged.size());
+ Iterator<IdRange> rIt = merged.iterator();
+ checkIdRange(r,rIt.next());
+ checkIdRange(r2,rIt.next());
+ checkIdRange(r3,rIt.next());
+ assertFalse(rIt.hasNext());
+ }
+
+
+ @Test
+ public void testMerge() {
+ IdRange r = new IdRange(0, 2);
+ IdRange r2 = new IdRange(1, 4);
+ IdRange r3 = new IdRange(6, 7);
+
+ List<IdRange> ranges = new ArrayList<IdRange>();
+ ranges.add(r);
+ ranges.add(r2);
+ ranges.add(r3);
+
+ List<IdRange> merged = IdRange.mergeRanges(ranges);
+ assertEquals(2, merged.size());
+ Iterator<IdRange> rIt = merged.iterator();
+ checkIdRange(new IdRange(0, 4),rIt.next());
+ checkIdRange(r3,rIt.next());
+ assertFalse(rIt.hasNext());
+ }
+
+
+ @Test
+ public void testMerge2() {
+ IdRange r = new IdRange(0, 10);
+ IdRange r2 = new IdRange(1, 4);
+ IdRange r3 = new IdRange(5, 7);
+
+ List<IdRange> ranges = new ArrayList<IdRange>();
+ ranges.add(r);
+ ranges.add(r2);
+ ranges.add(r3);
+
+ List<IdRange> merged = IdRange.mergeRanges(ranges);
+ assertEquals(1, merged.size());
+ Iterator<IdRange> rIt = merged.iterator();
+ checkIdRange(new IdRange(0, 10),rIt.next());
+ assertFalse(rIt.hasNext());
+ }
+
+ @Test
+ public void testMerge3() {
+ IdRange r = new IdRange(0, 10);
+ IdRange r2 = new IdRange(1, 4);
+ IdRange r3 = new IdRange(10, 15);
+
+ List<IdRange> ranges = new ArrayList<IdRange>();
+ ranges.add(r);
+ ranges.add(r2);
+ ranges.add(r3);
+
+ List<IdRange> merged = IdRange.mergeRanges(ranges);
+ assertEquals(1, merged.size());
+ Iterator<IdRange> rIt = merged.iterator();
+ checkIdRange(new IdRange(0, 15),rIt.next());
+ assertFalse(rIt.hasNext());
+ }
+
+ @Test
+ public void testMerge4() {
+ IdRange r = new IdRange(0, 1);
+ IdRange r2 = new IdRange(1, 1);
+ IdRange r3 = new IdRange(2, 2);
+
+ List<IdRange> ranges = new ArrayList<IdRange>();
+ ranges.add(r);
+ ranges.add(r2);
+ ranges.add(r3);
+
+ List<IdRange> merged = IdRange.mergeRanges(ranges);
+ assertEquals(1, merged.size());
+ Iterator<IdRange> rIt = merged.iterator();
+ checkIdRange(new IdRange(0, 2),rIt.next());
+ assertFalse(rIt.hasNext());
+ }
+
+ private void checkIdRange(IdRange r1, IdRange r2) {
+ assertEquals(r1.getLowVal(), r2.getLowVal());
+ assertEquals(r1.getHighVal(), r2.getHighVal());
+ }
+}
Modified:
james/imap/trunk/message/src/main/java/org/apache/james/imap/decode/base/AbstractImapCommandParser.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/message/src/main/java/org/apache/james/imap/decode/base/AbstractImapCommandParser.java?rev=1058172&r1=1058171&r2=1058172&view=diff
==============================================================================
---
james/imap/trunk/message/src/main/java/org/apache/james/imap/decode/base/AbstractImapCommandParser.java
(original)
+++
james/imap/trunk/message/src/main/java/org/apache/james/imap/decode/base/AbstractImapCommandParser.java
Wed Jan 12 15:07:55 2011
@@ -33,6 +33,7 @@ import java.nio.charset.MalformedInputEx
import java.nio.charset.UnmappableCharacterException;
import java.util.ArrayList;
import java.util.Date;
+import java.util.List;
import javax.mail.Flags;
@@ -63,7 +64,7 @@ public abstract class AbstractImapComman
private static final int QUOTED_BUFFER_INITIAL_CAPACITY = 64;
private static final Charset US_ASCII = Charset.forName("US-ASCII");
-
+
private final ImapCommand command;
private ImapMessageFactory messageFactory;
@@ -590,9 +591,14 @@ public abstract class AbstractImapComman
}
String range = nextWord.substring(pos);
rangeList.add(parseRange(range));
- return (IdRange[]) rangeList.toArray(new IdRange[rangeList.size()]);
+
+ // merge the ranges to minimize the needed queries.
+ // See IMAP-211
+ List<IdRange> merged = IdRange.mergeRanges(rangeList);
+ return (IdRange[]) merged.toArray(new IdRange[merged.size()]);
}
+
/**
* Parse a range which use a ":" as delimiter
*
@@ -607,15 +613,16 @@ public abstract class AbstractImapComman
long value = parseUnsignedInteger(range);
return new IdRange(value);
} else {
-
- // Make sure we detect the low and high value
- // See https://issues.apache.org/jira/browse/IMAP-212
+ // Make sure we detect the low and high value
+ // See https://issues.apache.org/jira/browse/IMAP-212
long val1 = parseUnsignedInteger(range.substring(0, pos));
long val2 = parseUnsignedInteger(range.substring(pos + 1));
- if (val1 <= val2 || val1 == Long.MAX_VALUE) {
- return new IdRange(val1, val2);
+ if (val1 <= val2) {
+ return new IdRange(val1, val2);
+ } else if(val1 == Long.MAX_VALUE) {
+ return new IdRange(Long.MIN_VALUE, val2);
} else {
- return new IdRange(val2, val1);
+ return new IdRange(val2, val1);
}
}
} catch (NumberFormatException e) {
@@ -627,10 +634,10 @@ public abstract class AbstractImapComman
if (value.length() == 1 && value.charAt(0) == '*') {
return Long.MAX_VALUE;
} else {
- long number = Long.parseLong(value);
- if (number < ImapConstants.MIN_NZ_NUMBER || number >
ImapConstants.MAX_NZ_NUMBER) throw new
DecodingException(HumanReadableText.ILLEGAL_ARGUMENTS, "Invalid message set.
Numbers must be unsigned 32-bit Integers");
- return number;
-
+ long number = Long.parseLong(value);
+ if (number < ImapConstants.MIN_NZ_NUMBER || number >
ImapConstants.MAX_NZ_NUMBER) throw new
DecodingException(HumanReadableText.ILLEGAL_ARGUMENTS, "Invalid message set.
Numbers must be unsigned 32-bit Integers");
+ return number;
+
}
}
@@ -793,4 +800,5 @@ public abstract class AbstractImapComman
charBuffer.put(oldBuffer);
}
}
+
}
Modified:
james/imap/trunk/message/src/test/java/org/apache/james/imap/decode/parser/SearchCommandParserAndParenthesesTest.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/message/src/test/java/org/apache/james/imap/decode/parser/SearchCommandParserAndParenthesesTest.java?rev=1058172&r1=1058171&r2=1058172&view=diff
==============================================================================
---
james/imap/trunk/message/src/test/java/org/apache/james/imap/decode/parser/SearchCommandParserAndParenthesesTest.java
(original)
+++
james/imap/trunk/message/src/test/java/org/apache/james/imap/decode/parser/SearchCommandParserAndParenthesesTest.java
Wed Jan 12 15:07:55 2011
@@ -72,14 +72,14 @@ public class SearchCommandParserAndParen
}
public static Input sequence() {
- IdRange[] range = { new IdRange(Long.MAX_VALUE, 100), new IdRange(110),
+ IdRange[] range = { new IdRange(Long.MIN_VALUE, 100), new IdRange(110),
new IdRange(200, 201), new IdRange(400, Long.MAX_VALUE) };
SearchKey key = SearchKey.buildSequenceSet(range);
return new Input("*:100,110,200:201,400:*", key);
}
public static Input uid() {
- IdRange[] range = { new IdRange(Long.MAX_VALUE, 100), new IdRange(110),
+ IdRange[] range = { new IdRange(Long.MIN_VALUE, 100), new IdRange(110),
new IdRange(200, 201), new IdRange(400, Long.MAX_VALUE) };
SearchKey key = SearchKey.buildUidSet(range);
return new Input("UID *:100,110,200:201,400:*", key);
Modified:
james/imap/trunk/message/src/test/java/org/apache/james/imap/decode/parser/SearchCommandParserNotTest.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/message/src/test/java/org/apache/james/imap/decode/parser/SearchCommandParserNotTest.java?rev=1058172&r1=1058171&r2=1058172&view=diff
==============================================================================
---
james/imap/trunk/message/src/test/java/org/apache/james/imap/decode/parser/SearchCommandParserNotTest.java
(original)
+++
james/imap/trunk/message/src/test/java/org/apache/james/imap/decode/parser/SearchCommandParserNotTest.java
Wed Jan 12 15:07:55 2011
@@ -62,7 +62,7 @@ public class SearchCommandParserNotTest
@Test
public void testShouldParseNotSequence() throws Exception {
- IdRange[] range = { new IdRange(Long.MAX_VALUE, 100), new IdRange(110),
+ IdRange[] range = { new IdRange(Long.MIN_VALUE, 100), new IdRange(110),
new IdRange(200, 201), new IdRange(400, Long.MAX_VALUE) };
SearchKey notdKey = SearchKey.buildSequenceSet(range);
SearchKey key = SearchKey.buildNot(notdKey);
@@ -71,7 +71,7 @@ public class SearchCommandParserNotTest
@Test
public void testShouldParseNotUid() throws Exception {
- IdRange[] range = { new IdRange(Long.MAX_VALUE, 100), new IdRange(110),
+ IdRange[] range = { new IdRange(Long.MIN_VALUE, 100), new IdRange(110),
new IdRange(200, 201), new IdRange(400, Long.MAX_VALUE) };
SearchKey notdKey = SearchKey.buildUidSet(range);
SearchKey key = SearchKey.buildNot(notdKey);
Modified:
james/imap/trunk/message/src/test/java/org/apache/james/imap/decode/parser/SearchCommandParserOrTest.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/message/src/test/java/org/apache/james/imap/decode/parser/SearchCommandParserOrTest.java?rev=1058172&r1=1058171&r2=1058172&view=diff
==============================================================================
---
james/imap/trunk/message/src/test/java/org/apache/james/imap/decode/parser/SearchCommandParserOrTest.java
(original)
+++
james/imap/trunk/message/src/test/java/org/apache/james/imap/decode/parser/SearchCommandParserOrTest.java
Wed Jan 12 15:07:55 2011
@@ -61,14 +61,14 @@ public class SearchCommandParserOrTest {
}
public Input sequence() {
- IdRange[] range = { new IdRange(Long.MAX_VALUE, 100), new IdRange(110),
+ IdRange[] range = { new IdRange(Long.MIN_VALUE, 100), new IdRange(110),
new IdRange(200, 201), new IdRange(400, Long.MAX_VALUE) };
SearchKey key = SearchKey.buildSequenceSet(range);
return new Input("*:100,110,200:201,400:*", key);
}
public Input uid() {
- IdRange[] range = { new IdRange(Long.MAX_VALUE, 100), new IdRange(110),
+ IdRange[] range = { new IdRange(Long.MIN_VALUE, 100), new IdRange(110),
new IdRange(200, 201), new IdRange(400, Long.MAX_VALUE) };
SearchKey key = SearchKey.buildUidSet(range);
return new Input("UID *:100,110,200:201,400:*", key);
Modified:
james/imap/trunk/message/src/test/java/org/apache/james/imap/decode/parser/SearchCommandParserSearchKeySequenceSetTest.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/message/src/test/java/org/apache/james/imap/decode/parser/SearchCommandParserSearchKeySequenceSetTest.java?rev=1058172&r1=1058171&r2=1058172&view=diff
==============================================================================
---
james/imap/trunk/message/src/test/java/org/apache/james/imap/decode/parser/SearchCommandParserSearchKeySequenceSetTest.java
(original)
+++
james/imap/trunk/message/src/test/java/org/apache/james/imap/decode/parser/SearchCommandParserSearchKeySequenceSetTest.java
Wed Jan 12 15:07:55 2011
@@ -72,14 +72,14 @@ public class SearchCommandParserSearchKe
@Test
public void testEndStar() throws Exception {
- IdRange[] range = { new IdRange(8), new IdRange(9, 10),
+ IdRange[] range = { new IdRange(8), new IdRange(10,11),
new IdRange(17), new IdRange(100, Long.MAX_VALUE) };
- check("8,9:10,17,100:*", range);
+ check("8,10:11,17,100:*", range);
}
@Test
public void testStartStar() throws Exception {
- IdRange[] range = { new IdRange(Long.MAX_VALUE, 9), new IdRange(15),
+ IdRange[] range = { new IdRange(Long.MIN_VALUE, 9), new IdRange(15),
new IdRange(799, 820) };
check("*:9,15,799:820", range);
}
Modified:
james/imap/trunk/message/src/test/java/org/apache/james/imap/decode/parser/SearchCommandParserTopLevelAndTest.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/message/src/test/java/org/apache/james/imap/decode/parser/SearchCommandParserTopLevelAndTest.java?rev=1058172&r1=1058171&r2=1058172&view=diff
==============================================================================
---
james/imap/trunk/message/src/test/java/org/apache/james/imap/decode/parser/SearchCommandParserTopLevelAndTest.java
(original)
+++
james/imap/trunk/message/src/test/java/org/apache/james/imap/decode/parser/SearchCommandParserTopLevelAndTest.java
Wed Jan 12 15:07:55 2011
@@ -56,14 +56,14 @@ public class SearchCommandParserTopLevel
on(), unanswered(), };
public static Input sequence() {
- IdRange[] range = { new IdRange(Long.MAX_VALUE, 100), new IdRange(110),
+ IdRange[] range = { new IdRange(Long.MIN_VALUE, 100), new IdRange(110),
new IdRange(200, 201), new IdRange(400, Long.MAX_VALUE) };
SearchKey key = SearchKey.buildSequenceSet(range);
return new Input("*:100,110,200:201,400:*", key);
}
public static Input uid() {
- IdRange[] range = { new IdRange(Long.MAX_VALUE, 100), new IdRange(110),
+ IdRange[] range = { new IdRange(Long.MIN_VALUE, 100), new IdRange(110),
new IdRange(200, 201), new IdRange(400, Long.MAX_VALUE) };
SearchKey key = SearchKey.buildUidSet(range);
return new Input("UID *:100,110,200:201,400:*", key);
Modified:
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/AbstractMailboxProcessor.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/AbstractMailboxProcessor.java?rev=1058172&r1=1058171&r2=1058172&view=diff
==============================================================================
---
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/AbstractMailboxProcessor.java
(original)
+++
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/AbstractMailboxProcessor.java
Wed Jan 12 15:07:55 2011
@@ -375,7 +375,7 @@ abstract public class AbstractMailboxPro
long highVal = range.getHighVal();
if (useUids == false) {
- if (lowVal != Long.MAX_VALUE) {
+ if (lowVal != Long.MIN_VALUE) {
lowVal = selected.uid((int) lowVal);
if (lowVal == SelectedMailbox.NO_SUCH_MESSAGE)
throw new MessageRangeException("No message found with msn
" + lowVal);
Modified:
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/SearchProcessor.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/SearchProcessor.java?rev=1058172&r1=1058171&r2=1058172&view=diff
==============================================================================
---
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/SearchProcessor.java
(original)
+++
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/SearchProcessor.java
Wed Jan 12 15:07:55 2011
@@ -248,7 +248,7 @@ public class SearchProcessor extends Abs
if (highUid == SelectedMailbox.NO_SUCH_MESSAGE) highUid =
selected.getLastUid();
}
- if (lowVal == Long.MAX_VALUE) {
+ if (lowVal == Long.MIN_VALUE) {
lowUid = Long.MAX_VALUE;
} else {
final int lowMsn = (int) lowVal;
@@ -261,7 +261,7 @@ public class SearchProcessor extends Abs
highUid = highVal;
- if (lowVal != Long.MAX_VALUE && lowVal <
selected.getFirstUid()) {
+ if (lowVal != Long.MIN_VALUE && lowVal <
selected.getFirstUid()) {
lowUid = selected.getFirstUid();
}
Modified:
james/imap/trunk/processor/src/test/java/org/apache/james/imap/processor/SearchProcessorTest.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/processor/src/test/java/org/apache/james/imap/processor/SearchProcessorTest.java?rev=1058172&r1=1058171&r2=1058172&view=diff
==============================================================================
---
james/imap/trunk/processor/src/test/java/org/apache/james/imap/processor/SearchProcessorTest.java
(original)
+++
james/imap/trunk/processor/src/test/java/org/apache/james/imap/processor/SearchProcessorTest.java
Wed Jan 12 15:07:55 2011
@@ -129,7 +129,7 @@ public class SearchProcessorTest {
@Test
public void testSequenceSetLowerUnlimited() throws Exception {
expectsGetSelectedMailbox();
- final IdRange[] ids = { new IdRange(Long.MAX_VALUE, 1729) };
+ final IdRange[] ids = { new IdRange(Long.MIN_VALUE, 1729) };
final SearchQuery.NumericRange[] ranges = { new
SearchQuery.NumericRange(
Long.MAX_VALUE, 1729L) };
mockery.checking(new Expectations() {{
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]