From 713fdc56ebff32ae90f4b02de5fe384dcc9f8a66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timo=20Westk=C3=A4mper?= Date: Sun, 17 Jun 2012 16:45:03 +0300 Subject: [PATCH] improved query compression --- .../mysema/query/support/SerializerBase.java | 17 +++++++++++++---- .../query/support/SerializerBaseTest.java | 2 ++ 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/querydsl-core/src/main/java/com/mysema/query/support/SerializerBase.java b/querydsl-core/src/main/java/com/mysema/query/support/SerializerBase.java index 27221a60d..9def1a9fc 100644 --- a/querydsl-core/src/main/java/com/mysema/query/support/SerializerBase.java +++ b/querydsl-core/src/main/java/com/mysema/query/support/SerializerBase.java @@ -13,6 +13,7 @@ */ package com.mysema.query.support; +import java.math.BigDecimal; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -50,7 +51,13 @@ public abstract class SerializerBase> implements Vis private final StringBuilder builder = new StringBuilder(); - private static final Pattern OPERATION = Pattern.compile("\\d+[\\+\\-]\\d+"); + private static final String NUMBER = "[\\+\\-]?\\d+\\.?\\d*"; + + private static final String WS = "\\s*"; + + private static final Pattern OPERATOR = Pattern.compile(WS + "[\\+\\-]" + WS); + + private static final Pattern OPERATION = Pattern.compile(NUMBER + WS + "[\\+\\-]" + WS + NUMBER); private String constantPrefix = "a"; @@ -78,13 +85,15 @@ public abstract class SerializerBase> implements Vis rv.append(queryString.subSequence(end, m.start())); } String str = queryString.substring(m.start(), m.end()); - String[] operands = str.split("[\\+\\-]"); + String[] operands = OPERATOR.split(str); char operator = str.charAt(operands[0].length()); + BigDecimal result = null; if (operator == '+') { - rv.append(Integer.valueOf(operands[0]) + Integer.valueOf(operands[1])); + result = new BigDecimal(operands[0]).add(new BigDecimal(operands[1])); } else { - rv.append(Integer.valueOf(operands[0]) - Integer.valueOf(operands[1])); + result = new BigDecimal(operands[0]).add(new BigDecimal(operands[1])); } + rv.append(result.toString()); end = m.end(); } if (end < queryString.length()) { diff --git a/querydsl-core/src/test/java/com/mysema/query/support/SerializerBaseTest.java b/querydsl-core/src/test/java/com/mysema/query/support/SerializerBaseTest.java index 7c13fd855..2fd6dcb40 100644 --- a/querydsl-core/src/test/java/com/mysema/query/support/SerializerBaseTest.java +++ b/querydsl-core/src/test/java/com/mysema/query/support/SerializerBaseTest.java @@ -10,6 +10,8 @@ public class SerializerBaseTest { public void Normalize() { assertEquals("3", SerializerBase.normalize("1+2")); assertEquals("where 3 = 3", SerializerBase.normalize("where 1+2 = 3")); + assertEquals("where 3.3 = 3.3", SerializerBase.normalize("where 1.1+2.2 = 3.3")); + assertEquals("where 3.3 = 3.3", SerializerBase.normalize("where 1.1 + 2.2 = 3.3")); } }