You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by nt...@apache.org on 2018/10/18 14:30:04 UTC

[2/4] cayenne git commit: CAY-2485 Refactored logger to have possibility to test without adding logback.

CAY-2485 Refactored logger to have possibility to test without adding logback.


Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo
Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/d8d2ec5d
Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/d8d2ec5d
Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/d8d2ec5d

Branch: refs/heads/master
Commit: d8d2ec5de67e0c203ee73a85bba7192fe0ba86f4
Parents: a07bba5
Author: kkomyak <co...@gmail.com>
Authored: Mon Oct 15 12:23:41 2018 +0300
Committer: kkomyak <co...@gmail.com>
Committed: Mon Oct 15 12:37:29 2018 +0300

----------------------------------------------------------------------
 cayenne-server/pom.xml                          |   6 -
 .../cayenne/log/CompactSl4jJdbcEventLogger.java | 201 -------------------
 .../log/CompactSlf4jJdbcEventLogger.java        | 196 ++++++++++++++++++
 .../cayenne/log/Slf4jJdbcEventLogger.java       |   2 +-
 .../log/CompactSl4jJdbcEventLoggerTest.java     | 109 ----------
 .../log/CompactSlf4jJdbcEventLoggerTest.java    |  93 +++++++++
 .../org/apache/cayenne/log/TestAppender.java    |  16 --
 7 files changed, 290 insertions(+), 333 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/d8d2ec5d/cayenne-server/pom.xml
----------------------------------------------------------------------
diff --git a/cayenne-server/pom.xml b/cayenne-server/pom.xml
index e965ffa..0ede0dd 100644
--- a/cayenne-server/pom.xml
+++ b/cayenne-server/pom.xml
@@ -46,12 +46,6 @@
 
 		<!-- Test dependencies -->
 		<dependency>
-			<groupId>ch.qos.logback</groupId>
-			<artifactId>logback-classic</artifactId>
-			<version>1.0.13</version>
-			<scope>test</scope>
-		</dependency>
-		<dependency>
 			<groupId>junit</groupId>
 			<artifactId>junit</artifactId>
 			<scope>test</scope>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d8d2ec5d/cayenne-server/src/main/java/org/apache/cayenne/log/CompactSl4jJdbcEventLogger.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/log/CompactSl4jJdbcEventLogger.java b/cayenne-server/src/main/java/org/apache/cayenne/log/CompactSl4jJdbcEventLogger.java
deleted file mode 100644
index 38e4370..0000000
--- a/cayenne-server/src/main/java/org/apache/cayenne/log/CompactSl4jJdbcEventLogger.java
+++ /dev/null
@@ -1,201 +0,0 @@
-/*****************************************************************
- *   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.cayenne.log;
-
-import org.apache.cayenne.access.translator.DbAttributeBinding;
-import org.apache.cayenne.access.translator.ParameterBinding;
-import org.apache.cayenne.configuration.RuntimeProperties;
-import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.map.DbAttribute;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.regex.Pattern;
-import java.util.stream.Collectors;
-
-/**
- * @since 4.1
- */
-public class CompactSl4jJdbcEventLogger extends Slf4jJdbcEventLogger {
-
-    private static final String UNION = "UNION";
-    private static final String SELECT = "SELECT";
-    private static final String FROM = "FROM";
-    private static final String SPACE = " ";
-
-    public CompactSl4jJdbcEventLogger(@Inject RuntimeProperties runtimeProperties) {
-        super(runtimeProperties);
-    }
-
-    @Override
-    public void logQuery(String sql, ParameterBinding[] bindings) {
-        if (!isLoggable()) {
-            return;
-        }
-
-        String str;
-        if (sql.toUpperCase().contains(UNION)) {
-            str = processUnionSql(sql);
-        } else {
-            str = formatSqlSelectColumns(sql);
-        }
-
-        StringBuilder stringBuilder = new StringBuilder(str);
-        appendParameters(stringBuilder, "bind", bindings);
-        if (stringBuilder.length() < 0) {
-            return;
-        }
-
-        super.logQuery(stringBuilder.toString(), new ParameterBinding[0]);
-    }
-
-    private String processUnionSql(String sql) {
-
-        String modified = Pattern.compile(UNION.toLowerCase(), Pattern.CASE_INSENSITIVE).matcher(sql).replaceAll(UNION);
-        String[] queries = modified.split(
-                UNION);
-        List<String> formattedQueries = Arrays.stream(queries).map(this::formatSqlSelectColumns).collect(Collectors.toList());
-        StringBuilder buffer = new StringBuilder();
-        boolean used =  false;
-        for (String q: formattedQueries) {
-            if(!used){
-                used = true;
-            } else {
-                buffer.append(SPACE).append(UNION);
-            }
-            buffer.append(q);
-        }
-        return buffer.toString();
-    }
-
-    private String formatSqlSelectColumns(String sql) {
-        int selectIndex = sql.toUpperCase().indexOf(SELECT);
-        if (selectIndex == -1) {
-            return sql;
-        }
-        selectIndex += SELECT.length();
-        int fromIndex = sql.toUpperCase().indexOf(FROM);
-        String columns = sql.substring(selectIndex, fromIndex);
-        String[] columnsArray = columns.split(",");
-        if (columnsArray.length <= 3) {
-            return sql;
-        }
-
-        columns = "(" + columnsArray.length + " columns)";
-        return new StringBuilder(sql.substring(0, selectIndex))
-                .append(SPACE)
-                .append(columns)
-                .append(SPACE)
-                .append(sql, fromIndex, sql.length())
-                .toString();
-    }
-
-    private void appendParameters(StringBuilder buffer, String label, ParameterBinding[] bindings) {
-        int bindingLength = bindings.length;
-        if (bindingLength == 0) {
-            return;
-        }
-
-        buildBinding(buffer, label, collectBindings(bindings));
-    }
-
-    @SuppressWarnings("unchecked")
-    private Map<String, List<String>> collectBindings(ParameterBinding[] bindings) {
-        Map<String, List<String>> bindingsMap = new HashMap<>();
-
-        String key = null;
-        String value;
-        for (int i = 0; i < bindings.length; i++) {
-            ParameterBinding b = bindings[i];
-
-            if (b.isExcluded()) {
-                continue;
-            }
-
-            if (b instanceof DbAttributeBinding) {
-                DbAttribute attribute = ((DbAttributeBinding) b).getAttribute();
-                if (attribute != null) {
-                    key = attribute.getName();
-                }
-            }
-
-            if (b.getExtendedType() != null) {
-                value = b.getExtendedType().toString(b.getValue());
-            } else if(b.getValue() == null) {
-                value = "NULL";
-            } else {
-                value = new StringBuilder(b.getValue().getClass().getName())
-                        .append("@")
-                        .append(System.identityHashCode(b.getValue())).toString();
-            }
-
-            List<String> objects = bindingsMap.computeIfAbsent(key, k -> new ArrayList<>());
-            objects.add(value);
-        }
-
-        return bindingsMap;
-    }
-
-    private void buildBinding(StringBuilder buffer, String label, Map<String, List<String>> bindingsMap) {
-        int j = 1;
-        boolean hasIncluded = false;
-        for (String k : bindingsMap.keySet()) {
-            if (!hasIncluded) {
-                hasIncluded = true;
-                buffer.append(" [").append(label).append(": ");
-            } else {
-                buffer.append(", ");
-            }
-            buffer.append(j).append("->").append(k).append(": ");
-
-            List<String> bindingsList = bindingsMap.get(k);
-            if (bindingsList.size() == 1 ) {
-                buffer.append(bindingsList.get(0));
-            } else {
-                buffer.append("{");
-                boolean wasAdded = false;
-                for (Object val : bindingsList) {
-                    if (wasAdded) {
-                        buffer.append(", ");
-                    } else {
-                        wasAdded = true;
-                    }
-                    buffer.append(val);
-                }
-                buffer.append("}");
-            }
-            j++;
-        }
-
-        if (hasIncluded) {
-            buffer.append("]");
-        }
-    }
-
-    @Override
-    public void logBeginTransaction(String transactionLabel) {
-    }
-
-    @Override
-    public void logCommitTransaction(String transactionLabel) {
-    }
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d8d2ec5d/cayenne-server/src/main/java/org/apache/cayenne/log/CompactSlf4jJdbcEventLogger.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/log/CompactSlf4jJdbcEventLogger.java b/cayenne-server/src/main/java/org/apache/cayenne/log/CompactSlf4jJdbcEventLogger.java
new file mode 100644
index 0000000..d4d57a9
--- /dev/null
+++ b/cayenne-server/src/main/java/org/apache/cayenne/log/CompactSlf4jJdbcEventLogger.java
@@ -0,0 +1,196 @@
+/*****************************************************************
+ *   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.cayenne.log;
+
+import org.apache.cayenne.access.translator.DbAttributeBinding;
+import org.apache.cayenne.access.translator.ParameterBinding;
+import org.apache.cayenne.configuration.RuntimeProperties;
+import org.apache.cayenne.di.Inject;
+import org.apache.cayenne.map.DbAttribute;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+
+/**
+ * @since 4.1
+ */
+public class CompactSlf4jJdbcEventLogger extends Slf4jJdbcEventLogger {
+
+    private static final String UNION = "UNION";
+    private static final String SELECT = "SELECT";
+    private static final String FROM = "FROM";
+    private static final String SPACE = " ";
+
+    public CompactSlf4jJdbcEventLogger(@Inject RuntimeProperties runtimeProperties) {
+        super(runtimeProperties);
+    }
+
+    @Override
+    public void logQuery(String sql, ParameterBinding[] bindings) {
+        if (!isLoggable()) {
+            return;
+        }
+
+        String str;
+        if (sql.toUpperCase().contains(UNION)) {
+            str = processUnionSql(sql);
+        } else {
+            str = trimSqlSelectColumns(sql);
+        }
+
+        super.logQuery(str, bindings);
+    }
+
+    protected String processUnionSql(String sql) {
+
+        String modified = Pattern.compile(UNION.toLowerCase(), Pattern.CASE_INSENSITIVE).matcher(sql).replaceAll(UNION);
+        String[] queries = modified.split(
+                UNION);
+        List<String> formattedQueries = Arrays.stream(queries).map(this::trimSqlSelectColumns).collect(Collectors.toList());
+        StringBuilder buffer = new StringBuilder();
+        boolean used =  false;
+        for (String q: formattedQueries) {
+            if(!used){
+                used = true;
+            } else {
+                buffer.append(SPACE).append(UNION);
+            }
+            buffer.append(q);
+        }
+        return buffer.toString();
+    }
+
+    protected String trimSqlSelectColumns(String sql) {
+        int selectIndex = sql.toUpperCase().indexOf(SELECT);
+        if (selectIndex == -1) {
+            return sql;
+        }
+        selectIndex += SELECT.length();
+        int fromIndex = sql.toUpperCase().indexOf(FROM);
+        String columns = sql.substring(selectIndex, fromIndex);
+        String[] columnsArray = columns.split(",");
+        if (columnsArray.length <= 3) {
+            return sql;
+        }
+
+        columns = "(" + columnsArray.length + " columns)";
+        return new StringBuilder(sql.substring(0, selectIndex))
+                .append(SPACE)
+                .append(columns)
+                .append(SPACE)
+                .append(sql, fromIndex, sql.length())
+                .toString();
+    }
+
+    @Override
+    protected void appendParameters(StringBuilder buffer, String label, ParameterBinding[] bindings) {
+        int bindingLength = bindings.length;
+        if (bindingLength == 0) {
+            return;
+        }
+
+        buildBinding(buffer, label, collectBindings(bindings));
+    }
+
+    @SuppressWarnings("unchecked")
+    private Map<String, List<String>> collectBindings(ParameterBinding[] bindings) {
+        Map<String, List<String>> bindingsMap = new HashMap<>();
+
+        String key = null;
+        String value;
+        for (int i = 0; i < bindings.length; i++) {
+            ParameterBinding b = bindings[i];
+
+            if (b.isExcluded()) {
+                continue;
+            }
+
+            if (b instanceof DbAttributeBinding) {
+                DbAttribute attribute = ((DbAttributeBinding) b).getAttribute();
+                if (attribute != null) {
+                    key = attribute.getName();
+                }
+            }
+
+            if (b.getExtendedType() != null) {
+                value = b.getExtendedType().toString(b.getValue());
+            } else if(b.getValue() == null) {
+                value = "NULL";
+            } else {
+                value = new StringBuilder(b.getValue().getClass().getName())
+                        .append("@")
+                        .append(System.identityHashCode(b.getValue())).toString();
+            }
+
+            List<String> objects = bindingsMap.computeIfAbsent(key, k -> new ArrayList<>());
+            objects.add(value);
+        }
+
+        return bindingsMap;
+    }
+
+    private void buildBinding(StringBuilder buffer, String label, Map<String, List<String>> bindingsMap) {
+        int j = 1;
+        boolean hasIncluded = false;
+        for (String k : bindingsMap.keySet()) {
+            if (!hasIncluded) {
+                hasIncluded = true;
+                buffer.append("[").append(label).append(": ");
+            } else {
+                buffer.append(", ");
+            }
+            buffer.append(j).append("->").append(k).append(": ");
+
+            List<String> bindingsList = bindingsMap.get(k);
+            if (bindingsList.size() == 1 ) {
+                buffer.append(bindingsList.get(0));
+            } else {
+                buffer.append("{");
+                boolean wasAdded = false;
+                for (Object val : bindingsList) {
+                    if (wasAdded) {
+                        buffer.append(", ");
+                    } else {
+                        wasAdded = true;
+                    }
+                    buffer.append(val);
+                }
+                buffer.append("}");
+            }
+            j++;
+        }
+
+        if (hasIncluded) {
+            buffer.append("]");
+        }
+    }
+
+    @Override
+    public void logBeginTransaction(String transactionLabel) {
+    }
+
+    @Override
+    public void logCommitTransaction(String transactionLabel) {
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d8d2ec5d/cayenne-server/src/main/java/org/apache/cayenne/log/Slf4jJdbcEventLogger.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/log/Slf4jJdbcEventLogger.java b/cayenne-server/src/main/java/org/apache/cayenne/log/Slf4jJdbcEventLogger.java
index 3cdf779..3318493 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/log/Slf4jJdbcEventLogger.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/log/Slf4jJdbcEventLogger.java
@@ -91,7 +91,7 @@ public class Slf4jJdbcEventLogger implements JdbcEventLogger {
 	}
 
 	@SuppressWarnings("unchecked")
-	private void appendParameters(StringBuilder buffer, String label, ParameterBinding[] bindings) {
+	protected void appendParameters(StringBuilder buffer, String label, ParameterBinding[] bindings) {
 
 		int len = bindings.length;
 		if (len > 0) {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d8d2ec5d/cayenne-server/src/test/java/org/apache/cayenne/log/CompactSl4jJdbcEventLoggerTest.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/log/CompactSl4jJdbcEventLoggerTest.java b/cayenne-server/src/test/java/org/apache/cayenne/log/CompactSl4jJdbcEventLoggerTest.java
deleted file mode 100644
index f7dbe76..0000000
--- a/cayenne-server/src/test/java/org/apache/cayenne/log/CompactSl4jJdbcEventLoggerTest.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*****************************************************************
- *   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.cayenne.log;
-
-import ch.qos.logback.classic.Level;
-import ch.qos.logback.classic.spi.LoggingEvent;
-import org.apache.cayenne.access.translator.DbAttributeBinding;
-import org.apache.cayenne.access.types.BooleanType;
-import org.apache.cayenne.access.types.CharType;
-import org.apache.cayenne.access.types.ExtendedType;
-import org.apache.cayenne.access.types.IntegerType;
-import org.apache.cayenne.configuration.DefaultRuntimeProperties;
-import org.apache.cayenne.map.DbAttribute;
-import org.junit.Before;
-import org.junit.Test;
-
-import java.util.Collections;
-import java.util.List;
-
-import static org.hamcrest.CoreMatchers.is;
-import static org.junit.Assert.*;
-
-public class CompactSl4jJdbcEventLoggerTest {
-
-    @Before
-    public void before() {
-        TestAppender.events.clear();
-    }
-
-    @Test
-    public void logWithCompact_Union() {
-
-        CompactSl4jJdbcEventLogger compactSl4jJdbcEventLogger = new CompactSl4jJdbcEventLogger(new DefaultRuntimeProperties(Collections.emptyMap()));
-        DbAttributeBinding[] bindings = createBindings();
-        final List<LoggingEvent> log = TestAppender.events;
-        assertEquals(log.size(), 0);
-
-        compactSl4jJdbcEventLogger.logQuery(
-                "SELECT t0.NAME AS ec0_0, t0.F_KEY1 AS ec0_1, t0.F_KEY2 AS ec0_2," +
-                        " t0.PKEY AS ec0_3 FROM COMPOUND_FK_TEST t0 INNER JOIN COMPOUND_PK_TEST " +
-                        "t1 ON (t0.F_KEY1 = t1.KEY1 AND t0.F_KEY2 = t1.KEY2) WHERE t1.NAME LIKE ?", createBindings());
-        assertEquals(log.size(), 1);
-        LoggingEvent firstLogEntry = log.get(0);
-        assertThat(firstLogEntry.getLevel(), is(Level.INFO));
-        assertThat(firstLogEntry.getMessage(), is("SELECT (4 columns) FROM COMPOUND_FK_TEST t0 " +
-                "INNER JOIN COMPOUND_PK_TEST t1 ON (t0.F_KEY1 = t1.KEY1 AND t0.F_KEY2 = t1.KEY2) " +
-                "WHERE t1.NAME LIKE ? [bind: 1->t0.NAME: {'', 52, 'true'}, 2->t0.F_KEY1: 'true'] "));
-        assertThat(firstLogEntry.getLoggerName(), is("org.apache.cayenne.log.JdbcEventLogger"));
-
-        compactSl4jJdbcEventLogger.logQuery(
-                "SELECT t0.NAME AS ec0_0, t0.F_KEY1 AS ec0_1, " +
-                        "t0.PKEY AS ec0_3 FROM COMPOUND_FK_TEST t0 INNER JOIN COMPOUND_PK_TEST " +
-                        "t1 ON (t0.F_KEY1 = t1.KEY1 AND t0.F_KEY2 = t1.KEY2) WHERE t1.NAME LIKE ?" +
-                        "UNION ALL " +
-                        "SELECT t0.NAME AS ec0_0, t0.F_KEY1 AS ec0_1," +
-                        " t0.PKEY AS ec0_3 FROM COMPOUND_FK_TEST t0 INNER JOIN COMPOUND_PK_TEST " +
-                        "t1 ON (t0.F_KEY1 = t1.KEY1 AND t0.F_KEY2 = t1.KEY2) WHERE t1.NAME LIKE ?" +
-                        "union all " +
-                        "SELECT t0.NAME AS ec0_0, t0.F_KEY1 AS ec0_1, t0.F_KEY2 AS ec0_2," +
-                        " t0.PKEY AS ec0_3 FROM COMPOUND_FK_TEST t0 INNER JOIN COMPOUND_PK_TEST " +
-                        "t1 ON (t0.F_KEY1 = t1.KEY1 AND t0.F_KEY2 = t1.KEY2) WHERE t1.NAME LIKE ?", bindings);
-        assertEquals(log.size(), 2);
-         firstLogEntry = log.get(1);
-        assertThat(firstLogEntry.getLevel(), is(Level.INFO));
-        assertThat(firstLogEntry.getMessage(), is("SELECT t0.NAME AS ec0_0, t0.F_KEY1 AS ec0_1, t0.PKEY AS ec0_3 FROM COMPOUND_FK_TEST t0 " +
-                "INNER JOIN COMPOUND_PK_TEST t1 ON (t0.F_KEY1 = t1.KEY1 AND t0.F_KEY2 = t1.KEY2) " +
-                "WHERE t1.NAME LIKE ? UNION ALL SELECT t0.NAME AS ec0_0, t0.F_KEY1 AS ec0_1, t0.PKEY AS ec0_3 " +
-                "FROM COMPOUND_FK_TEST t0 INNER JOIN COMPOUND_PK_TEST t1 ON (t0.F_KEY1 = t1.KEY1 AND t0.F_KEY2 = t1.KEY2) " +
-                "WHERE t1.NAME LIKE ? UNION all SELECT (4 columns) FROM COMPOUND_FK_TEST t0 INNER JOIN COMPOUND_PK_TEST t1 ON (t0.F_KEY1 = t1.KEY1 AND t0.F_KEY2 = t1.KEY2) " +
-                "WHERE t1.NAME LIKE ? [bind: 1->t0.NAME: {'', 52, 'true'}, 2->t0.F_KEY1: 'true'] "));
-        assertThat(firstLogEntry.getLoggerName(), is("org.apache.cayenne.log.JdbcEventLogger"));
-
-    }
-
-    private DbAttributeBinding [] createBindings() {
-        return new DbAttributeBinding[] { createBinding("t0.NAME", 1, "", new CharType(false, false)),
-                                            createBinding("t0.NAME", 2, 52, new IntegerType()),
-                                            createBinding("t0.NAME", 3, true, new BooleanType()),
-                                            createBinding("t0.F_KEY1", 4, true, new BooleanType())};
-    }
-
-    private DbAttributeBinding createBinding(String name, int position, Object object, ExtendedType type){
-
-        DbAttributeBinding dbAttributeBinding = new DbAttributeBinding(new DbAttribute(name));
-        dbAttributeBinding.setValue(object);
-        dbAttributeBinding.setStatementPosition(position);
-        if (type != null) {
-            dbAttributeBinding.setExtendedType(type);
-        }
-
-        return dbAttributeBinding;
-    }
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d8d2ec5d/cayenne-server/src/test/java/org/apache/cayenne/log/CompactSlf4jJdbcEventLoggerTest.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/log/CompactSlf4jJdbcEventLoggerTest.java b/cayenne-server/src/test/java/org/apache/cayenne/log/CompactSlf4jJdbcEventLoggerTest.java
new file mode 100644
index 0000000..4846463
--- /dev/null
+++ b/cayenne-server/src/test/java/org/apache/cayenne/log/CompactSlf4jJdbcEventLoggerTest.java
@@ -0,0 +1,93 @@
+/*****************************************************************
+ *   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.cayenne.log;
+
+import org.apache.cayenne.access.translator.DbAttributeBinding;
+import org.apache.cayenne.access.types.BooleanType;
+import org.apache.cayenne.access.types.CharType;
+import org.apache.cayenne.access.types.ExtendedType;
+import org.apache.cayenne.access.types.IntegerType;
+import org.apache.cayenne.configuration.DefaultRuntimeProperties;
+import org.apache.cayenne.map.DbAttribute;
+import org.junit.Test;
+
+import java.util.Collections;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.*;
+
+public class CompactSlf4jJdbcEventLoggerTest {
+
+    @Test
+    public void logWithCompact_Union() {
+
+        CompactSlf4jJdbcEventLogger compactSl4jJdbcEventLogger = new CompactSlf4jJdbcEventLogger(new DefaultRuntimeProperties(Collections.emptyMap()));
+        DbAttributeBinding[] bindings = createBindings();
+
+        String processesSelectSql = compactSl4jJdbcEventLogger.trimSqlSelectColumns("SELECT t0.NAME AS ec0_0, t0.F_KEY1 AS ec0_1, t0.F_KEY2 AS ec0_2," +
+                " t0.PKEY AS ec0_3 FROM COMPOUND_FK_TEST t0 INNER JOIN COMPOUND_PK_TEST " +
+                "t1 ON (t0.F_KEY1 = t1.KEY1 AND t0.F_KEY2 = t1.KEY2) WHERE t1.NAME LIKE ?");
+        assertEquals(processesSelectSql, "SELECT (4 columns) FROM COMPOUND_FK_TEST t0 " +
+                "INNER JOIN COMPOUND_PK_TEST t1 ON (t0.F_KEY1 = t1.KEY1 AND t0.F_KEY2 = t1.KEY2) " +
+                        "WHERE t1.NAME LIKE ?");
+
+        StringBuilder buffer = new StringBuilder();
+        compactSl4jJdbcEventLogger.appendParameters(buffer, "bind", bindings);
+        assertThat(buffer.toString(), is("[bind: 1->t0.NAME: {'', 52, 'true'}, 2->t0.F_KEY1: 'true']"));
+        String processedUnionSql = compactSl4jJdbcEventLogger.processUnionSql(
+                "SELECT t0.NAME AS ec0_0, t0.F_KEY1 AS ec0_1, " +
+                        "t0.PKEY AS ec0_3 FROM COMPOUND_FK_TEST t0 INNER JOIN COMPOUND_PK_TEST " +
+                        "t1 ON (t0.F_KEY1 = t1.KEY1 AND t0.F_KEY2 = t1.KEY2) WHERE t1.NAME LIKE ?" +
+                        "UNION ALL " +
+                        "SELECT t0.NAME AS ec0_0, t0.F_KEY1 AS ec0_1," +
+                        " t0.PKEY AS ec0_3 FROM COMPOUND_FK_TEST t0 INNER JOIN COMPOUND_PK_TEST " +
+                        "t1 ON (t0.F_KEY1 = t1.KEY1 AND t0.F_KEY2 = t1.KEY2) WHERE t1.NAME LIKE ?" +
+                        "union all " +
+                        "SELECT t0.NAME AS ec0_0, t0.F_KEY1 AS ec0_1, t0.F_KEY2 AS ec0_2," +
+                        " t0.PKEY AS ec0_3 FROM COMPOUND_FK_TEST t0 INNER JOIN COMPOUND_PK_TEST " +
+                        "t1 ON (t0.F_KEY1 = t1.KEY1 AND t0.F_KEY2 = t1.KEY2) WHERE t1.NAME LIKE ?");
+
+        assertThat(processedUnionSql, is("SELECT t0.NAME AS ec0_0, t0.F_KEY1 AS ec0_1, t0.PKEY AS ec0_3 FROM COMPOUND_FK_TEST t0 " +
+                "INNER JOIN COMPOUND_PK_TEST t1 ON (t0.F_KEY1 = t1.KEY1 AND t0.F_KEY2 = t1.KEY2) " +
+                "WHERE t1.NAME LIKE ? UNION ALL SELECT t0.NAME AS ec0_0, t0.F_KEY1 AS ec0_1, t0.PKEY AS ec0_3 " +
+                "FROM COMPOUND_FK_TEST t0 INNER JOIN COMPOUND_PK_TEST t1 ON (t0.F_KEY1 = t1.KEY1 AND t0.F_KEY2 = t1.KEY2) " +
+                "WHERE t1.NAME LIKE ? UNION all SELECT (4 columns) FROM COMPOUND_FK_TEST t0 INNER JOIN COMPOUND_PK_TEST t1 ON (t0.F_KEY1 = t1.KEY1 AND t0.F_KEY2 = t1.KEY2) " +
+                "WHERE t1.NAME LIKE ?"));
+
+    }
+
+    private DbAttributeBinding [] createBindings() {
+        return new DbAttributeBinding[] { createBinding("t0.NAME", 1, "", new CharType(false, false)),
+                                            createBinding("t0.NAME", 2, 52, new IntegerType()),
+                                            createBinding("t0.NAME", 3, true, new BooleanType()),
+                                            createBinding("t0.F_KEY1", 4, true, new BooleanType())};
+    }
+
+    private DbAttributeBinding createBinding(String name, int position, Object object, ExtendedType type){
+
+        DbAttributeBinding dbAttributeBinding = new DbAttributeBinding(new DbAttribute(name));
+        dbAttributeBinding.setValue(object);
+        dbAttributeBinding.setStatementPosition(position);
+        if (type != null) {
+            dbAttributeBinding.setExtendedType(type);
+        }
+
+        return dbAttributeBinding;
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d8d2ec5d/cayenne-server/src/test/java/org/apache/cayenne/log/TestAppender.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/log/TestAppender.java b/cayenne-server/src/test/java/org/apache/cayenne/log/TestAppender.java
deleted file mode 100644
index 5560c07..0000000
--- a/cayenne-server/src/test/java/org/apache/cayenne/log/TestAppender.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package org.apache.cayenne.log;
-
-import ch.qos.logback.classic.spi.LoggingEvent;
-import ch.qos.logback.core.AppenderBase;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class TestAppender extends AppenderBase<LoggingEvent> {
-    static List<LoggingEvent> events = new ArrayList<>();
-
-    @Override
-    protected void append(LoggingEvent e) {
-        events.add(e);
-    }
-}
\ No newline at end of file