This is an automated email from the ASF dual-hosted git repository. asf-gitbox-commits pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/cayenne.git
commit 23cfc8696174275e50c7a811a68f95c1e18279db Author: Andrus Adamchik <[email protected]> AuthorDate: Fri Jul 3 16:23:49 2026 -0400 CAY-2912 Compact SQL logger removing CompactSlf4jJdbcEventLogger ... ongoing refactoring should go msoother without it in the picture --- .../cayenne/log/CompactSlf4jJdbcEventLogger.java | 180 --------------------- .../log/CompactSlf4jJdbcEventLoggerTest.java | 116 ------------- 2 files changed, 296 deletions(-) diff --git a/cayenne/src/main/java/org/apache/cayenne/log/CompactSlf4jJdbcEventLogger.java b/cayenne/src/main/java/org/apache/cayenne/log/CompactSlf4jJdbcEventLogger.java deleted file mode 100644 index 59540dcd8..000000000 --- a/cayenne/src/main/java/org/apache/cayenne/log/CompactSlf4jJdbcEventLogger.java +++ /dev/null @@ -1,180 +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 - * - * https://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 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; - -import org.apache.cayenne.access.jdbc.PSParameter; -import org.apache.cayenne.configuration.RuntimeProperties; -import org.apache.cayenne.di.Inject; -import org.apache.cayenne.map.DbAttribute; - -/** - * @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 char SPACE = ' '; - - private static final Pattern UNION_PATTERN = Pattern.compile(UNION, Pattern.CASE_INSENSITIVE); - - public CompactSlf4jJdbcEventLogger(@Inject RuntimeProperties runtimeProperties) { - super(runtimeProperties); - } - - @Override - public void logQuery(String sql, PSParameter[] bindings) { - if (!isLoggable()) { - return; - } - - String str; - if (UNION_PATTERN.matcher(sql).find()) { - str = processUnionSql(sql); - } else { - str = trimSqlSelectColumns(sql); - } - - super.logQuery(str, bindings); - } - - protected String processUnionSql(String sql) { - String modified = UNION_PATTERN.matcher(sql) - .replaceAll(UNION); - String[] queries = modified.split(UNION); - return Arrays.stream(queries) - .map(this::trimSqlSelectColumns) - .collect(Collectors.joining(SPACE + UNION)); - } - - protected String trimSqlSelectColumns(String sql) { - String str = sql.toUpperCase(); - int selectIndex = str.indexOf(SELECT); - if (selectIndex == -1) { - return sql; - } - selectIndex += SELECT.length(); - int fromIndex = str.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, PSParameter[] bindings) { - int bindingLength = bindings.length; - if (bindingLength == 0) { - return; - } - - buildBinding(buffer, label, collectBindings(bindings)); - } - - @SuppressWarnings("unchecked") - private Map<String, List<String>> collectBindings(PSParameter[] bindings) { - Map<String, List<String>> bindingsMap = new HashMap<>(); - - String key = null; - String value; - for (PSParameter b : bindings) { - DbAttribute attribute = b.attribute(); - if (attribute != null) { - key = attribute.getName(); - } - - if (b.binder() != null) { - value = b.binder().toString(b.value()); - } else if (b.value() == null) { - value = "NULL"; - } else { - value = b.value().getClass().getName() + - "@" + - System.identityHashCode(b.value()); - } - - 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) { - } -} diff --git a/cayenne/src/test/java/org/apache/cayenne/log/CompactSlf4jJdbcEventLoggerTest.java b/cayenne/src/test/java/org/apache/cayenne/log/CompactSlf4jJdbcEventLoggerTest.java deleted file mode 100644 index 2877fe339..000000000 --- a/cayenne/src/test/java/org/apache/cayenne/log/CompactSlf4jJdbcEventLoggerTest.java +++ /dev/null @@ -1,116 +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 - * - * https://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.jdbc.PSParameter; -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.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -import java.util.Collections; - -import static org.junit.jupiter.api.Assertions.*; - -public class CompactSlf4jJdbcEventLoggerTest { - - private CompactSlf4jJdbcEventLogger logger; - - @BeforeEach - public void createLogger() { - logger = new CompactSlf4jJdbcEventLogger(new DefaultRuntimeProperties(Collections.emptyMap())); - } - - @Test - public void compactSimpleSql() { - String processesSelectSql = logger.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 ?"); - } - - - @Test - public void compactNotSelect() { - String processedSql = logger.trimSqlSelectColumns( - "UPDATE test SET name = 'abc', value = 123 WHERE id = 321"); - - assertEquals("UPDATE test SET name = 'abc', value = 123 WHERE id = 321", processedSql); - } - - @Test - public void compactSubSelect() { - String processedSql = logger.trimSqlSelectColumns( - "INSERT INTO test1 SELECT column1, column2, column3, column4, column5, column6 FROM test2 WHERE id = 321"); - - assertEquals("INSERT INTO test1 SELECT (6 columns) FROM test2 WHERE id = 321", processedSql); - } - - @Test - public void compactUnion() { - String processedUnionSql = logger.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 ?"); - - assertEquals("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 ?", - processedUnionSql); - } - - @Test - public void compactBindings() { - StringBuilder buffer = new StringBuilder(); - PSParameter[] bindings = new PSParameter[] { - 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()) - }; - logger.appendParameters(buffer, "bind", bindings); - - assertEquals("[bind: 1->t0.NAME: {'', 52, 'true'}, 2->t0.F_KEY1: 'true']", buffer.toString()); - } - - private PSParameter createBinding(String name, int position, Object object, ExtendedType type){ - DbAttribute attribute = new DbAttribute(name); - return new PSParameter(object, position, attribute.getType(), -1, type, attribute); - } -}
