You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@juneau.apache.org by ja...@apache.org on 2017/06/18 23:09:33 UTC

incubator-juneau git commit: PojoQuery tests.

Repository: incubator-juneau
Updated Branches:
  refs/heads/master b462cb452 -> 0f76a0fa5


PojoQuery tests.

Project: http://git-wip-us.apache.org/repos/asf/incubator-juneau/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-juneau/commit/0f76a0fa
Tree: http://git-wip-us.apache.org/repos/asf/incubator-juneau/tree/0f76a0fa
Diff: http://git-wip-us.apache.org/repos/asf/incubator-juneau/diff/0f76a0fa

Branch: refs/heads/master
Commit: 0f76a0fa5c4f418e07da2d9a8a42cc66774d9bf8
Parents: b462cb4
Author: JamesBognar <ja...@apache.org>
Authored: Sun Jun 18 19:09:30 2017 -0400
Committer: JamesBognar <ja...@apache.org>
Committed: Sun Jun 18 19:09:30 2017 -0400

----------------------------------------------------------------------
 .../org/apache/juneau/utils/PojoQueryTest.java  | 1061 +++++++-----------
 .../org/apache/juneau/utils/SearchArgs.java     |    8 +
 2 files changed, 418 insertions(+), 651 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/0f76a0fa/juneau-core-test/src/test/java/org/apache/juneau/utils/PojoQueryTest.java
----------------------------------------------------------------------
diff --git a/juneau-core-test/src/test/java/org/apache/juneau/utils/PojoQueryTest.java b/juneau-core-test/src/test/java/org/apache/juneau/utils/PojoQueryTest.java
index 8f7e481..5ed3609 100755
--- a/juneau-core-test/src/test/java/org/apache/juneau/utils/PojoQueryTest.java
+++ b/juneau-core-test/src/test/java/org/apache/juneau/utils/PojoQueryTest.java
@@ -12,657 +12,416 @@
 // ***************************************************************************************************************************
 package org.apache.juneau.utils;
 
+import static org.apache.juneau.TestUtils.*;
+import static org.junit.Assert.*;
+
+import java.util.*;
+
+import org.apache.juneau.*;
+import org.apache.juneau.json.*;
+import org.apache.juneau.serializer.*;
+import org.apache.juneau.transforms.*;
+import org.junit.*;
+
+@SuppressWarnings("rawtypes")
 public class PojoQueryTest {
 
-//	//====================================================================================================
-//	// filterCollection, string search, 1 level
-//	//====================================================================================================
-//	@Test
-//	public void testFilterCollectionStringSearchOneLevel() throws Exception {
-//		ObjectMap query = null;
-//		List view = null;
-//		List sort = null;
-//		int pos = 0;
-//		int limit = 0;
-//		boolean ignoreCase = false;
-//		BeanSession session = BeanContext.DEFAULT.createSession();
-//		List results;
-//
-//		List<A> in = new AList<A>()
-//			.append(new A("foo"))
-//			.append(new A("bar"))
-//			.append(new A("baz"))
-//		;
-//
-//		PojoQuery filter = new PojoQuery(in, session);
-//
-//		query = new ObjectMap("{f:'foo'}");
-//		results = filter.filterCollection(query, view, sort, pos, limit, ignoreCase);
-//		assertObjectEquals("[{f:'foo'}]", results);
-//
-//		query = new ObjectMap("{f:'fo*'}");
-//		results = filter.filterCollection(query, view, sort, pos, limit, ignoreCase);
-//		assertObjectEquals("[{f:'foo'}]", results);
-//
-//		query = new ObjectMap("{f:'*ar'}");
-//		results = filter.filterCollection(query, view, sort, pos, limit, ignoreCase);
-//		assertObjectEquals("[{f:'bar'}]", results);
-//
-//		query = new ObjectMap("{f:'foo bar'}");
-//		results = filter.filterCollection(query, view, sort, pos, limit, ignoreCase);
-//		assertObjectEquals("[{f:'foo'},{f:'bar'}]", results);
-//	}
-//
-//	public class A {
-//		public String f;
-//
-//		A() {}
-//
-//		A(String f) {
-//			this.f = f;
-//		}
-//	}
-//
-//	//====================================================================================================
-//	// filterCollection, date search, 1 level
-//	//====================================================================================================
-//	@Test
-//	public void testFilterCollectionDateSearchOneLevel() throws Exception {
-//		ObjectMap query = null;
-//		List view = null;
-//		List sort = null;
-//		int pos = 0;
-//		int limit = 0;
-//		boolean ignoreCase = false;
-//		BeanSession session = BeanContext.DEFAULT.createSession();
-//		WriterSerializer s = new JsonSerializerBuilder().simple().pojoSwaps(CalendarSwap.DateTimeSimple.class).build();
-//		B[] in;
-//		PojoQuery filter;
-//
-//		List results;
-//
-//		in = new B[] {
-//			new B(2010, 0, 1),
-//			new B(2011, 0, 1),
-//			new B(2011, 0, 31),
-//			new B(2012, 0, 1)
-//		};
-//		filter = new PojoQuery(in, session);
-//
-//		query = new ObjectMap("{f:'2011'}");
-//		results = filter.filterCollection(query, view, sort, pos, limit, ignoreCase);
-//		assertEquals("[{f:'2011/01/01 00:00:00'},{f:'2011/01/31 00:00:00'}]", s.serialize(results));
-//
-//		query = new ObjectMap("{f:'2011.01'}");
-//		results = filter.filterCollection(query, view, sort, pos, limit, ignoreCase);
-//		assertEquals("[{f:'2011/01/01 00:00:00'},{f:'2011/01/31 00:00:00'}]", s.serialize(results));
-//
-//		query = new ObjectMap("{f:'2011.01.01'}");
-//		results = filter.filterCollection(query, view, sort, pos, limit, ignoreCase);
-//		assertEquals("[{f:'2011/01/01 00:00:00'}]", s.serialize(results));
-//
-//		in = new B[] {
-//			new B(2011, 00, 01, 11, 59, 59),
-//			new B(2011, 00, 01, 12, 00, 00),
-//			new B(2011, 00, 01, 12, 59, 59),
-//			new B(2011, 00, 01, 13, 00, 00)
-//		};
-//		filter = new PojoQuery(in, session);
-//
-//		query = new ObjectMap("{f:'2011.01.01.12'}");
-//		results = filter.filterCollection(query, view, sort, pos, limit, ignoreCase);
-//		assertEquals("[{f:'2011/01/01 12:00:00'},{f:'2011/01/01 12:59:59'}]", s.serialize(results));
-//
-//		in = new B[] {
-//			new B(2011, 00, 01, 12, 29, 59),
-//			new B(2011, 00, 01, 12, 30, 00),
-//			new B(2011, 00, 01, 12, 30, 59),
-//			new B(2011, 00, 01, 12, 31, 00)
-//		};
-//		filter = new PojoQuery(in, session);
-//		query = new ObjectMap("{f:'2011.01.01.12.30'}");
-//		results = filter.filterCollection(query, view, sort, pos, limit, ignoreCase);
-//		assertEquals("[{f:'2011/01/01 12:30:00'},{f:'2011/01/01 12:30:59'}]", s.serialize(results));
-//
-//		in = new B[] {
-//			new B(2011, 00, 01, 12, 30, 29),
-//			new B(2011, 00, 01, 12, 30, 30),
-//			new B(2011, 00, 01, 12, 30, 31)
-//		};
-//		filter = new PojoQuery(in, session);
-//		query = new ObjectMap("{f:'2011.01.01.12.30.30'}");
-//		results = filter.filterCollection(query, view, sort, pos, limit, ignoreCase);
-//		assertEquals("[{f:'2011/01/01 12:30:30'}]", s.serialize(results));
-//
-//		// Open-ended ranges
-//
-//		in = new B[] {
-//			new B(2000, 11, 31),
-//			new B(2001, 00, 01)
-//		};
-//		filter = new PojoQuery(in, session);
-//
-//		query = new ObjectMap("{f:'>2000'}");
-//		results = filter.filterCollection(query, view, sort, pos, limit, ignoreCase);
-//		assertEquals("[{f:'2001/01/01 00:00:00'}]", s.serialize(results));
-//
-//		query = new ObjectMap("{f:'>=2001'}");
-//		results = filter.filterCollection(query, view, sort, pos, limit, ignoreCase);
-//		assertEquals("[{f:'2001/01/01 00:00:00'}]", s.serialize(results));
-//
-//		query = new ObjectMap("{f:'<2001'}");
-//		results = filter.filterCollection(query, view, sort, pos, limit, ignoreCase);
-//		assertEquals("[{f:'2000/12/31 00:00:00'}]", s.serialize(results));
-//
-//		query = new ObjectMap("{f:'<=2000'}");
-//		results = filter.filterCollection(query, view, sort, pos, limit, ignoreCase);
-//		assertEquals("[{f:'2000/12/31 00:00:00'}]", s.serialize(results));
-//
-//		in = new B[] {
-//			new B(2011, 00, 01, 12, 29, 59),
-//			new B(2011, 00, 01, 12, 30, 00)
-//		};
-//		filter = new PojoQuery(in, session);
-//
-//		query = new ObjectMap("{f:'>=2011.01.01.12.30'}");
-//		results = filter.filterCollection(query, view, sort, pos, limit, ignoreCase);
-//		assertEquals("[{f:'2011/01/01 12:30:00'}]", s.serialize(results));
-//
-//		query = new ObjectMap("{f:'<2011.01.01.12.30'}");
-//		results = filter.filterCollection(query, view, sort, pos, limit, ignoreCase);
-//		assertEquals("[{f:'2011/01/01 12:29:59'}]", s.serialize(results));
-//
-//		in = new B[] {
-//			new B(2011, 00, 01, 12, 30, 59),
-//			new B(2011, 00, 01, 12, 31, 00)
-//		};
-//		filter = new PojoQuery(in, session);
-//
-//		query = new ObjectMap("{f:'>2011.01.01.12.30'}");
-//		results = filter.filterCollection(query, view, sort, pos, limit, ignoreCase);
-//		assertEquals("[{f:'2011/01/01 12:31:00'}]", s.serialize(results));
-//
-//		query = new ObjectMap("{f:'<=2011.01.01.12.30'}");
-//		results = filter.filterCollection(query, view, sort, pos, limit, ignoreCase);
-//		assertEquals("[{f:'2011/01/01 12:30:59'}]", s.serialize(results));
-//
-//		// Closed range
-//
-//		in = new B[] {
-//			new B(2000, 11, 31, 23, 59, 59),
-//			new B(2001, 00, 01, 00, 00, 00),
-//			new B(2003, 05, 30, 23, 59, 59),
-//			new B(2003, 06, 01, 00, 00, 00)
-//		};
-//		filter = new PojoQuery(in, session);
-//
-//		query = new ObjectMap("{f:'2001 - 2003.06.30'}");
-//		results = filter.filterCollection(query, view, sort, pos, limit, ignoreCase);
-//		assertEquals("[{f:'2001/01/01 00:00:00'},{f:'2003/06/30 23:59:59'}]", s.serialize(results));
-//
-//		// ORed timestamps
-//
-//		in = new B[] {
-//			new B(2000, 11, 31),
-//			new B(2001, 00, 01),
-//			new B(2001, 11, 31),
-//			new B(2002, 00, 01)
-//		};
-//		filter = new PojoQuery(in, session);
-//
-//		query = new ObjectMap("{f:'2001 2003 2005'}");
-//		results = filter.filterCollection(query, view, sort, pos, limit, ignoreCase);
-//		assertEquals("[{f:'2001/01/01 00:00:00'},{f:'2001/12/31 00:00:00'}]", s.serialize(results));
-//
-//		in = new B[] {
-//			new B(2002, 11, 31),
-//			new B(2003, 00, 01),
-//			new B(2003, 11, 31),
-//			new B(2004, 00, 01)
-//		};
-//		filter = new PojoQuery(in, session);
-//
-//		query = new ObjectMap("{f:'2001 2003 2005'}");
-//		results = filter.filterCollection(query, view, sort, pos, limit, ignoreCase);
-//		assertEquals("[{f:'2003/01/01 00:00:00'},{f:'2003/12/31 00:00:00'}]", s.serialize(results));
-//
-//		in = new B[] {
-//			new B(2004, 11, 31),
-//			new B(2005, 00, 01),
-//			new B(2005, 11, 31),
-//			new B(2006, 00, 01)
-//		};
-//		filter = new PojoQuery(in, session);
-//
-//		query = new ObjectMap("{f:'2001 2003 2005'}");
-//		results = filter.filterCollection(query, view, sort, pos, limit, ignoreCase);
-//		assertEquals("[{f:'2005/01/01 00:00:00'},{f:'2005/12/31 00:00:00'}]", s.serialize(results));
-//	}
-//
-//	public class B {
-//		public Calendar f;
-//
-//		B() {}
-//
-//		B(int year, int month, int day) {
-//			this.f = new GregorianCalendar(year, month, day);
-//		}
-//
-//		B(int year, int month, int day, int hour, int minute, int second) {
-//			this.f = new GregorianCalendar(year, month, day, hour, minute, second);
-//		}
-//	}
-//
-//	//====================================================================================================
-//	// filterCollection, int search, 1 level
-//	//====================================================================================================
-//	@Test
-//	public void testFilterCollectionIntSearchOneLevel() throws Exception {
-//		ObjectMap query = null;
-//		List view = null;
-//		List sort = null;
-//		int pos = 0;
-//		int limit = 0;
-//		boolean ignoreCase = false;
-//		BeanSession session = BeanContext.DEFAULT.createSession();
-//		List results;
-//
-//		List<C> in = new AList<C>()
-//			.append(new C(1))
-//			.append(new C(2))
-//			.append(new C(3))
-//		;
-//
-//		PojoQuery filter = new PojoQuery(in, session);
-//
-//		query = new ObjectMap("{f:'1'}");
-//		results = filter.filterCollection(query, view, sort, pos, limit, ignoreCase);
-//		assertObjectEquals("[{f:1}]", results);
-//
-//		query = new ObjectMap("{f:'>1'}");
-//		results = filter.filterCollection(query, view, sort, pos, limit, ignoreCase);
-//		assertObjectEquals("[{f:2},{f:3}]", results);
-//
-//		query = new ObjectMap("{f:'>=2'}");
-//		results = filter.filterCollection(query, view, sort, pos, limit, ignoreCase);
-//		assertObjectEquals("[{f:2},{f:3}]", results);
-//
-//		query = new ObjectMap("{f:'<=2'}");
-//		results = filter.filterCollection(query, view, sort, pos, limit, ignoreCase);
-//		assertObjectEquals("[{f:1},{f:2}]", results);
-//
-//		query = new ObjectMap("{f:'<2'}");
-//		results = filter.filterCollection(query, view, sort, pos, limit, ignoreCase);
-//		assertObjectEquals("[{f:1}]", results);
-//
-//		query = new ObjectMap("{f:'1 3'}");
-//		results = filter.filterCollection(query, view, sort, pos, limit, ignoreCase);
-//		assertObjectEquals("[{f:1},{f:3}]", results);
-//	}
-//
-//	public class C {
-//		public int f;
-//
-//		C() {}
-//
-//		C(int f) {
-//			this.f = f;
-//		}
-//	}
-//
-//	//====================================================================================================
-//	// filterCollection, string search, 2 level
-//	//====================================================================================================
-//	@Test
-//	public void testFilterCollectionStringSearchTwoLevel() throws Exception {
-//		ObjectMap query = null;
-//		List view = null;
-//		List sort = null;
-//		int pos = 0;
-//		int limit = 0;
-//		boolean ignoreCase = false;
-//		BeanSession session = BeanContext.DEFAULT.createSession();
-//		List results;
-//
-//		List<D1> in = new AList<D1>()
-//			.append(new D1("foo"))
-//			.append(new D1("bar"))
-//			.append(new D1("baz"))
-//		;
-//
-//		PojoQuery filter = new PojoQuery(in, session);
-//
-//		query = new ObjectMap("{f:{f:'foo'}}");
-//		results = filter.filterCollection(query, view, sort, pos, limit, ignoreCase);
-//		assertObjectEquals("[{f:{f:'foo'}}]", results);
-//
-//		query = new ObjectMap("{f:{f:'fo*'}}");
-//		results = filter.filterCollection(query, view, sort, pos, limit, ignoreCase);
-//		assertObjectEquals("[{f:{f:'foo'}}]", results);
-//
-//		query = new ObjectMap("{f:{f:'*ar'}}");
-//		results = filter.filterCollection(query, view, sort, pos, limit, ignoreCase);
-//		assertObjectEquals("[{f:{f:'bar'}}]", results);
-//
-//		query = new ObjectMap("{f:{f:'foo bar'}}");
-//		results = filter.filterCollection(query, view, sort, pos, limit, ignoreCase);
-//		assertObjectEquals("[{f:{f:'foo'}},{f:{f:'bar'}}]", results);
-//	}
-//
-//	public class D1 {
-//		public D2 f;
-//
-//		D1() {}
-//
-//		D1(String f) {
-//			this.f = new D2(f);
-//		}
-//	}
-//	public class D2 {
-//		public String f;
-//
-//		D2() {}
-//
-//		D2(String f) {
-//			this.f = f;
-//		}
-//	}
-//
-//	//====================================================================================================
-//	// filterCollection, view, 1 level
-//	//====================================================================================================
-//	@Test
-//	public void testFilterCollectionViewOneLevel() throws Exception {
-//		ObjectMap query = null;
-//		List view = null;
-//		List sort = null;
-//		int pos = 0;
-//		int limit = 0;
-//		boolean ignoreCase = false;
-//		BeanSession session = BeanContext.DEFAULT.createSession();
-//		List results;
-//
-//		List<E> in = new AList<E>()
-//			.append(new E("foo", 1, true))
-//			.append(new E("bar", 2, false))
-//			.append(new E("baz", 3, true))
-//		;
-//
-//		PojoQuery filter = new PojoQuery(in, session);
-//
-//		view = new ObjectList("['f1']");
-//		results = filter.filterCollection(query, view, sort, pos, limit, ignoreCase);
-//		assertObjectEquals("[{f1:'foo'},{f1:'bar'},{f1:'baz'}]", results);
-//
-//		view = new ObjectList("['f2']");
-//		results = filter.filterCollection(query, view, sort, pos, limit, ignoreCase);
-//		assertObjectEquals("[{f2:1},{f2:2},{f2:3}]", results);
-//
-//		view = new ObjectList("['f3']");
-//		results = filter.filterCollection(query, view, sort, pos, limit, ignoreCase);
-//		assertObjectEquals("[{f3:true},{f3:false},{f3:true}]", results);
-//
-//		view = new ObjectList("['f3','f2','f1']");
-//		results = filter.filterCollection(query, view, sort, pos, limit, ignoreCase);
-//		assertObjectEquals("[{f3:true,f2:1,f1:'foo'},{f3:false,f2:2,f1:'bar'},{f3:true,f2:3,f1:'baz'}]", results);
-//	}
-//
-//	public class E {
-//		public String f1;
-//		public int f2;
-//		public boolean f3;
-//
-//		E() {}
-//
-//		E(String f1, int f2, boolean f3) {
-//			this.f1 = f1;
-//			this.f2 = f2;
-//			this.f3 = f3;
-//		}
-//	}
-//
-//	//====================================================================================================
-//	// filterCollection, view, 2 level
-//	//====================================================================================================
-//	@Test
-//	public void testFilterCollectionViewTwoLevel() throws Exception {
-//		ObjectMap query = null;
-//		List view = null;
-//		List sort = null;
-//		int pos = 0;
-//		int limit = 0;
-//		boolean ignoreCase = false;
-//		BeanSession session = BeanContext.DEFAULT.createSession();
-//		List results;
-//
-//		List<F1> in = new AList<F1>()
-//			.append(new F1("foo"))
-//			.append(new F1("bar"))
-//			.append(new F1("baz"))
-//		;
-//
-//		PojoQuery filter = new PojoQuery(in, session);
-//
-//		view = new ObjectList("['f1']");
-//		results = filter.filterCollection(query, view, sort, pos, limit, ignoreCase);
-//		assertObjectEquals("[{f1:'foo'},{f1:'bar'},{f1:'baz'}]", results);
-//
-//		view = new ObjectList("[{f2:['f1']}]");
-//		results = filter.filterCollection(query, view, sort, pos, limit, ignoreCase);
-//		assertObjectEquals("[{f2:{f1:'f2_foo'}},{f2:{f1:'f2_bar'}},{f2:{f1:'f2_baz'}}]", results);
-//
-//		view = new ObjectList("['f1',{f3:['f1']}]");
-//		results = filter.filterCollection(query, view, sort, pos, limit, ignoreCase);
-//		assertObjectEquals("[{f1:'foo',f3:[{f1:'f31_foo'},{f1:'f32_foo'}]},{f1:'bar',f3:[{f1:'f31_bar'},{f1:'f32_bar'}]},{f1:'baz',f3:[{f1:'f31_baz'},{f1:'f32_baz'}]}]", results);
-//	}
-//
-//	public class F1 {
-//		public String f1;
-//		public F2 f2;
-//		public List<F2> f3;
-//
-//		F1() {}
-//
-//		F1(final String f1) {
-//			this.f1 = f1;
-//			this.f2 = new F2("f2_"+f1);
-//			this.f3 = new AList<F2>()
-//				.append(new F2("f31_"+f1))
-//				.append(new F2("f32_"+f1))
-//			;
-//		}
-//	}
-//
-//	public class F2 {
-//		public String f1;
-//		public String f2;
-//
-//		F2() {}
-//
-//		F2(String f1) {
-//			this.f1 = f1;
-//			this.f2 = f1;
-//		}
-//	}
-//
-//	//====================================================================================================
-//	// filterMap, 1 level
-//	//===================================================================================================
-//	@Test
-//	public void testFilterMapOneLevel() throws Exception {
-//		ObjectList view = null;
-//		BeanSession session = BeanContext.DEFAULT.createSession();
-//		Map results;
-//
-//		G in = new G("foo", 1, true);
-//		PojoQuery filter = new PojoQuery(in, session);
-//
-//		view = new ObjectList("['f1']");
-//		results = filter.filterMap(view);
-//		assertObjectEquals("{f1:'foo'}", results);
-//
-//		view = new ObjectList("['f2']");
-//		results = filter.filterMap(view);
-//		assertObjectEquals("{f2:1}", results);
-//
-//		view = new ObjectList("['f3','f1']");
-//		results = filter.filterMap(view);
-//		assertObjectEquals("{f3:true,f1:'foo'}", results);
-//	}
-//
-//	public class G {
-//		public String f1;
-//		public int f2;
-//		public boolean f3;
-//
-//		G() {}
-//
-//		G(String f1, int f2, boolean f3) {
-//			this.f1 = f1;
-//			this.f2 = f2;
-//			this.f3 = f3;
-//		}
-//	}
-//
-//	//====================================================================================================
-//	// filterMap, 2 level
-//	//====================================================================================================
-//	@Test
-//	public void testFilterMapTwoLevel() throws Exception {
-//		ObjectList view = null;
-//		BeanSession session = BeanContext.DEFAULT.createSession();
-//		Map results;
-//
-//		H1 in = new H1("foo");
-//
-//		PojoQuery filter = new PojoQuery(in, session);
-//
-//		view = new ObjectList("['f1']");
-//		results = filter.filterMap(view);
-//		assertObjectEquals("{f1:'foo'}", results);
-//
-//		view = new ObjectList("[{f2:['f1']}]");
-//		results = filter.filterMap(view);
-//		assertObjectEquals("{f2:{f1:'f2_foo'}}", results);
-//
-//		view = new ObjectList("['f1',{f3:['f1']}]");
-//		results = filter.filterMap(view);
-//		assertObjectEquals("{f1:'foo',f3:[{f1:'f31_foo'},{f1:'f32_foo'}]}", results);
-//	}
-//
-//	public class H1 {
-//		public String f1;
-//		public H2 f2;
-//		public List<H2> f3;
-//
-//		H1() {}
-//
-//		H1(final String f1) {
-//			this.f1 = f1;
-//			this.f2 = new H2("f2_"+f1);
-//			this.f3 = new AList<H2>()
-//				.append(new H2("f31_"+f1))
-//				.append(new H2("f32_"+f1))
-//			;
-//		}
-//	}
-//
-//	public class H2 {
-//		public String f1;
-//		public String f2;
-//
-//		H2() {}
-//
-//		H2(String f1) {
-//			this.f1 = f1;
-//			this.f2 = f1;
-//		}
-//	}
-//
-//	//====================================================================================================
-//	// testSorting
-//	//====================================================================================================
-//	@Test
-//	public void testSorting() throws Exception {
-//		ObjectMap query = null;
-//		List view = null;
-//		List sort = null;
-//		int pos = 0;
-//		int limit = 0;
-//		boolean ignoreCase = false;
-//		BeanSession session = BeanContext.DEFAULT.createSession();
-//		WriterSerializer s = new JsonSerializerBuilder().simple().pojoSwaps(CalendarSwap.DateTimeSimple.class).build();
-//		List results;
-//
-//		I[] in = new I[] {
-//			new I(1, "foo", true, 2010, 1, 1),
-//			new I(2, "bar", false, 2011, 1, 1),
-//			new I(3, "baz", true, 2012, 1, 1),
-//		};
-//
-//		PojoQuery filter = new PojoQuery(in, session);
-//
-//		sort = new ObjectList("['f2']");
-//		view = new ObjectList("['f1','f2']");
-//		results = filter.filterCollection(query, view, sort, pos, limit, ignoreCase);
-//		assertEquals("[{f1:2,f2:'bar'},{f1:3,f2:'baz'},{f1:1,f2:'foo'}]", s.serialize(results));
-//
-//		sort = new ObjectList("[{f2:'d'}]");
-//		view = new ObjectList("['f1','f2']");
-//		results = filter.filterCollection(query, view, sort, pos, limit, ignoreCase);
-//		assertEquals("[{f1:1,f2:'foo'},{f1:3,f2:'baz'},{f1:2,f2:'bar'}]", s.serialize(results));
-//
-//		sort = new ObjectList("['f3']");
-//		view = new ObjectList("['f1','f3']");
-//		results = filter.filterCollection(query, view, sort, pos, limit, ignoreCase);
-//		assertEquals("[{f1:2,f3:false},{f1:1,f3:true},{f1:3,f3:true}]", s.serialize(results));
-//
-//		sort = new ObjectList("['f3',{f1:'a'}]");
-//		view = new ObjectList("['f1','f3']");
-//		results = filter.filterCollection(query, view, sort, pos, limit, ignoreCase);
-//		assertEquals("[{f1:2,f3:false},{f1:1,f3:true},{f1:3,f3:true}]", s.serialize(results));
-//
-//		sort = new ObjectList("['f3',{f1:'d'}]");
-//		view = new ObjectList("['f1','f3']");
-//		results = filter.filterCollection(query, view, sort, pos, limit, ignoreCase);
-//		assertEquals("[{f1:2,f3:false},{f1:3,f3:true},{f1:1,f3:true}]", s.serialize(results));
-//
-//		sort = new ObjectList("['f1']");
-//		view = new ObjectList("['f1']");
-//		limit = 1;
-//		pos = 0;
-//		results = filter.filterCollection(query, view, sort, pos, limit, ignoreCase);
-//		assertEquals("[{f1:1}]", s.serialize(results));
-//
-//		limit = 3;
-//		pos = 0;
-//		results = filter.filterCollection(query, view, sort, pos, limit, ignoreCase);
-//		assertEquals("[{f1:1},{f1:2},{f1:3}]", s.serialize(results));
-//
-//		limit = 1;
-//		pos = 2;
-//		results = filter.filterCollection(query, view, sort, pos, limit, ignoreCase);
-//		assertEquals("[{f1:3}]", s.serialize(results));
-//
-//		limit = 100;
-//		pos = 2;
-//		results = filter.filterCollection(query, view, sort, pos, limit, ignoreCase);
-//		assertEquals("[{f1:3}]", s.serialize(results));
-//	}
-//
-//	public class I {
-//		public int f1;
-//		public String f2;
-//		public boolean f3;
-//		public Calendar f4;
-//
-//		I() {}
-//
-//		I(int f1, String f2, boolean f3, int year, int month, int day) {
-//			this.f1 = f1;
-//			this.f2 = f2;
-//			this.f3 = f3;
-//			this.f4 = new GregorianCalendar(year, month, day);
-//		}
-//	}
+	//====================================================================================================
+	// filterCollection, string search, 1 level
+	//====================================================================================================
+	@Test
+	public void testFilterCollectionStringSearchOneLevel() throws Exception {
+		SearchArgs sa;
+		List results;
+
+		List<A> in = new AList<A>()
+			.append(new A("foo"))
+			.append(new A("bar"))
+			.append(new A("baz"))
+		;
+
+		PojoQuery q = new PojoQuery(in, BeanContext.DEFAULT.createSession());
+
+		sa = SearchArgs.builder().search("f=foo").build();
+		results = q.filter(sa);
+		assertObjectEquals("[{f:'foo'}]", results);
+
+		sa = SearchArgs.builder().search("f=fo*").build();
+		results = q.filter(sa);
+		assertObjectEquals("[{f:'foo'}]", results);
+
+		sa = SearchArgs.builder().search("f=*ar").build();
+		results = q.filter(sa);
+		assertObjectEquals("[{f:'bar'}]", results);
+
+		sa = SearchArgs.builder().search("f=foo bar").build();
+		results = q.filter(sa);
+		assertObjectEquals("[{f:'foo'},{f:'bar'}]", results);
+	}
+
+	public class A {
+		public String f;
+
+		A() {}
+
+		A(String f) {
+			this.f = f;
+		}
+	}
+
+	//====================================================================================================
+	// filterCollection, date search, 1 level
+	//====================================================================================================
+	@Test
+	public void testFilterCollectionDateSearchOneLevel() throws Exception {
+		BeanSession session = BeanContext.DEFAULT.createSession();
+		WriterSerializer s = new JsonSerializerBuilder().simple().pojoSwaps(CalendarSwap.DateTimeSimple.class).build();
+		B[] in;
+		PojoQuery q;
+		SearchArgs sa;
+		List results;
+
+		in = new B[] {
+			new B(2010, 0, 1),
+			new B(2011, 0, 1),
+			new B(2011, 0, 31),
+			new B(2012, 0, 1)
+		};
+		q = new PojoQuery(in, session);
+
+		sa = SearchArgs.builder().search("f=2011").build();
+		results = q.filter(sa);
+		assertEquals("[{f:'2011/01/01 00:00:00'},{f:'2011/01/31 00:00:00'}]", s.serialize(results));
+
+		sa = SearchArgs.builder().search("f=2011.01").build();
+		results = q.filter(sa);
+		assertEquals("[{f:'2011/01/01 00:00:00'},{f:'2011/01/31 00:00:00'}]", s.serialize(results));
+
+		sa = SearchArgs.builder().search("f=2011.01.01").build();
+		results = q.filter(sa);
+		assertEquals("[{f:'2011/01/01 00:00:00'}]", s.serialize(results));
+
+		in = new B[] {
+			new B(2011, 00, 01, 11, 59, 59),
+			new B(2011, 00, 01, 12, 00, 00),
+			new B(2011, 00, 01, 12, 59, 59),
+			new B(2011, 00, 01, 13, 00, 00)
+		};
+		q = new PojoQuery(in, session);
+
+		sa = SearchArgs.builder().search("f=2011.01.01.12").build();
+		results = q.filter(sa);
+		assertEquals("[{f:'2011/01/01 12:00:00'},{f:'2011/01/01 12:59:59'}]", s.serialize(results));
+
+		in = new B[] {
+			new B(2011, 00, 01, 12, 29, 59),
+			new B(2011, 00, 01, 12, 30, 00),
+			new B(2011, 00, 01, 12, 30, 59),
+			new B(2011, 00, 01, 12, 31, 00)
+		};
+		q = new PojoQuery(in, session);
+		sa = SearchArgs.builder().search("f=2011.01.01.12.30").build();
+		results = q.filter(sa);
+		assertEquals("[{f:'2011/01/01 12:30:00'},{f:'2011/01/01 12:30:59'}]", s.serialize(results));
+
+		in = new B[] {
+			new B(2011, 00, 01, 12, 30, 29),
+			new B(2011, 00, 01, 12, 30, 30),
+			new B(2011, 00, 01, 12, 30, 31)
+		};
+		q = new PojoQuery(in, session);
+		sa = SearchArgs.builder().search("f=2011.01.01.12.30.30").build();
+		results = q.filter(sa);
+		assertEquals("[{f:'2011/01/01 12:30:30'}]", s.serialize(results));
+
+		// Open-ended ranges
+
+		in = new B[] {
+			new B(2000, 11, 31),
+			new B(2001, 00, 01)
+		};
+		q = new PojoQuery(in, session);
+
+		sa = SearchArgs.builder().search("f>2000").build();
+		results = q.filter(sa);
+		assertEquals("[{f:'2001/01/01 00:00:00'}]", s.serialize(results));
+
+		sa = SearchArgs.builder().search("f>=2001").build();
+		results = q.filter(sa);
+		assertEquals("[{f:'2001/01/01 00:00:00'}]", s.serialize(results));
+
+		sa = SearchArgs.builder().search("f<2001").build();
+		results = q.filter(sa);
+		assertEquals("[{f:'2000/12/31 00:00:00'}]", s.serialize(results));
+
+		sa = SearchArgs.builder().search("f<=2000").build();
+		results = q.filter(sa);
+		assertEquals("[{f:'2000/12/31 00:00:00'}]", s.serialize(results));
+
+		in = new B[] {
+			new B(2011, 00, 01, 12, 29, 59),
+			new B(2011, 00, 01, 12, 30, 00)
+		};
+		q = new PojoQuery(in, session);
+
+		sa = SearchArgs.builder().search("f>=2011.01.01.12.30").build();
+		results = q.filter(sa);
+		assertEquals("[{f:'2011/01/01 12:30:00'}]", s.serialize(results));
+
+		sa = SearchArgs.builder().search("f<2011.01.01.12.30").build();
+		results = q.filter(sa);
+		assertEquals("[{f:'2011/01/01 12:29:59'}]", s.serialize(results));
+
+		in = new B[] {
+			new B(2011, 00, 01, 12, 30, 59),
+			new B(2011, 00, 01, 12, 31, 00)
+		};
+		q = new PojoQuery(in, session);
+
+		sa = SearchArgs.builder().search("f>2011.01.01.12.30").build();
+		results = q.filter(sa);
+		assertEquals("[{f:'2011/01/01 12:31:00'}]", s.serialize(results));
+
+		sa = SearchArgs.builder().search("f<=2011.01.01.12.30").build();
+		results = q.filter(sa);
+		assertEquals("[{f:'2011/01/01 12:30:59'}]", s.serialize(results));
+
+		// Closed range
+
+		in = new B[] {
+			new B(2000, 11, 31, 23, 59, 59),
+			new B(2001, 00, 01, 00, 00, 00),
+			new B(2003, 05, 30, 23, 59, 59),
+			new B(2003, 06, 01, 00, 00, 00)
+		};
+		q = new PojoQuery(in, session);
+
+		sa = SearchArgs.builder().search("f=2001 - 2003.06.30").build();
+		results = q.filter(sa);
+		assertEquals("[{f:'2001/01/01 00:00:00'},{f:'2003/06/30 23:59:59'}]", s.serialize(results));
+
+		// ORed timestamps
+
+		in = new B[] {
+			new B(2000, 11, 31),
+			new B(2001, 00, 01),
+			new B(2001, 11, 31),
+			new B(2002, 00, 01)
+		};
+		q = new PojoQuery(in, session);
+
+		sa = SearchArgs.builder().search("f=2001 2003 2005").build();
+		results = q.filter(sa);
+		assertEquals("[{f:'2001/01/01 00:00:00'},{f:'2001/12/31 00:00:00'}]", s.serialize(results));
+
+		in = new B[] {
+			new B(2002, 11, 31),
+			new B(2003, 00, 01),
+			new B(2003, 11, 31),
+			new B(2004, 00, 01)
+		};
+		q = new PojoQuery(in, session);
+
+		sa = SearchArgs.builder().search("f=2001 2003 2005").build();
+		results = q.filter(sa);
+		assertEquals("[{f:'2003/01/01 00:00:00'},{f:'2003/12/31 00:00:00'}]", s.serialize(results));
+
+		in = new B[] {
+			new B(2004, 11, 31),
+			new B(2005, 00, 01),
+			new B(2005, 11, 31),
+			new B(2006, 00, 01)
+		};
+		q = new PojoQuery(in, session);
+
+		sa = SearchArgs.builder().search("f=2001 2003 2005").build();
+		results = q.filter(sa);
+		assertEquals("[{f:'2005/01/01 00:00:00'},{f:'2005/12/31 00:00:00'}]", s.serialize(results));
+	}
+
+	public class B {
+		public Calendar f;
+
+		B() {}
+
+		B(int year, int month, int day) {
+			this.f = new GregorianCalendar(year, month, day);
+		}
+
+		B(int year, int month, int day, int hour, int minute, int second) {
+			this.f = new GregorianCalendar(year, month, day, hour, minute, second);
+		}
+	}
+
+	//====================================================================================================
+	// filterCollection, int search, 1 level
+	//====================================================================================================
+	@Test
+	public void testFilterCollectionIntSearchOneLevel() throws Exception {
+		BeanSession session = BeanContext.DEFAULT.createSession();
+		SearchArgs sa;
+		List results;
+		
+		List<C> in = new AList<C>()
+			.append(new C(1))
+			.append(new C(2))
+			.append(new C(3))
+		;
+
+		PojoQuery q = new PojoQuery(in, session);
+
+		sa = SearchArgs.builder().search("f=1").build();
+		results = q.filter(sa);
+		assertObjectEquals("[{f:1}]", results);
+
+		sa = SearchArgs.builder().search("f>1").build();
+		results = q.filter(sa);
+		assertObjectEquals("[{f:2},{f:3}]", results);
+
+		sa = SearchArgs.builder().search("f>=2").build();
+		results = q.filter(sa);
+		assertObjectEquals("[{f:2},{f:3}]", results);
+
+		sa = SearchArgs.builder().search("f<=2").build();
+		results = q.filter(sa);
+		assertObjectEquals("[{f:1},{f:2}]", results);
+
+		sa = SearchArgs.builder().search("f<2").build();
+		results = q.filter(sa);
+		assertObjectEquals("[{f:1}]", results);
+
+		sa = SearchArgs.builder().search("f=1 3").build();
+		results = q.filter(sa);
+		assertObjectEquals("[{f:1},{f:3}]", results);
+	}
+
+	public class C {
+		public int f;
+
+		C() {}
+
+		C(int f) {
+			this.f = f;
+		}
+	}
+
+	//====================================================================================================
+	// filterCollection, view, 1 level
+	//====================================================================================================
+	@Test
+	public void testFilterCollectionViewOneLevel() throws Exception {
+		BeanSession session = BeanContext.DEFAULT.createSession();
+		SearchArgs sa;
+		List results;
+
+		List<E> in = new AList<E>()
+			.append(new E("foo", 1, true))
+			.append(new E("bar", 2, false))
+			.append(new E("baz", 3, true))
+		;
+
+		PojoQuery q = new PojoQuery(in, session);
+
+		sa = SearchArgs.builder().view("f1").build();
+		results = q.filter(sa);
+		assertObjectEquals("[{f1:'foo'},{f1:'bar'},{f1:'baz'}]", results);
+
+		sa = SearchArgs.builder().view("f2").build();
+		results = q.filter(sa);
+		assertObjectEquals("[{f2:1},{f2:2},{f2:3}]", results);
+
+		sa = SearchArgs.builder().view("f3").build();
+		results = q.filter(sa);
+		assertObjectEquals("[{f3:true},{f3:false},{f3:true}]", results);
+
+		sa = SearchArgs.builder().view("f3,f2,f1").build();
+		results = q.filter(sa);
+		assertObjectEquals("[{f3:true,f2:1,f1:'foo'},{f3:false,f2:2,f1:'bar'},{f3:true,f2:3,f1:'baz'}]", results);
+	}
+
+	public class E {
+		public String f1;
+		public int f2;
+		public boolean f3;
+
+		E() {}
+
+		E(String f1, int f2, boolean f3) {
+			this.f1 = f1;
+			this.f2 = f2;
+			this.f3 = f3;
+		}
+	}
+
+
+	//====================================================================================================
+	// testSorting
+	//====================================================================================================
+	@Test
+	public void testSorting() throws Exception {
+		BeanSession session = BeanContext.DEFAULT.createSession();
+		WriterSerializer s = new JsonSerializerBuilder().simple().pojoSwaps(CalendarSwap.DateTimeSimple.class).build();
+		SearchArgs sa;
+		List results;
+
+		I[] in = new I[] {
+			new I(1, "foo", true, 2010, 1, 1),
+			new I(2, "bar", false, 2011, 1, 1),
+			new I(3, "baz", true, 2012, 1, 1),
+		};
+
+		PojoQuery q = new PojoQuery(in, session);
+
+		sa = SearchArgs.builder().sort("f2").view("f1, f2").build();
+		results = q.filter(sa);
+		assertEquals("[{f1:2,f2:'bar'},{f1:3,f2:'baz'},{f1:1,f2:'foo'}]", s.serialize(results));
+
+		sa = SearchArgs.builder().sort("f2-").view("f1,f2").build();
+		results = q.filter(sa);
+		assertEquals("[{f1:1,f2:'foo'},{f1:3,f2:'baz'},{f1:2,f2:'bar'}]", s.serialize(results));
+
+		sa = SearchArgs.builder().sort("f3").view("f1,f3").build();
+		results = q.filter(sa);
+		assertEquals("[{f1:2,f3:false},{f1:1,f3:true},{f1:3,f3:true}]", s.serialize(results));
+
+		sa = SearchArgs.builder().sort("f3,f1+").view("f1,f3").build();
+		results = q.filter(sa);
+		assertEquals("[{f1:2,f3:false},{f1:1,f3:true},{f1:3,f3:true}]", s.serialize(results));
+
+		sa = SearchArgs.builder().sort("f3,f1-").view("f1,f3").build();
+		results = q.filter(sa);
+		assertEquals("[{f1:2,f3:false},{f1:3,f3:true},{f1:1,f3:true}]", s.serialize(results));
+
+		sa = SearchArgs.builder().sort("f1").view("f1").limit(1).position(0).build();
+		results = q.filter(sa);
+		assertEquals("[{f1:1}]", s.serialize(results));
+
+		sa = SearchArgs.builder().sort("f1").view("f1").limit(3).position(0).build();
+		results = q.filter(sa);
+		assertEquals("[{f1:1},{f1:2},{f1:3}]", s.serialize(results));
+
+		sa = SearchArgs.builder().sort("f1").view("f1").limit(1).position(2).build();
+		results = q.filter(sa);
+		assertEquals("[{f1:3}]", s.serialize(results));
+
+		sa = SearchArgs.builder().sort("f1").view("f1").limit(100).position(2).build();
+		results = q.filter(sa);
+		assertEquals("[{f1:3}]", s.serialize(results));
+	}
+
+	public class I {
+		public int f1;
+		public String f2;
+		public boolean f3;
+		public Calendar f4;
+
+		I() {}
+
+		I(int f1, String f2, boolean f3, int year, int month, int day) {
+			this.f1 = f1;
+			this.f2 = f2;
+			this.f3 = f3;
+			this.f4 = new GregorianCalendar(year, month, day);
+		}
+	}
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/0f76a0fa/juneau-core/src/main/java/org/apache/juneau/utils/SearchArgs.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/utils/SearchArgs.java b/juneau-core/src/main/java/org/apache/juneau/utils/SearchArgs.java
index 80cbbad..3c486c7 100644
--- a/juneau-core/src/main/java/org/apache/juneau/utils/SearchArgs.java
+++ b/juneau-core/src/main/java/org/apache/juneau/utils/SearchArgs.java
@@ -39,6 +39,14 @@ public class SearchArgs {
 	}
 
 	/**
+	 * Creates a new builder for {@link SearchArgs}
+	 * @return A new builder for {@link SearchArgs}
+	 */
+	public static Builder builder() {
+		return new Builder();
+	}
+
+	/**
 	 * Builder for {@link SearchArgs} class.
 	 */
 	@SuppressWarnings("hiding")