Skip to content

Commit 833a01d

Browse files
avoid quadratic string concatenation in FullTextSearch.toString
1 parent 9663289 commit 833a01d

2 files changed

Lines changed: 25 additions & 3 deletions

File tree

‎src/main/java/net/sf/jsqlparser/expression/operators/relational/FullTextSearch.java‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -75,13 +75,13 @@ public <T, S> T accept(ExpressionVisitor<T> expressionVisitor, S context) {
7575
@Override
7676
public String toString() {
7777
// Build a list of matched columns
78-
String columnsListCommaSeperated = "";
78+
StringBuilder columnsListCommaSeperated = new StringBuilder();
7979
Iterator<Column> iterator = this._matchColumns.iterator();
8080
while (iterator.hasNext()) {
8181
Column col = iterator.next();
82-
columnsListCommaSeperated += col.getFullyQualifiedName();
82+
columnsListCommaSeperated.append(col.getFullyQualifiedName());
8383
if (iterator.hasNext()) {
84-
columnsListCommaSeperated += ",";
84+
columnsListCommaSeperated.append(",");
8585
}
8686
}
8787

‎src/test/java/net/sf/jsqlparser/expression/operators/relational/FullTextSearchExpressionTest.java‎

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,15 @@
99
*/
1010
package net.sf.jsqlparser.expression.operators.relational;
1111

12+
import static org.assertj.core.api.Assertions.assertThat;
13+
import static org.junit.jupiter.api.Assertions.assertTimeoutPreemptively;
14+
15+
import java.time.Duration;
16+
import java.util.ArrayList;
17+
import java.util.List;
1218
import net.sf.jsqlparser.JSQLParserException;
19+
import net.sf.jsqlparser.expression.StringValue;
20+
import net.sf.jsqlparser.schema.Column;
1321
import net.sf.jsqlparser.test.TestUtils;
1422
import org.junit.jupiter.api.Test;
1523

@@ -35,4 +43,18 @@ public void testIssue1223() throws JSQLParserException {
3543
+ "full_text desc",
3644
true);
3745
}
46+
47+
@Test
48+
public void testToStringIsLinearInMatchColumns() {
49+
List<Column> columns = new ArrayList<>();
50+
for (int i = 0; i < 200_000; i++) {
51+
columns.add(new Column("c" + i));
52+
}
53+
FullTextSearch fullTextSearch = new FullTextSearch()
54+
.withMatchColumns(new ExpressionList<>(columns))
55+
.withAgainstValue(new StringValue("x"));
56+
57+
String sql = assertTimeoutPreemptively(Duration.ofSeconds(2), fullTextSearch::toString);
58+
assertThat(sql).startsWith("MATCH (c0,c1,").endsWith(",c199999) AGAINST ('x')");
59+
}
3860
}

0 commit comments

Comments
 (0)