From 41b0fbcf8ff8bd1a69ce1d0983bcc0913a8c7160 Mon Sep 17 00:00:00 2001 From: Vyacheslav Tyutyunkov Date: Fri, 29 Mar 2013 18:24:29 +0700 Subject: [PATCH] #21 --- .idea/modules.xml | 1 + jejdb/build.xml | 6 +- jejdb/src/java/org/ejdb/bson/BSONObject.java | 11 ++- jejdb/src/java/org/ejdb/bson/types/ObjectId.java | 2 +- .../src/java/org/ejdb/driver/EJDBQueryBuilder.java | 50 +++++++++----- .../org/ejdb/driver/test/EJDBQueryBuilderTest.java | 80 ++++++++++++++++++++++ 6 files changed, 130 insertions(+), 20 deletions(-) create mode 100644 jejdb/src/test/org/ejdb/driver/test/EJDBQueryBuilderTest.java diff --git a/.idea/modules.xml b/.idea/modules.xml index 3e24d27..4618008 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -2,6 +2,7 @@ + diff --git a/jejdb/build.xml b/jejdb/build.xml index 7036efc..f50a344 100644 --- a/jejdb/build.xml +++ b/jejdb/build.xml @@ -76,7 +76,11 @@ - + + + + + diff --git a/jejdb/src/java/org/ejdb/bson/BSONObject.java b/jejdb/src/java/org/ejdb/bson/BSONObject.java index 9fb8fea..8656f41 100644 --- a/jejdb/src/java/org/ejdb/bson/BSONObject.java +++ b/jejdb/src/java/org/ejdb/bson/BSONObject.java @@ -271,6 +271,15 @@ public class BSONObject { @Override public String toString() { - return data.toString(); + StringBuilder sb = new StringBuilder(); + sb.append("{"); + String delimiter = ""; + for (String field : fields) { + sb.append(delimiter); + sb.append(field).append(":").append(get(field)); + delimiter = ", "; + } + sb.append("}"); + return sb.toString(); } } diff --git a/jejdb/src/java/org/ejdb/bson/types/ObjectId.java b/jejdb/src/java/org/ejdb/bson/types/ObjectId.java index 9245bdc..0d9328a 100644 --- a/jejdb/src/java/org/ejdb/bson/types/ObjectId.java +++ b/jejdb/src/java/org/ejdb/bson/types/ObjectId.java @@ -38,7 +38,7 @@ public class ObjectId { this.data = new byte[12]; for (int i = 0; i < 12; ++i) { - this.data[i] = Byte.parseByte(value.substring(i << 1, i << 1 + 2), 16); + this.data[i] = (byte) (Integer.parseInt(value.substring(i * 2, i * 2 + 2), 16) & 0xFF); } } diff --git a/jejdb/src/java/org/ejdb/driver/EJDBQueryBuilder.java b/jejdb/src/java/org/ejdb/driver/EJDBQueryBuilder.java index c56864d..9e7d93f 100644 --- a/jejdb/src/java/org/ejdb/driver/EJDBQueryBuilder.java +++ b/jejdb/src/java/org/ejdb/driver/EJDBQueryBuilder.java @@ -76,19 +76,28 @@ public class EJDBQueryBuilder { * @param replace if true all other restrictions will be replaces, otherwise trying to add restrictions for field */ protected EJDBQueryBuilder addOperation(String field, Object value, boolean replace) { - if (!query.containsField(field) || replace || !(value instanceof BSONObject)) { + if (replace) { query.put(field, value); } else { - Object cvalue = query.get(field); - if (cvalue instanceof BSONObject) { - ((BSONObject) cvalue).putAll((BSONObject) value); - } else { - query.put(field, value); - } + addToBSON(query, field, value); } + return this; } + protected void addToBSON(BSONObject out, String field, Object value) { + if (!(value instanceof BSONObject) || !out.containsField(field) || !(out.get(field) instanceof BSONObject)) { + out.put(field, value); + return; + } + + BSONObject iout = (BSONObject) out.get(field); + BSONObject ivalue = (BSONObject) value; + for (String ifield : ivalue.fields()) { + addToBSON(iout, ifield, ivalue.get(ifield)); + } + } + /** * Checks hints section allowed. * @@ -121,7 +130,7 @@ public class EJDBQueryBuilder { } /** - * Adds contraint for field + * Adds constraint for field */ public Constraint field(String field) { return new Constraint(field, false); @@ -343,7 +352,7 @@ public class EJDBQueryBuilder { } /** - * Add $not negatiation contraint + * Add $not negatiation constraint *

* Example: * query.field(field).not().eq(value); // {field : { $not : value }} @@ -354,6 +363,13 @@ public class EJDBQueryBuilder { } /** + * Add inner constraint + */ + public Constraint field(String field) { + return new Constraint(field, this); + } + + /** * Field equality restriction. * All usage samples represent same thing: {"field" : value} *

@@ -403,8 +419,8 @@ public class EJDBQueryBuilder { /** * Field value matched any value of specified in values. */ - public EJDBQueryBuilder in(Object... values) { - return new Constraint("$in", this).addOperation((Object[]) values); + public EJDBQueryBuilder in(Object[] values) { + return new Constraint("$in", this).addOperation(values); } /** @@ -419,8 +435,8 @@ public class EJDBQueryBuilder { /** * Negation of {@link Constraint#in(Object...)} */ - public EJDBQueryBuilder notIn(Object... values) { - return new Constraint("$nin", this).addOperation((Object[]) values); + public EJDBQueryBuilder notIn(Object[] values) { + return new Constraint("$nin", this).addOperation(values); } /** @@ -442,8 +458,8 @@ public class EJDBQueryBuilder { /** * String tokens (or string array vals) matches all tokens in specified array. */ - public EJDBQueryBuilder strAnd(String... values) { - return new Constraint("$strand", this).addOperation((String[]) values); + public EJDBQueryBuilder strAnd(String[] values) { + return new Constraint("$strand", this).addOperation(values); } /** @@ -458,8 +474,8 @@ public class EJDBQueryBuilder { /** * String tokens (or string array vals) matches any tokens in specified array. */ - public EJDBQueryBuilder strOr(String... values) { - return new Constraint("$stror", this).addOperation((String[]) values); + public EJDBQueryBuilder strOr(String[] values) { + return new Constraint("$stror", this).addOperation(values); } /** diff --git a/jejdb/src/test/org/ejdb/driver/test/EJDBQueryBuilderTest.java b/jejdb/src/test/org/ejdb/driver/test/EJDBQueryBuilderTest.java new file mode 100644 index 0000000..f8a408d --- /dev/null +++ b/jejdb/src/test/org/ejdb/driver/test/EJDBQueryBuilderTest.java @@ -0,0 +1,80 @@ +package org.ejdb.driver.test; + +import junit.framework.*; +import junit.framework.Test; + +import org.ejdb.bson.BSON; +import org.ejdb.bson.BSONObject; +import org.ejdb.bson.types.ObjectId; +import org.ejdb.driver.BSONQueryObject; +import org.ejdb.driver.EJDBQueryBuilder; + +import java.util.Arrays; +import java.util.Date; +import java.util.Enumeration; + +/** + * @author Tyutyunkov Vyacheslav (tve@softmotions.com) + * @version $Id$ + */ +public class EJDBQueryBuilderTest extends TestCase { + + @Override + protected void setUp() throws Exception { + super.setUp(); + } + + @Override + protected void tearDown() throws Exception { + super.tearDown(); + } + + public void testQB1() throws Exception { + BSONQueryObject query = new BSONQueryObject("name", "Andy") + .append("_id", "510f7fa91ad6270a00000000") + .append("age", new BSONQueryObject().append("$gt", 20).append("$lt", 40)) + .append("score", new BSONQueryObject("$in", new Object[]{1, 22.12333, 1362835380447L, null})); + + BSONQueryObject hints = new BSONQueryObject("$max", 232); + + EJDBQueryBuilder qb = new EJDBQueryBuilder(); + + qb.field("name", "Andy"); + qb.field("_id").eq("510f7fa91ad6270a00000000"); + qb.field("age").gt(20).field("age").lt(40); + qb.field("score").in(Arrays.asList(1, 22.12333, 1362835380447L, null)); + qb.setMaxResults(232); + + assertEquals(query, qb.getMainQuery()); + assertEquals(hints, qb.getQueryHints()); + + BSONObject decoded = BSON.decode(BSON.encode(qb.getMainQuery())); + + assertFalse(query.equals(decoded)); // after decoding BSON string field _id will be contain ObjectId! + query.put("_id", new ObjectId("510f7fa91ad6270a00000000")); + assertEquals(query, decoded); + } + + public void testQB2() throws Exception { + BSONQueryObject query = new BSONQueryObject() + .append("name", "Andy") + .append("bdata", new Date(1362835380447L)) + .append("car", new BSONQueryObject().append("name", "Lamborghini").append("maxspeed", 320)) + .append("dst", null); + + EJDBQueryBuilder qb = new EJDBQueryBuilder(); + + qb.field("name", "Andy") + .field("bdata").eq(new Date(1362835380447L)); + qb.field("car").field("name").eq("Lamborghini") + .field("car").field("maxspeed").eq(320); + qb.field("dst", null); + + assertEquals(query, qb.getMainQuery()); + assertEquals(new BSONObject(), qb.getQueryHints()); + + BSONObject decoded = BSON.decode(BSON.encode(qb.getMainQuery())); + + assertEquals(query, decoded); + } +} -- 2.7.4