> flattenInputVariables() {
}
@Override
- public String toDebugString(IN in) {
- return "delete(" + toDebugParams(in) + ")";
+ public Object toDebugString(IN in) {
+ return lazyDebugMsg("delete(%s)", toDebugParams(in));
}
}
diff --git a/repository-ydb-v2/src/main/java/tech/ydb/yoj/repository/ydb/statement/FindInStatement.java b/repository-ydb-v2/src/main/java/tech/ydb/yoj/repository/ydb/statement/FindInStatement.java
index b550e5a2..a8e652dd 100644
--- a/repository-ydb-v2/src/main/java/tech/ydb/yoj/repository/ydb/statement/FindInStatement.java
+++ b/repository-ydb-v2/src/main/java/tech/ydb/yoj/repository/ydb/statement/FindInStatement.java
@@ -33,6 +33,7 @@
import static java.util.stream.Collectors.toCollection;
import static java.util.stream.Collectors.toUnmodifiableMap;
import static java.util.stream.Collectors.toUnmodifiableSet;
+import static tech.ydb.yoj.util.lang.Strings.lazyDebugMsg;
/**
* Creates statement for {@code SELECT ... WHERE PK IN (PK1, PK2, ...)}. {@code PK} can be both
@@ -114,7 +115,7 @@ public final class FindInStatement, RESULT> extends Mult
private final String indexName;
private final Schema> keySchema;
private final Set keyFields;
- private final PredicateClause predicate;
+ private final PredicateClause predicateClause;
private final OrderExpression orderBy;
private final Integer limit;
@@ -183,9 +184,9 @@ private FindInStatement(
this.keySchema = keySchema;
this.keyFields = keyFields;
if (filter != null) {
- this.predicate = new PredicateClause<>(tableDescriptor, schema, YqlListingQuery.toYqlPredicate(filter));
+ this.predicateClause = new PredicateClause<>(tableDescriptor, schema, YqlListingQuery.toYqlPredicate(filter));
} else {
- this.predicate = null;
+ this.predicateClause = null;
}
validateOrderByFields();
@@ -332,11 +333,11 @@ public QueryType getQueryType() {
public String getQuery(String tablespace) {
return declarations() +
"SELECT " + outNames() + "\n" +
- (hasPredicate() ? "FROM (\nSELECT " + allColumnNames() + "\n" : "") +
+ (hasPredicateClause() ? "FROM (\nSELECT " + allColumnNames() + "\n" : "") +
"FROM AS_TABLE(" + listName + ") AS k\n" +
"JOIN " + table(tablespace) + indexUsage() + " AS t\n" +
"ON " + joinExpression() + "\n" +
- (hasPredicate() ? ")\n" : "") +
+ (hasPredicateClause() ? ")\n" : "") +
predicateClause() +
orderByClause() +
limitClause();
@@ -352,10 +353,10 @@ public List getParams() {
@Override
public Map toQueryParameters(IN in) {
- if (hasPredicate()) {
+ if (hasPredicateClause()) {
return ImmutableMap.builder()
.putAll(super.toQueryParameters(in))
- .putAll(predicate.toQueryParameters())
+ .putAll(predicateClause.toQueryParameters())
.build();
}
@@ -381,7 +382,7 @@ private String allColumnNames() {
}
private String getOutName(JavaField field) {
- return hasPredicate() ? escape(field.getName()) : getAliasedName(field);
+ return hasPredicateClause() ? escape(field.getName()) : getAliasedName(field);
}
private String getAliasedName(JavaField field) {
@@ -415,21 +416,21 @@ private String limitClause() {
}
private String predicateClauseDeclarations() {
- return hasPredicate() ? predicate.declarations() : "";
+ return hasPredicateClause() ? predicateClause.declarations() : "";
}
private String predicateClause() {
- return hasPredicate() ? predicate.getClause() : "";
+ return hasPredicateClause() ? predicateClause.getClause() : "";
}
@Override
- public String toDebugString(IN in) {
- return "findIn(" + toDebugParams(in) +
- (isFindByIndex() ? " by index " + escape(indexName) : "") +
- (hasPredicate() ? ", filter [" + predicate.toDebugString() + "]" : "") +
- (hasOrderBy() ? ", orderBy [" + orderBy + "]" : "") +
- (hasLimit() ? ", limit [" + limit + "]" : "") +
- ")";
+ public Object toDebugString(IN in) {
+ return lazyDebugMsg("findIn(%s%s%s%s%s)",
+ toDebugParams(in),
+ (isFindByIndex() ? ", index [" + indexName + "]" : ""),
+ (hasPredicateClause() ? lazyDebugMsg(", filter [%s]", predicateClause.predicate) : ""),
+ (hasOrderBy() ? ", orderBy [" + orderBy + "]" : ""),
+ (hasLimit() ? ", limit [" + limit + "]" : ""));
}
private boolean isFindByIndex() {
@@ -444,16 +445,15 @@ private boolean hasOrderBy() {
return orderBy != null;
}
- private boolean hasPredicate() {
- return predicate != null;
+ private boolean hasPredicateClause() {
+ return predicateClause != null;
}
- private static class PredicateClause> extends PredicateStatement, T, T> {
+ private static final class PredicateClause> extends PredicateStatement, T, T> {
private final YqlPredicate predicate;
public PredicateClause(TableDescriptor tableDescriptor, EntitySchema schema, YqlPredicate predicate) {
super(tableDescriptor, schema, schema, Void.class, __ -> predicate);
-
this.predicate = predicate;
}
@@ -468,11 +468,12 @@ public String getClause() {
@Override
public String getQuery(String tablespace) {
- return "SELECT 1";
+ throw new UnsupportedOperationException("FindInStatement.PredicateClause.getQuery()");
}
- public String toDebugString() {
- return toDebugString(Void.TYPE);
+ @Override
+ public String toString() {
+ return "FindInStatement.PredicateClause[" + predicate + "]";
}
public Map toQueryParameters() {
@@ -480,8 +481,8 @@ public Map toQueryParameters() {
}
@Override
- public String toDebugString(Class in) {
- return predicate.toString();
+ public Object toDebugString(Class in) {
+ throw new UnsupportedOperationException("FindInStatement.PredicateClause.toDebugString()");
}
}
}
diff --git a/repository-ydb-v2/src/main/java/tech/ydb/yoj/repository/ydb/statement/FindRangeStatement.java b/repository-ydb-v2/src/main/java/tech/ydb/yoj/repository/ydb/statement/FindRangeStatement.java
index d85775c4..7d391a61 100644
--- a/repository-ydb-v2/src/main/java/tech/ydb/yoj/repository/ydb/statement/FindRangeStatement.java
+++ b/repository-ydb-v2/src/main/java/tech/ydb/yoj/repository/ydb/statement/FindRangeStatement.java
@@ -19,6 +19,7 @@
import static java.util.stream.Collectors.joining;
import static java.util.stream.Collectors.toList;
import static java.util.stream.Collectors.toMap;
+import static tech.ydb.yoj.util.lang.Strings.lazyDebugMsg;
public class FindRangeStatement, ID extends Entity.Id, RESULT> extends YqlStatement, ENTITY, RESULT> {
@Getter
@@ -58,8 +59,8 @@ public QueryType getQueryType() {
}
@Override
- public String toDebugString(Range idRange) {
- return "find(" + idRange + ")";
+ public Object toDebugString(Range idRange) {
+ return lazyDebugMsg("find(%s)", idRange);
}
@Override
diff --git a/repository-ydb-v2/src/main/java/tech/ydb/yoj/repository/ydb/statement/FindStatement.java b/repository-ydb-v2/src/main/java/tech/ydb/yoj/repository/ydb/statement/FindStatement.java
index b972ad30..cca9e8d3 100644
--- a/repository-ydb-v2/src/main/java/tech/ydb/yoj/repository/ydb/statement/FindStatement.java
+++ b/repository-ydb-v2/src/main/java/tech/ydb/yoj/repository/ydb/statement/FindStatement.java
@@ -15,6 +15,7 @@
import static java.util.Comparator.comparing;
import static java.util.stream.Collectors.joining;
+import static tech.ydb.yoj.util.lang.Strings.lazyDebugMsg;
public class FindStatement, RESULT> extends PredicateStatement>, ENTITY, RESULT> {
private final boolean distinct;
@@ -67,7 +68,7 @@ public Statement.QueryType getQueryType() {
}
@Override
- public String toDebugString(Collection extends YqlStatementPart>> yqlStatementParts) {
- return "find(" + yqlStatementParts + ")";
+ public Object toDebugString(Collection extends YqlStatementPart>> yqlStatementParts) {
+ return yqlStatementParts.isEmpty() ? "find()" : lazyDebugMsg("find(%s)", yqlStatementParts);
}
}
diff --git a/repository-ydb-v2/src/main/java/tech/ydb/yoj/repository/ydb/statement/FindYqlStatement.java b/repository-ydb-v2/src/main/java/tech/ydb/yoj/repository/ydb/statement/FindYqlStatement.java
index efec47c1..af8fc113 100644
--- a/repository-ydb-v2/src/main/java/tech/ydb/yoj/repository/ydb/statement/FindYqlStatement.java
+++ b/repository-ydb-v2/src/main/java/tech/ydb/yoj/repository/ydb/statement/FindYqlStatement.java
@@ -11,6 +11,7 @@
import java.util.List;
import static java.util.stream.Collectors.toList;
+import static tech.ydb.yoj.util.lang.Strings.lazyDebugMsg;
public class FindYqlStatement, RESULT> extends YqlStatement {
public FindYqlStatement(
@@ -59,7 +60,7 @@ public QueryType getQueryType() {
}
@Override
- public String toDebugString(PARAMS params) {
- return "find(" + params + ")";
+ public Object toDebugString(PARAMS params) {
+ return lazyDebugMsg("find(%s)", params);
}
}
diff --git a/repository-ydb-v2/src/main/java/tech/ydb/yoj/repository/ydb/statement/InsertYqlStatement.java b/repository-ydb-v2/src/main/java/tech/ydb/yoj/repository/ydb/statement/InsertYqlStatement.java
index fee20394..d69e2215 100644
--- a/repository-ydb-v2/src/main/java/tech/ydb/yoj/repository/ydb/statement/InsertYqlStatement.java
+++ b/repository-ydb-v2/src/main/java/tech/ydb/yoj/repository/ydb/statement/InsertYqlStatement.java
@@ -7,6 +7,8 @@
import java.util.Map;
import java.util.function.Function;
+import static tech.ydb.yoj.util.lang.Strings.lazyDebugMsg;
+
public class InsertYqlStatement> extends MultipleVarsYqlStatement.Simple {
public InsertYqlStatement(TableDescriptor tableDescriptor, EntitySchema schema) {
super(tableDescriptor, schema);
@@ -18,8 +20,8 @@ public QueryType getQueryType() {
}
@Override
- public String toDebugString(PARAMS params) {
- return "insert(" + toDebugParams(params) + ")";
+ public Object toDebugString(PARAMS params) {
+ return lazyDebugMsg("insert(%s)", toDebugParams(params));
}
@Override
diff --git a/repository-ydb-v2/src/main/java/tech/ydb/yoj/repository/ydb/statement/MultipleVarsYqlStatement.java b/repository-ydb-v2/src/main/java/tech/ydb/yoj/repository/ydb/statement/MultipleVarsYqlStatement.java
index 81d132e6..77c9a947 100644
--- a/repository-ydb-v2/src/main/java/tech/ydb/yoj/repository/ydb/statement/MultipleVarsYqlStatement.java
+++ b/repository-ydb-v2/src/main/java/tech/ydb/yoj/repository/ydb/statement/MultipleVarsYqlStatement.java
@@ -18,6 +18,7 @@
import static java.util.stream.Collectors.joining;
import static java.util.stream.Collectors.toList;
import static tech.ydb.yoj.repository.db.EntityIdSchema.isIdField;
+import static tech.ydb.yoj.util.lang.Strings.debugResult;
public abstract class MultipleVarsYqlStatement, RESULT> extends YqlStatement {
public static final String listName = "$Input";
@@ -90,15 +91,8 @@ public Map toQueryParameters(PARAMS params) {
protected abstract Function> flattenInputVariables();
- protected String toDebugParams(PARAMS params) {
- if (params instanceof Collection> c) {
- return switch (c.size()) {
- case 0 -> "[]";
- case 1 -> "[" + c.iterator().next() + "]";
- default -> "[" + c.iterator().next() + ",...](" + c.size() + ")";
- };
- }
- return String.valueOf(params);
+ protected Object toDebugParams(PARAMS params) {
+ return debugResult(params);
}
public abstract static class Simple>
diff --git a/repository-ydb-v2/src/main/java/tech/ydb/yoj/repository/ydb/statement/Statement.java b/repository-ydb-v2/src/main/java/tech/ydb/yoj/repository/ydb/statement/Statement.java
index ee850be3..15430b47 100644
--- a/repository-ydb-v2/src/main/java/tech/ydb/yoj/repository/ydb/statement/Statement.java
+++ b/repository-ydb-v2/src/main/java/tech/ydb/yoj/repository/ydb/statement/Statement.java
@@ -39,13 +39,15 @@ default boolean isPreparable() {
String getQuery(String tablespace);
/**
- * Returns debug representation of this query with the specified parameter values.
+ * Returns a debug representation (possibly a lazy one) of this query with the specified parameter values.
+ * Calling {@code toString()} on the debug representation will return a {@code String} with a textual representation
+ * of the statement and its parameters.
*
* @param params parameter values.
* Might be {@code null} depending on the statement type, e.g. for DELETE statements.
* @return debug representation of the query parameterized with {@code params}
*/
- String toDebugString(PARAMS params);
+ Object toDebugString(PARAMS params);
// Parameters
diff --git a/repository-ydb-v2/src/main/java/tech/ydb/yoj/repository/ydb/statement/UpdateByIdStatement.java b/repository-ydb-v2/src/main/java/tech/ydb/yoj/repository/ydb/statement/UpdateByIdStatement.java
index 543b38f5..43179f15 100644
--- a/repository-ydb-v2/src/main/java/tech/ydb/yoj/repository/ydb/statement/UpdateByIdStatement.java
+++ b/repository-ydb-v2/src/main/java/tech/ydb/yoj/repository/ydb/statement/UpdateByIdStatement.java
@@ -18,6 +18,7 @@
import static java.util.stream.Collectors.toMap;
import static java.util.stream.Collectors.toUnmodifiableSet;
import static java.util.stream.Stream.concat;
+import static tech.ydb.yoj.util.lang.Strings.lazyDebugMsg;
/**
* @deprecated Blindly setting entity fields is not recommended. Use {@code Table.modifyIfPresent()} instead, unless you
@@ -70,8 +71,8 @@ public QueryType getQueryType() {
}
@Override
- public String toDebugString(UpdateModel.ById idById) {
- return "updateById(" + idById.getId() + ")";
+ public Object toDebugString(UpdateModel.ById idById) {
+ return lazyDebugMsg("updateById(%s)", idById.getId());
}
@Override
diff --git a/repository-ydb-v2/src/main/java/tech/ydb/yoj/repository/ydb/statement/UpdateInStatement.java b/repository-ydb-v2/src/main/java/tech/ydb/yoj/repository/ydb/statement/UpdateInStatement.java
index 77b6c0d3..562b5c33 100644
--- a/repository-ydb-v2/src/main/java/tech/ydb/yoj/repository/ydb/statement/UpdateInStatement.java
+++ b/repository-ydb-v2/src/main/java/tech/ydb/yoj/repository/ydb/statement/UpdateInStatement.java
@@ -21,6 +21,7 @@
import static java.util.stream.Collectors.joining;
import static java.util.stream.Collectors.toMap;
import static java.util.stream.Collectors.toUnmodifiableSet;
+import static tech.ydb.yoj.util.lang.Strings.lazyDebugMsg;
/**
* Creates statement for {@code UPDATE table SET values=values WHERE PK IN (PK1, PK2, ...)}.
@@ -172,8 +173,8 @@ private String getEscapedName(JavaField field) {
}
@Override
- public String toDebugString(UpdateInStatementInput in) {
- return String.format("updateIn(%s)", in);
+ public Object toDebugString(UpdateInStatementInput in) {
+ return lazyDebugMsg("updateIn(%s)", in);
}
private Set nonNullFieldNames(Entity.Id id) {
diff --git a/repository-ydb-v2/src/main/java/tech/ydb/yoj/repository/ydb/statement/UpsertYqlStatement.java b/repository-ydb-v2/src/main/java/tech/ydb/yoj/repository/ydb/statement/UpsertYqlStatement.java
index 66dd1ca4..7554befa 100644
--- a/repository-ydb-v2/src/main/java/tech/ydb/yoj/repository/ydb/statement/UpsertYqlStatement.java
+++ b/repository-ydb-v2/src/main/java/tech/ydb/yoj/repository/ydb/statement/UpsertYqlStatement.java
@@ -7,6 +7,8 @@
import java.util.Map;
import java.util.function.Function;
+import static tech.ydb.yoj.util.lang.Strings.lazyDebugMsg;
+
public class UpsertYqlStatement> extends MultipleVarsYqlStatement.Simple {
public UpsertYqlStatement(TableDescriptor tableDescriptor, EntitySchema schema) {
super(tableDescriptor, schema);
@@ -18,8 +20,8 @@ public QueryType getQueryType() {
}
@Override
- public String toDebugString(IN in) {
- return "upsert(" + toDebugParams(in) + ")";
+ public Object toDebugString(IN in) {
+ return lazyDebugMsg("upsert(%s)", toDebugParams(in));
}
@Override
diff --git a/repository-ydb-v2/src/main/java/tech/ydb/yoj/repository/ydb/table/YdbTable.java b/repository-ydb-v2/src/main/java/tech/ydb/yoj/repository/ydb/table/YdbTable.java
index b6c2d3ab..6b103ccf 100644
--- a/repository-ydb-v2/src/main/java/tech/ydb/yoj/repository/ydb/table/YdbTable.java
+++ b/repository-ydb-v2/src/main/java/tech/ydb/yoj/repository/ydb/table/YdbTable.java
@@ -14,12 +14,12 @@
import tech.ydb.yoj.repository.db.Range;
import tech.ydb.yoj.repository.db.Table;
import tech.ydb.yoj.repository.db.TableDescriptor;
-import tech.ydb.yoj.repository.db.TableQueryImpl;
import tech.ydb.yoj.repository.db.Tx;
import tech.ydb.yoj.repository.db.ViewSchema;
import tech.ydb.yoj.repository.db.bulk.BulkParams;
import tech.ydb.yoj.repository.db.cache.FirstLevelCache;
import tech.ydb.yoj.repository.db.cache.TransactionLocal;
+import tech.ydb.yoj.repository.db.internal.TableQueryImpl;
import tech.ydb.yoj.repository.db.readtable.ReadTableParams;
import tech.ydb.yoj.repository.db.statement.Changeset;
import tech.ydb.yoj.repository.ydb.bulk.BulkMapper;
diff --git a/repository-ydb-v2/src/main/java/tech/ydb/yoj/repository/ydb/yql/YqlPredicate.java b/repository-ydb-v2/src/main/java/tech/ydb/yoj/repository/ydb/yql/YqlPredicate.java
index 5e4eb9f0..a1089ca3 100644
--- a/repository-ydb-v2/src/main/java/tech/ydb/yoj/repository/ydb/yql/YqlPredicate.java
+++ b/repository-ydb-v2/src/main/java/tech/ydb/yoj/repository/ydb/yql/YqlPredicate.java
@@ -1,6 +1,7 @@
package tech.ydb.yoj.repository.ydb.yql;
import com.google.common.base.Preconditions;
+import com.google.common.base.Strings;
import com.google.common.collect.ImmutableList;
import lombok.AllArgsConstructor;
import lombok.NonNull;
@@ -398,7 +399,7 @@ private String fieldToYql(EntitySchema.JavaField field) {
@Override
public String toString() {
- return format("%s %s %s", fieldPath, rel, param.getValue());
+ return Strings.lenientFormat("%s %s %s", fieldPath, rel, param.getValue());
}
}
@@ -457,7 +458,7 @@ public > String toYql(@NonNull EntitySchema schema) {
@Override
public String toString() {
- return format("%s %s %s", fieldPath, rel, param.getValue());
+ return Strings.lenientFormat("%s %s %s", fieldPath, rel, param.getValue());
}
}
@@ -564,7 +565,7 @@ public > String toYql(@NonNull EntitySchema schema) {
@Override
public String toString() {
- return format("%s %s %s%s", fieldPath, type, param.getValue(), escape == null ? "" : " ESCAPE " + escape);
+ return Strings.lenientFormat("%s %s %s%s", fieldPath, type, param.getValue(), escape == null ? "" : " ESCAPE " + escape);
}
public enum Type {
@@ -643,7 +644,7 @@ public List> paramList() {
@Override
public > String toYql(@NonNull EntitySchema schema) {
if (isEmpty()) {
- return alwaysFalse().toString();
+ return alwaysFalse().toYql(schema);
}
EntitySchema.JavaField field = schema.getField(fieldPath);
@@ -669,9 +670,8 @@ private boolean isEmpty() {
@Override
public String toString() {
- return format("%s %s (%s)", fieldPath, inType, param.getValue());
+ return Strings.lenientFormat("%s %s (%s)", fieldPath, inType, param.getValue());
}
-
}
@AllArgsConstructor(access = PRIVATE)
@@ -703,7 +703,7 @@ public List> paramList() {
@Override
public > String toYql(@NonNull EntitySchema schema) {
if (isEmpty()) {
- return alwaysFalse().toString();
+ return alwaysFalse().toYql(schema);
}
EntitySchema.JavaField field = schema.getField(fieldPath);
@@ -735,7 +735,7 @@ private boolean isEmpty() {
@Override
public String toString() {
- return format("%s %s (%s)", fieldPath, inType, param.getValue());
+ return Strings.lenientFormat("%s %s (%s)", fieldPath, inType, param.getValue());
}
}
@@ -760,19 +760,15 @@ public > String toYql(@NonNull EntitySchema schema) {
@Override
public YqlPredicate negate() {
- switch (type) {
- case IS_NULL:
- return new IsNullPredicate(fieldPath, IS_NOT_NULL);
- case IS_NOT_NULL:
- return new IsNullPredicate(fieldPath, IS_NULL);
- default:
- throw new UnsupportedOperationException("This should never happen");
- }
+ return switch (type) {
+ case IS_NULL -> new IsNullPredicate(fieldPath, IS_NOT_NULL);
+ case IS_NOT_NULL -> new IsNullPredicate(fieldPath, IS_NULL);
+ };
}
@Override
public String toString() {
- return format("%s %s", fieldPath, type);
+ return Strings.lenientFormat("%s %s", fieldPath, type);
}
/*package*/ enum IsNullType {
@@ -834,7 +830,7 @@ public > String toYql(@NonNull EntitySchema schema) {
@Override
public String toString() {
- return predicates.stream().map(p -> format("(%s)", p)).collect(joining(" && "));
+ return predicates.stream().map(p -> "(" + p + ")").collect(joining(" && "));
}
}
@@ -879,7 +875,7 @@ public > String toYql(@NonNull EntitySchema schema) {
@Override
public String toString() {
- return predicates.stream().map(p -> format("(%s)", p)).collect(joining(" || "));
+ return predicates.stream().map(p -> "(" + p + ")").collect(joining(" || "));
}
}
@@ -912,7 +908,7 @@ public > String toYql(@NonNull EntitySchema schema) {
@Override
public String toString() {
- return format("!(%s)", opposite);
+ return "!(" + opposite + ")";
}
}
diff --git a/repository-ydb-v2/src/test/java/tech/ydb/yoj/repository/ydb/YdbRepositoryIntegrationTest.java b/repository-ydb-v2/src/test/java/tech/ydb/yoj/repository/ydb/YdbRepositoryIntegrationTest.java
index 817a1540..b04e04b1 100644
--- a/repository-ydb-v2/src/test/java/tech/ydb/yoj/repository/ydb/YdbRepositoryIntegrationTest.java
+++ b/repository-ydb-v2/src/test/java/tech/ydb/yoj/repository/ydb/YdbRepositoryIntegrationTest.java
@@ -216,7 +216,7 @@ public String getQuery(String tablespace) {
@Override
public String toDebugString(Object o) {
- return null;
+ return "readYqlListAndMap";
}
@Override
diff --git a/repository-ydb-v2/src/test/java/tech/ydb/yoj/repository/ydb/statement/FindInStatementTest.java b/repository-ydb-v2/src/test/java/tech/ydb/yoj/repository/ydb/statement/FindInStatementTest.java
index 89cc6499..604b74b1 100644
--- a/repository-ydb-v2/src/test/java/tech/ydb/yoj/repository/ydb/statement/FindInStatementTest.java
+++ b/repository-ydb-v2/src/test/java/tech/ydb/yoj/repository/ydb/statement/FindInStatementTest.java
@@ -92,7 +92,7 @@ public void testToDebugString() {
ENTITY_SCHEMA, ENTITY_SCHEMA, IDS, null, null, null
);
- assertThat(statement.toDebugString(IDS)).isNotBlank();
+ assertThat(statement.toDebugString(IDS)).asString().isNotBlank();
}
@Test
@@ -101,7 +101,7 @@ public void testToDebugStringWithOrder() {
ENTITY_SCHEMA, ENTITY_SCHEMA, IDS, null, DEFAULT_ORDER, null
);
- assertThat(statement.toDebugString(IDS)).isNotBlank();
+ assertThat(statement.toDebugString(IDS)).asString().isNotBlank();
}
@Test
diff --git a/repository/src/main/java/tech/ydb/yoj/repository/db/Table.java b/repository/src/main/java/tech/ydb/yoj/repository/db/Table.java
index ae23b01d..9f705a60 100644
--- a/repository/src/main/java/tech/ydb/yoj/repository/db/Table.java
+++ b/repository/src/main/java/tech/ydb/yoj/repository/db/Table.java
@@ -5,6 +5,7 @@
import tech.ydb.yoj.databind.expression.FilterExpression;
import tech.ydb.yoj.databind.expression.OrderExpression;
import tech.ydb.yoj.repository.db.bulk.BulkParams;
+import tech.ydb.yoj.repository.db.internal.TableQueryImpl;
import tech.ydb.yoj.repository.db.list.ListRequest;
import tech.ydb.yoj.repository.db.list.ListResult;
import tech.ydb.yoj.repository.db.list.ViewListResult;
diff --git a/repository/src/main/java/tech/ydb/yoj/repository/db/TxImpl.java b/repository/src/main/java/tech/ydb/yoj/repository/db/TxImpl.java
index 19df3a37..0b0f6086 100644
--- a/repository/src/main/java/tech/ydb/yoj/repository/db/TxImpl.java
+++ b/repository/src/main/java/tech/ydb/yoj/repository/db/TxImpl.java
@@ -11,6 +11,8 @@
import java.util.List;
import java.util.function.Supplier;
+import static tech.ydb.yoj.util.lang.Strings.lazyDebugMsg;
+
final class TxImpl implements Tx {
private static final Logger log = LoggerFactory.getLogger(TxImpl.class);
@@ -79,15 +81,15 @@ private R runImpl(Supplier supplier) {
res = supplier.get();
deferredBeforeCommit.forEach(Runnable::run);
} catch (Throwable t) {
+ var logLines = formatExecutionLogMultiline("! ");
doRollback(isBusinessException(t),
- String.format("[%s] runInTx(): Rollback as inconsistent with business exception %s%s", sw, t, formatExecutionLogMultiline("! ")));
- log.debug("[{}] runInTx(): Rollback due to {}{}", sw, t, formatExecutionLogMultiline("! "), t);
+ lazyDebugMsg("[%s] runInTx(): Rollback as inconsistent with business exception %s%s", sw, t, logLines));
+ log.debug("[{}] runInTx(): Rollback due to {}{}", sw, t, logLines, t);
throw t;
}
if (dryRun) {
- doRollback(true,
- String.format("[%s]" + "runInTx(): Rollback because dry-run transaction read inconsistent data", sw));
+ doRollback(true, lazyDebugMsg("[%s] runInTx(): Rollback because dry-run transaction read inconsistent data", sw));
log.debug("[{}] runInTx(): Rollback due to dry-run mode {}", sw, formatExecutionLogMultiline("# "));
return res;
}
@@ -104,7 +106,7 @@ private R runImpl(Supplier supplier) {
return res;
}
- private void doRollback(boolean isBusinessException, String businessExceptionLogMessage) {
+ private void doRollback(boolean isBusinessException, Object businessExceptionLogMessage) {
try {
// Note that should we catch an InterruptedException from any place other than the transaction methods,
// the transaction will remain in 'executed normally' state so the rollback call will go
@@ -112,7 +114,7 @@ private void doRollback(boolean isBusinessException, String businessExceptionLog
repositoryTransaction.rollback();
} catch (OptimisticLockException optimisticRollbackException) {
if (isBusinessException) {
- log.debug(businessExceptionLogMessage);
+ log.debug("{}", businessExceptionLogMessage);
throw optimisticRollbackException;
}
}
@@ -122,7 +124,7 @@ private boolean isBusinessException(Throwable th) {
return !Interrupts.isInterruptException(th);
}
- private String formatExecutionLogMultiline(String prefix) {
+ private Object formatExecutionLogMultiline(String prefix) {
return repositoryTransaction.getTransactionLocal().log().format(prefix);
}
}
diff --git a/repository/src/main/java/tech/ydb/yoj/repository/db/cache/TransactionLog.java b/repository/src/main/java/tech/ydb/yoj/repository/db/cache/TransactionLog.java
index 48ca43e3..4d5a71b1 100644
--- a/repository/src/main/java/tech/ydb/yoj/repository/db/cache/TransactionLog.java
+++ b/repository/src/main/java/tech/ydb/yoj/repository/db/cache/TransactionLog.java
@@ -3,6 +3,7 @@
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
import tech.ydb.yoj.InternalApi;
+import tech.ydb.yoj.util.function.LazyToString;
import java.util.ArrayList;
import java.util.List;
@@ -11,6 +12,7 @@
import static java.util.stream.Collectors.joining;
import static tech.ydb.yoj.repository.db.cache.TransactionLog.Level.DEBUG;
import static tech.ydb.yoj.repository.db.cache.TransactionLog.Level.INFO;
+import static tech.ydb.yoj.util.lang.Strings.lazyDebugMsg;
@RequiredArgsConstructor
public final class TransactionLog {
@@ -46,7 +48,7 @@ public void info(@NonNull String message, Object... args) {
private void log(@NonNull Level level, @NonNull String message, Object... args) {
if (logLevel.acceptsMessageAt(level)) {
- log0(args.length == 0 ? message : String.format(message, args));
+ log0(args.length == 0 ? message : lazyDebugMsg(message, args));
}
}
@@ -71,8 +73,8 @@ private void log0(@NonNull List> messages) {
}
@InternalApi
- public String format(@NonNull String prefix) {
- return messages.stream().map(l -> "\n " + prefix + l).collect(joining());
+ public Object format(@NonNull String prefix) {
+ return LazyToString.of(() -> messages.stream().map(l -> "\n " + prefix + l).collect(joining()));
}
/**
diff --git a/repository/src/main/java/tech/ydb/yoj/repository/db/internal/RepositoryTransactionImpl.java b/repository/src/main/java/tech/ydb/yoj/repository/db/internal/RepositoryTransactionImpl.java
new file mode 100644
index 00000000..acf8155c
--- /dev/null
+++ b/repository/src/main/java/tech/ydb/yoj/repository/db/internal/RepositoryTransactionImpl.java
@@ -0,0 +1,31 @@
+package tech.ydb.yoj.repository.db.internal;
+
+import com.google.common.base.Stopwatch;
+import tech.ydb.yoj.repository.db.cache.TransactionLog;
+
+import static tech.ydb.yoj.util.lang.Strings.debugResult;
+
+/**
+ * Utility class for {@link tech.ydb.yoj.repository.db.RepositoryTransaction} implementation;
+ * for internal use only.
+ * This class is not part of the public API and should not
+ * be used directly by client code.
+ */
+public final class RepositoryTransactionImpl {
+ public static final Object EMPTY_RESULT = new Object();
+
+ private RepositoryTransactionImpl() {
+ }
+
+ public static void logStatementResult(TransactionLog log, Stopwatch sw, Object action, Object result) {
+ if (result == EMPTY_RESULT) {
+ log.debug("[ %s ] %s", sw, action);
+ } else {
+ log.debug("[ %s ] %s -> %s", sw, action, debugResult(result));
+ }
+ }
+
+ public static void logStatementError(TransactionLog log, Stopwatch sw, Object action, Throwable t) {
+ log.debug("[ %s ] %s => %s", sw, action, t.getClass().getName());
+ }
+}
diff --git a/repository/src/main/java/tech/ydb/yoj/repository/db/TableQueryImpl.java b/repository/src/main/java/tech/ydb/yoj/repository/db/internal/TableQueryImpl.java
similarity index 91%
rename from repository/src/main/java/tech/ydb/yoj/repository/db/TableQueryImpl.java
rename to repository/src/main/java/tech/ydb/yoj/repository/db/internal/TableQueryImpl.java
index 4f3ee950..63573dd5 100644
--- a/repository/src/main/java/tech/ydb/yoj/repository/db/TableQueryImpl.java
+++ b/repository/src/main/java/tech/ydb/yoj/repository/db/internal/TableQueryImpl.java
@@ -1,7 +1,11 @@
-package tech.ydb.yoj.repository.db;
+package tech.ydb.yoj.repository.db.internal;
import com.google.common.collect.Sets;
-import tech.ydb.yoj.InternalApi;
+import tech.ydb.yoj.repository.db.Entity;
+import tech.ydb.yoj.repository.db.EntityExpressions;
+import tech.ydb.yoj.repository.db.EntityIdSchema;
+import tech.ydb.yoj.repository.db.Table;
+import tech.ydb.yoj.repository.db.TableQueryBuilder;
import tech.ydb.yoj.repository.db.cache.FirstLevelCache;
import tech.ydb.yoj.repository.db.list.ListRequest;
@@ -20,7 +24,6 @@
* This class is not part of the public API and should not
* be used directly by client code.
*/
-@InternalApi
public final class TableQueryImpl {
private TableQueryImpl() {
}
diff --git a/repository/src/main/java/tech/ydb/yoj/repository/db/internal/package-info.java b/repository/src/main/java/tech/ydb/yoj/repository/db/internal/package-info.java
new file mode 100644
index 00000000..14a4e25b
--- /dev/null
+++ b/repository/src/main/java/tech/ydb/yoj/repository/db/internal/package-info.java
@@ -0,0 +1,4 @@
+@InternalApi
+package tech.ydb.yoj.repository.db.internal;
+
+import tech.ydb.yoj.InternalApi;
diff --git a/util/src/main/java/tech/ydb/yoj/util/function/LazyToString.java b/util/src/main/java/tech/ydb/yoj/util/function/LazyToString.java
new file mode 100644
index 00000000..9ab154b8
--- /dev/null
+++ b/util/src/main/java/tech/ydb/yoj/util/function/LazyToString.java
@@ -0,0 +1,15 @@
+package tech.ydb.yoj.util.function;
+
+import lombok.RequiredArgsConstructor;
+
+import java.util.function.Supplier;
+
+@RequiredArgsConstructor(staticName = "of")
+public final class LazyToString {
+ private final Supplier supplier;
+
+ @Override
+ public String toString() {
+ return supplier.get();
+ }
+}
diff --git a/util/src/main/java/tech/ydb/yoj/util/lang/Strings.java b/util/src/main/java/tech/ydb/yoj/util/lang/Strings.java
index 78f3e325..7170aeeb 100644
--- a/util/src/main/java/tech/ydb/yoj/util/lang/Strings.java
+++ b/util/src/main/java/tech/ydb/yoj/util/lang/Strings.java
@@ -1,11 +1,14 @@
package tech.ydb.yoj.util.lang;
+import com.google.common.collect.Iterables;
import lombok.NonNull;
+import tech.ydb.yoj.util.function.LazyToString;
import javax.annotation.Nullable;
import java.util.Objects;
import java.util.stream.Stream;
+import static com.google.common.base.Strings.lenientFormat;
import static java.util.stream.Collectors.joining;
public final class Strings {
@@ -27,4 +30,23 @@ public static String removeSuffix(@Nullable String s, @NonNull String suffix) {
public static String leftPad(@NonNull String s, int minLength, char padChar) {
return s.length() >= minLength ? s : String.valueOf(padChar).repeat(minLength - s.length()) + s;
}
+
+ public static Object lazyDebugMsg(String format, Object... args) {
+ return LazyToString.of(() -> lenientFormat(format, args));
+ }
+
+ public static Object debugResult(Object result) {
+ return LazyToString.of(() -> {
+ if (result instanceof Iterable> iterable) {
+ int size = Iterables.size(iterable);
+ return switch (size) {
+ case 0 -> "[]";
+ case 1 -> String.valueOf(iterable.iterator().next());
+ default -> "[" + iterable.iterator().next() + ",...](" + size + ")";
+ };
+ } else {
+ return String.valueOf(result);
+ }
+ });
+ }
}