diff --git a/microsoft-azure-api/src/main/java/com/microsoft/windowsazure/services/table/implementation/TableRestProxy.java b/microsoft-azure-api/src/main/java/com/microsoft/windowsazure/services/table/implementation/TableRestProxy.java index 42cd3154bb24..c82b1429bde4 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/windowsazure/services/table/implementation/TableRestProxy.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/windowsazure/services/table/implementation/TableRestProxy.java @@ -21,8 +21,11 @@ import java.net.URI; import java.util.ArrayList; import java.util.Arrays; +import java.util.Date; import java.util.Enumeration; +import java.util.Formatter; import java.util.List; +import java.util.UUID; import javax.activation.DataSource; import javax.inject.Inject; @@ -205,9 +208,51 @@ private void buildFilterExpression(Filter filter, StringBuilder sb) { sb.append(((LitteralFilter) filter).getLitteral()); } else if (filter instanceof ConstantFilter) { - sb.append("'"); - sb.append(((ConstantFilter) filter).getValue()); - sb.append("'"); + Object value = ((ConstantFilter) filter).getValue(); + if (value == null) { + sb.append("null"); + } + else if (value.getClass() == Long.class) { + sb.append(value); + sb.append("L"); + } + else if (value.getClass() == Date.class) { + ISO8601DateConverter dateConverter = new ISO8601DateConverter(); + sb.append("datetime'"); + sb.append(dateConverter.format((Date) value)); + sb.append("'"); + } + else if (value.getClass() == UUID.class) { + sb.append("(guid'"); + sb.append(value); + sb.append("')"); + } + else if (value.getClass() == String.class) { + sb.append("'"); + sb.append(((String) value).replace("'", "''")); + sb.append("'"); + } + else if (value.getClass() == byte[].class) { + sb.append("X'"); + byte[] byteArray = (byte[]) value; + Formatter formatter = new Formatter(sb); + for (byte b : byteArray) { + formatter.format("%02x", b); + } + sb.append("'"); + } + else if (value.getClass() == Byte[].class) { + sb.append("X'"); + Byte[] byteArray = (Byte[]) value; + Formatter formatter = new Formatter(sb); + for (Byte b : byteArray) { + formatter.format("%02x", b); + } + sb.append("'"); + } + else { + sb.append(value); + } } else if (filter instanceof UnaryFilter) { sb.append(((UnaryFilter) filter).getOperator()); diff --git a/microsoft-azure-api/src/test/java/com/microsoft/windowsazure/services/table/TableServiceIntegrationTest.java b/microsoft-azure-api/src/test/java/com/microsoft/windowsazure/services/table/TableServiceIntegrationTest.java index 5f14d2d82a1f..ec4667faee21 100644 --- a/microsoft-azure-api/src/test/java/com/microsoft/windowsazure/services/table/TableServiceIntegrationTest.java +++ b/microsoft-azure-api/src/test/java/com/microsoft/windowsazure/services/table/TableServiceIntegrationTest.java @@ -610,13 +610,16 @@ public void queryEntitiesWithFilterWorks() throws Exception { TableContract service = TableService.create(config); String table = TEST_TABLE_5; int numberOfEntries = 5; + Entity[] entities = new Entity[numberOfEntries]; for (int i = 0; i < numberOfEntries; i++) { - Entity entity = new Entity().setPartitionKey("001").setRowKey("queryEntitiesWithFilterWorks-" + i) - .setProperty("test", EdmType.BOOLEAN, true).setProperty("test2", EdmType.STRING, "value") - .setProperty("test3", EdmType.INT32, 3).setProperty("test4", EdmType.INT64, 12345678901L) - .setProperty("test5", EdmType.DATETIME, new Date()); - - service.insertEntity(table, entity); + entities[i] = new Entity().setPartitionKey("001").setRowKey("queryEntitiesWithFilterWorks-" + i) + .setProperty("test", EdmType.BOOLEAN, (i % 2 == 0)) + .setProperty("test2", EdmType.STRING, "'value'" + i).setProperty("test3", EdmType.INT32, i) + .setProperty("test4", EdmType.INT64, 12345678901L + i) + .setProperty("test5", EdmType.DATETIME, new Date(i * 1000)) + .setProperty("test6", EdmType.GUID, UUID.randomUUID()); + + service.insertEntity(table, entities[i]); } { @@ -641,6 +644,63 @@ public void queryEntitiesWithFilterWorks() throws Exception { assertEquals(1, result.getEntities().size()); assertEquals("queryEntitiesWithFilterWorks-3", result.getEntities().get(0).getRowKey()); } + + { + // Act + QueryEntitiesResult result = service.queryEntities( + table, + new QueryEntitiesOptions().setQuery(new Query().setFilter(Filter.eq(Filter.litteral("test"), + Filter.constant(true))))); + + // Assert + assertNotNull(result); + assertEquals(3, result.getEntities().size()); + } + + { + // Act + QueryEntitiesResult result = service.queryEntities(table, new QueryEntitiesOptions().setQuery(new Query() + .setFilter(Filter.eq(Filter.litteral("test2"), Filter.constant("'value'3"))))); + + // Assert + assertNotNull(result); + assertEquals(1, result.getEntities().size()); + assertEquals("queryEntitiesWithFilterWorks-3", result.getEntities().get(0).getRowKey()); + } + + { + // Act + QueryEntitiesResult result = service.queryEntities(table, new QueryEntitiesOptions().setQuery(new Query() + .setFilter(Filter.eq(Filter.litteral("test4"), Filter.constant(12345678903L))))); + + // Assert + assertNotNull(result); + assertEquals(1, result.getEntities().size()); + assertEquals("queryEntitiesWithFilterWorks-2", result.getEntities().get(0).getRowKey()); + } + + { + // Act + QueryEntitiesResult result = service.queryEntities(table, new QueryEntitiesOptions().setQuery(new Query() + .setFilter(Filter.eq(Filter.litteral("test5"), Filter.constant(new Date(3000)))))); + + // Assert + assertNotNull(result); + assertEquals(1, result.getEntities().size()); + assertEquals("queryEntitiesWithFilterWorks-3", result.getEntities().get(0).getRowKey()); + } + + { + // Act + QueryEntitiesResult result = service.queryEntities(table, new QueryEntitiesOptions().setQuery(new Query() + .setFilter(Filter.eq(Filter.litteral("test6"), + Filter.constant(entities[3].getPropertyValue("test6")))))); + + // Assert + assertNotNull(result); + assertEquals(1, result.getEntities().size()); + assertEquals("queryEntitiesWithFilterWorks-3", result.getEntities().get(0).getRowKey()); + } } @Test