This is an automated email from the ASF dual-hosted git repository. asf-gitbox-commits pushed a commit to branch past-M2 in repository https://gitbox.apache.org/repos/asf/cayenne.git
commit 40552a155bc88f89d5ea3f6b5b1ab90b442cfb86 Author: Andrus Adamchik <[email protected]> AuthorDate: Sun May 31 10:56:09 2026 -0400 Unifying ParameterBinding hierarchy into a single class and reducing its mutability --- .../transformer/DefaultBindingsTransformer.java | 2 +- .../merge/token/DefaultValueForNullProvider.java | 2 +- .../cayenne/dbsync/merge/token/ValueForNullIT.java | 2 +- .../org/apache/cayenne/velocity/BindDirective.java | 2 +- .../apache/cayenne/access/jdbc/BatchAction.java | 2 +- .../apache/cayenne/access/jdbc/SelectAction.java | 2 +- .../access/sqlbuilder/sqltree/ValueNode.java | 2 +- .../access/translator/ParameterBinding.java | 158 ++++++++++----------- .../translator/batch/DeleteBatchTranslator.java | 2 +- .../translator/batch/InsertBatchTranslator.java | 2 +- .../batch/SoftDeleteBatchTranslator.java | 2 +- .../translator/batch/UpdateBatchTranslator.java | 4 +- .../translator/procedure/ProcedureTranslator.java | 5 +- .../access/translator/sqltemplate/Context.java | 2 +- .../cayenne/dba/oracle/Oracle8LOBBatchAction.java | 4 +- .../dba/oracle/Oracle8LOBBatchTranslator.java | 4 +- .../cayenne/log/CompactSlf4jJdbcEventLogger.java | 2 +- .../apache/cayenne/log/Slf4jJdbcEventLogger.java | 2 +- .../log/CompactSlf4jJdbcEventLoggerTest.java | 2 +- 19 files changed, 99 insertions(+), 104 deletions(-) diff --git a/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/DefaultBindingsTransformer.java b/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/DefaultBindingsTransformer.java index 02d43bda3..d3fade7bd 100644 --- a/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/DefaultBindingsTransformer.java +++ b/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/DefaultBindingsTransformer.java @@ -57,7 +57,7 @@ public class DefaultBindingsTransformer implements BindingsTransformer { ? extendedTypeMap.getRegisteredType(transformed.getClass()) : extendedTypeMap.getDefaultType(); - b.include(b.getStatementPosition(), transformed, extendedType); + b.reset(b.getStatementPosition(), transformed, extendedType); } } diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/DefaultValueForNullProvider.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/DefaultValueForNullProvider.java index 28d8564cd..5f77227cf 100644 --- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/DefaultValueForNullProvider.java +++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/DefaultValueForNullProvider.java @@ -36,7 +36,7 @@ public class DefaultValueForNullProvider implements ValueForNullProvider { // the binding is only ever read for its value (inlined into the UPDATE below), never bound to a // statement, so the position is irrelevant here ParameterBinding binding = new ParameterBinding(type, column.getAttributePrecision()) - .include(1, value, null); + .reset(1, value, null); values.put(createKey(entity, column), binding); } diff --git a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/token/ValueForNullIT.java b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/token/ValueForNullIT.java index f85815c94..0d3d615d7 100644 --- a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/token/ValueForNullIT.java +++ b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/token/ValueForNullIT.java @@ -105,7 +105,7 @@ public class ValueForNullIT extends MergeCase { int type = column.getType(); switch (type) { case Types.VARCHAR: - return new ParameterBinding(type, -1).include(1, DEFAULT_VALUE_STRING, null); + return new ParameterBinding(type, -1).reset(1, DEFAULT_VALUE_STRING, null); default: throw new AssertionError("should not get here"); } diff --git a/cayenne-velocity/src/main/java/org/apache/cayenne/velocity/BindDirective.java b/cayenne-velocity/src/main/java/org/apache/cayenne/velocity/BindDirective.java index 26f927328..2c2b3d438 100644 --- a/cayenne-velocity/src/main/java/org/apache/cayenne/velocity/BindDirective.java +++ b/cayenne-velocity/src/main/java/org/apache/cayenne/velocity/BindDirective.java @@ -172,7 +172,7 @@ public class BindDirective extends Directive { if (bindings != null) { // a binding's statement position is its 1-based ordinal among the bound parameters; the // ExtendedType is resolved from the value via the adapter - binding.include(bindings.size() + 1, value, extendedType(context, value)); + binding.reset(bindings.size() + 1, value, extendedType(context, value)); bindings.add(binding); } } diff --git a/cayenne/src/main/java/org/apache/cayenne/access/jdbc/BatchAction.java b/cayenne/src/main/java/org/apache/cayenne/access/jdbc/BatchAction.java index 42d918132..19de7fa71 100644 --- a/cayenne/src/main/java/org/apache/cayenne/access/jdbc/BatchAction.java +++ b/cayenne/src/main/java/org/apache/cayenne/access/jdbc/BatchAction.java @@ -59,7 +59,7 @@ public class BatchAction extends BaseSQLAction { throws Exception { for (ParameterBinding b : bindings) { - if (!b.isExcluded()) { + if (!b.isDisabled()) { adapter.bindParameter(statement, b); } } diff --git a/cayenne/src/main/java/org/apache/cayenne/access/jdbc/SelectAction.java b/cayenne/src/main/java/org/apache/cayenne/access/jdbc/SelectAction.java index 6318d1798..3785f6a66 100644 --- a/cayenne/src/main/java/org/apache/cayenne/access/jdbc/SelectAction.java +++ b/cayenne/src/main/java/org/apache/cayenne/access/jdbc/SelectAction.java @@ -48,7 +48,7 @@ public class SelectAction extends BaseSQLAction { for (ParameterBinding b : bindings) { - if (b.isExcluded()) { + if (b.isDisabled()) { continue; } diff --git a/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/ValueNode.java b/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/ValueNode.java index 52cc75383..0d3f8e929 100644 --- a/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/ValueNode.java +++ b/cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/sqltree/ValueNode.java @@ -157,7 +157,7 @@ public class ValueNode extends Node { int jdbcType = context.getAdapter().preferredBindingType(TypesMapping.getSqlTypeByJava(value.getClass())); binding = new ParameterBinding(jdbcType, -1); } - binding.include(context.getBindings().size() + 1, value, extendedType); + binding.reset(context.getBindings().size() + 1, value, extendedType); context.getBindings().add(binding); } diff --git a/cayenne/src/main/java/org/apache/cayenne/access/translator/ParameterBinding.java b/cayenne/src/main/java/org/apache/cayenne/access/translator/ParameterBinding.java index 410539961..64347424e 100644 --- a/cayenne/src/main/java/org/apache/cayenne/access/translator/ParameterBinding.java +++ b/cayenne/src/main/java/org/apache/cayenne/access/translator/ParameterBinding.java @@ -22,90 +22,86 @@ import org.apache.cayenne.access.types.ExtendedType; import org.apache.cayenne.map.DbAttribute; /** - * Describes a single PreparedStatement parameter binding. A binding carries immutable metadata - * (the optional source {@link DbAttribute}, the JDBC type and scale) established at creation time, - * plus a mutable per-iteration state (value, statement position, {@link ExtendedType}) updated via - * {@link #include(int, Object, ExtendedType)} / {@link #exclude()} as batch rows are processed. + * Describes a single PreparedStatement parameter binding. Partially mutable * * @since 4.0 */ public class ParameterBinding { - private static final int EXCLUDED_POSITION = -1; - - private final DbAttribute attribute; - private final int jdbcType; - private final int scale; - - private Object value; - private int statementPosition; - private ExtendedType<?> extendedType; - - /** - * @since 5.0 - */ - public ParameterBinding(int jdbcType, int scale) { - this(jdbcType, scale, null); - } - - /** - * @since 5.0 - */ - public ParameterBinding(int jdbcType, int scale, DbAttribute attribute) { - this.attribute = attribute; - this.jdbcType = jdbcType; - this.scale = scale; - this.statementPosition = EXCLUDED_POSITION; - } - - public Object getValue() { - return value; - } - - public int getStatementPosition() { - return statementPosition; - } - - public boolean isExcluded() { - return statementPosition == EXCLUDED_POSITION; - } - - public ExtendedType getExtendedType() { - return extendedType; - } - - /** - * Marks the binding object as excluded for the current iteration. - */ - public void exclude() { - this.statementPosition = EXCLUDED_POSITION; - this.value = null; - this.extendedType = null; - } - - /** - * Sets the value, statement position and {@link ExtendedType} of the binding, thus "including" it in the current - * iteration. Returns this binding for chaining. - */ - public ParameterBinding include(int statementPosition, Object value, ExtendedType<?> extendedType) { - this.statementPosition = statementPosition; - this.value = value; - this.extendedType = extendedType; - return this; - } - - public int getJdbcType() { - return jdbcType; - } - - public int getScale() { - return scale; - } - - /** - * @since 5.0 - */ - public DbAttribute getAttribute() { - return attribute; - } + private static final int EXCLUDED_POSITION = -1; + + private final DbAttribute attribute; + private final int jdbcType; + private final int scale; + + private Object value; + private int statementPosition; + private ExtendedType<?> extendedType; + + /** + * @since 5.0 + */ + public ParameterBinding(int jdbcType, int scale) { + this(jdbcType, scale, null); + } + + /** + * @since 5.0 + */ + public ParameterBinding(int jdbcType, int scale, DbAttribute attribute) { + this.attribute = attribute; + this.jdbcType = jdbcType; + this.scale = scale; + this.statementPosition = EXCLUDED_POSITION; + } + + public Object getValue() { + return value; + } + + public int getStatementPosition() { + return statementPosition; + } + + public boolean isDisabled() { + return statementPosition == EXCLUDED_POSITION; + } + + public ExtendedType getExtendedType() { + return extendedType; + } + + /** + * Marks the binding object as excluded for the current iteration. + */ + public void disable() { + this.statementPosition = EXCLUDED_POSITION; + this.value = null; + this.extendedType = null; + } + + /** + * Sets the value, statement position and {@link ExtendedType} of the binding. + */ + public ParameterBinding reset(int statementPosition, Object value, ExtendedType<?> extendedType) { + this.statementPosition = statementPosition; + this.value = value; + this.extendedType = extendedType; + return this; + } + + public int getJdbcType() { + return jdbcType; + } + + public int getScale() { + return scale; + } + + /** + * @since 5.0 + */ + public DbAttribute getAttribute() { + return attribute; + } } diff --git a/cayenne/src/main/java/org/apache/cayenne/access/translator/batch/DeleteBatchTranslator.java b/cayenne/src/main/java/org/apache/cayenne/access/translator/batch/DeleteBatchTranslator.java index 78c87d6ea..414b86cbb 100644 --- a/cayenne/src/main/java/org/apache/cayenne/access/translator/batch/DeleteBatchTranslator.java +++ b/cayenne/src/main/java/org/apache/cayenne/access/translator/batch/DeleteBatchTranslator.java @@ -63,7 +63,7 @@ public class DeleteBatchTranslator extends BaseBatchTranslator<DeleteBatchQuery> // skip null attributes... they are translated as "IS NULL" if(value != null) { ExtendedType<?> extendedType = context.getAdapter().getExtendedTypes().getRegisteredType(value.getClass()); - bindings[position].include(++position, value, extendedType); + bindings[position].reset(++position, value, extendedType); } return position; } diff --git a/cayenne/src/main/java/org/apache/cayenne/access/translator/batch/InsertBatchTranslator.java b/cayenne/src/main/java/org/apache/cayenne/access/translator/batch/InsertBatchTranslator.java index bddf13877..2330ef872 100644 --- a/cayenne/src/main/java/org/apache/cayenne/access/translator/batch/InsertBatchTranslator.java +++ b/cayenne/src/main/java/org/apache/cayenne/access/translator/batch/InsertBatchTranslator.java @@ -72,7 +72,7 @@ public class InsertBatchTranslator extends BaseBatchTranslator<InsertBatchQuery> ExtendedType<?> extendedType = value != null ? context.getAdapter().getExtendedTypes().getRegisteredType(value.getClass()) : context.getAdapter().getExtendedTypes().getDefaultType(); - bindings[j].include(++j, value, extendedType); + bindings[j].reset(++j, value, extendedType); } return bindings; } diff --git a/cayenne/src/main/java/org/apache/cayenne/access/translator/batch/SoftDeleteBatchTranslator.java b/cayenne/src/main/java/org/apache/cayenne/access/translator/batch/SoftDeleteBatchTranslator.java index 50e7824df..d866fdadf 100644 --- a/cayenne/src/main/java/org/apache/cayenne/access/translator/batch/SoftDeleteBatchTranslator.java +++ b/cayenne/src/main/java/org/apache/cayenne/access/translator/batch/SoftDeleteBatchTranslator.java @@ -57,7 +57,7 @@ public class SoftDeleteBatchTranslator extends DeleteBatchTranslator { String typeName = TypesMapping.getJavaBySqlType(deleteAttribute); ExtendedType<?> extendedType = context.getAdapter().getExtendedTypes().getRegisteredType(typeName); - bindings[0].include(1, true, extendedType); + bindings[0].reset(1, true, extendedType); return sql; } diff --git a/cayenne/src/main/java/org/apache/cayenne/access/translator/batch/UpdateBatchTranslator.java b/cayenne/src/main/java/org/apache/cayenne/access/translator/batch/UpdateBatchTranslator.java index a7c074fef..6c9eca408 100644 --- a/cayenne/src/main/java/org/apache/cayenne/access/translator/batch/UpdateBatchTranslator.java +++ b/cayenne/src/main/java/org/apache/cayenne/access/translator/batch/UpdateBatchTranslator.java @@ -69,7 +69,7 @@ public class UpdateBatchTranslator extends BaseBatchTranslator<UpdateBatchQuery> ExtendedType<?> extendedType = value == null ? context.getAdapter().getExtendedTypes().getDefaultType() : context.getAdapter().getExtendedTypes().getRegisteredType(value.getClass()); - bindings[j].include(++j, value, extendedType); + bindings[j].reset(++j, value, extendedType); } for(DbAttribute attribute : updateBatch.getQualifierAttributes()) { @@ -79,7 +79,7 @@ public class UpdateBatchTranslator extends BaseBatchTranslator<UpdateBatchQuery> } Object value = row.getValue(i); ExtendedType<?> extendedType = context.getAdapter().getExtendedTypes().getRegisteredType(value.getClass()); - bindings[j].include(++j, value, extendedType); + bindings[j].reset(++j, value, extendedType); i++; } return bindings; diff --git a/cayenne/src/main/java/org/apache/cayenne/access/translator/procedure/ProcedureTranslator.java b/cayenne/src/main/java/org/apache/cayenne/access/translator/procedure/ProcedureTranslator.java index 8d329fd46..b04929dd2 100644 --- a/cayenne/src/main/java/org/apache/cayenne/access/translator/procedure/ProcedureTranslator.java +++ b/cayenne/src/main/java/org/apache/cayenne/access/translator/procedure/ProcedureTranslator.java @@ -26,7 +26,6 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; -import org.apache.cayenne.access.translator.ParameterBinding; import org.apache.cayenne.access.translator.ParameterBinding; import org.apache.cayenne.access.types.ExtendedType; import org.apache.cayenne.dba.DbAdapter; @@ -161,7 +160,7 @@ public class ProcedureTranslator { value = value.toString(); } parameterBindings[i] = new ParameterBinding(procedureParameter.getType(), procedureParameter.getPrecision()) - .include(i + 1, value, null); + .reset(i + 1, value, null); } logger.logQuery(sqlStr, parameterBindings); } @@ -232,7 +231,7 @@ public class ProcedureTranslator { : adapter.getExtendedTypes().getDefaultType(); ParameterBinding binding = new ParameterBinding(adapter.preferredBindingType(param.getType()), param.getPrecision()) - .include(pos, val, extendedType); + .reset(pos, val, extendedType); adapter.bindParameter(stmt, binding); } diff --git a/cayenne/src/main/java/org/apache/cayenne/access/translator/sqltemplate/Context.java b/cayenne/src/main/java/org/apache/cayenne/access/translator/sqltemplate/Context.java index 2821dd0c1..61bac2832 100644 --- a/cayenne/src/main/java/org/apache/cayenne/access/translator/sqltemplate/Context.java +++ b/cayenne/src/main/java/org/apache/cayenne/access/translator/sqltemplate/Context.java @@ -118,7 +118,7 @@ public class Context { } // a binding's statement position is its 1-based ordinal among the bound parameters; the // ExtendedType is resolved from the value via the adapter - binding.include(parameterBindings.size() + 1, value, extendedType(value)); + binding.reset(parameterBindings.size() + 1, value, extendedType(value)); parameterBindings.add(binding); } diff --git a/cayenne/src/main/java/org/apache/cayenne/dba/oracle/Oracle8LOBBatchAction.java b/cayenne/src/main/java/org/apache/cayenne/dba/oracle/Oracle8LOBBatchAction.java index 33159de64..14b3efc20 100644 --- a/cayenne/src/main/java/org/apache/cayenne/dba/oracle/Oracle8LOBBatchAction.java +++ b/cayenne/src/main/java/org/apache/cayenne/dba/oracle/Oracle8LOBBatchAction.java @@ -99,7 +99,7 @@ class Oracle8LOBBatchAction implements SQLAction { logger.logQueryParameters("bind", bindings); for (ParameterBinding b : bindings) { - if (!b.isExcluded()) { + if (!b.isDisabled()) { adapter.bindParameter(statement, b); } } @@ -148,7 +148,7 @@ class Oracle8LOBBatchAction implements SQLAction { ParameterBinding binding = new ParameterBinding( adapter.preferredBindingType(attribute.getType()), attribute.getScale(), attribute ); - binding.include(i + 1, value, extendedType); + binding.reset(i + 1, value, extendedType); adapter.bindParameter(selectStatement, binding); if(isLoggable) { attributeBindings[i] = binding; diff --git a/cayenne/src/main/java/org/apache/cayenne/dba/oracle/Oracle8LOBBatchTranslator.java b/cayenne/src/main/java/org/apache/cayenne/dba/oracle/Oracle8LOBBatchTranslator.java index 1e0dd739d..291a8b9be 100644 --- a/cayenne/src/main/java/org/apache/cayenne/dba/oracle/Oracle8LOBBatchTranslator.java +++ b/cayenne/src/main/java/org/apache/cayenne/dba/oracle/Oracle8LOBBatchTranslator.java @@ -143,9 +143,9 @@ abstract class Oracle8LOBBatchTranslator extends DefaultBatchTranslator { ? adapter.getExtendedTypes().getRegisteredType(value.getClass()) : adapter.getExtendedTypes().getDefaultType(); - b.include(j++, value, extendedType); + b.reset(j++, value, extendedType); } else { - b.exclude(); + b.disable(); } } diff --git a/cayenne/src/main/java/org/apache/cayenne/log/CompactSlf4jJdbcEventLogger.java b/cayenne/src/main/java/org/apache/cayenne/log/CompactSlf4jJdbcEventLogger.java index 54bea360e..407c81cfb 100644 --- a/cayenne/src/main/java/org/apache/cayenne/log/CompactSlf4jJdbcEventLogger.java +++ b/cayenne/src/main/java/org/apache/cayenne/log/CompactSlf4jJdbcEventLogger.java @@ -112,7 +112,7 @@ public class CompactSlf4jJdbcEventLogger extends Slf4jJdbcEventLogger { String key = null; String value; for (ParameterBinding b : bindings) { - if (b.isExcluded()) { + if (b.isDisabled()) { continue; } diff --git a/cayenne/src/main/java/org/apache/cayenne/log/Slf4jJdbcEventLogger.java b/cayenne/src/main/java/org/apache/cayenne/log/Slf4jJdbcEventLogger.java index 484eab7c7..217fd287f 100644 --- a/cayenne/src/main/java/org/apache/cayenne/log/Slf4jJdbcEventLogger.java +++ b/cayenne/src/main/java/org/apache/cayenne/log/Slf4jJdbcEventLogger.java @@ -100,7 +100,7 @@ public class Slf4jJdbcEventLogger implements JdbcEventLogger { for (int i = 0, j = 1; i < len; i++) { ParameterBinding b = bindings[i]; - if (b.isExcluded()) { + if (b.isDisabled()) { continue; } diff --git a/cayenne/src/test/java/org/apache/cayenne/log/CompactSlf4jJdbcEventLoggerTest.java b/cayenne/src/test/java/org/apache/cayenne/log/CompactSlf4jJdbcEventLoggerTest.java index 57a58a058..f78db4021 100644 --- a/cayenne/src/test/java/org/apache/cayenne/log/CompactSlf4jJdbcEventLoggerTest.java +++ b/cayenne/src/test/java/org/apache/cayenne/log/CompactSlf4jJdbcEventLoggerTest.java @@ -112,7 +112,7 @@ public class CompactSlf4jJdbcEventLoggerTest { private ParameterBinding createBinding(String name, int position, Object object, ExtendedType type){ DbAttribute attribute = new DbAttribute(name); ParameterBinding binding = new ParameterBinding(attribute.getType(), -1, attribute); - binding.include(position, object, type); + binding.reset(position, object, type); return binding; } }
