Skip to content

Commit d56dabc

Browse files
committed
Bug fix: SQL editor/SQL result tabs/marking SQL result tab headers:
Memory and CPU usage was improved in case SQLs where compared disregarding comments line feeds and other white spaces. See menu File --> Global Preferences --> tab SQL --> section "SQL result tab header".
1 parent 86a4f43 commit d56dabc

File tree

6 files changed

+122
-15
lines changed

6 files changed

+122
-15
lines changed

sql12/core/doc/changes.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,11 @@ Table cell data popup now offers find, Xml/Json-reformatting and export function
6565

6666
Bug fixes:
6767

68+
SQL editor/SQL result tabs/marking SQL result tab headers:
69+
Memory and CPU usage was improved in case SQLs where compared
70+
disregarding comments line feeds and other white spaces.
71+
See menu File --> Global Preferences --> tab SQL --> section "SQL result tab header".
72+
6873
https://github.com/squirrel-sql-client/squirrel-sql-code/issues/45#issuecomment-2455169657
6974
Fixed NullPointerException that occurred in some tables.
7075

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
package net.sourceforge.squirrel_sql.client.session.mainpanel.resulttabheader;
2+
3+
import net.sourceforge.squirrel_sql.client.session.ISession;
4+
import net.sourceforge.squirrel_sql.client.session.mainpanel.IResultTab;
5+
import net.sourceforge.squirrel_sql.client.util.codereformat.CodeReformator;
6+
import net.sourceforge.squirrel_sql.client.util.codereformat.CodeReformatorConfigFactory;
7+
import net.sourceforge.squirrel_sql.fw.id.IntegerIdentifier;
8+
9+
import java.util.ArrayList;
10+
import java.util.HashMap;
11+
import java.util.Map;
12+
13+
public class NormalizedSqlCompareCache
14+
{
15+
private CodeReformator _codeReformator;
16+
17+
private int _resultTabCounter = 0;
18+
private int _editorSqlCounter = 0;
19+
20+
private HashMap<IntegerIdentifier, NormalizedSqlCompareCacheEntry> _resultTabIdToEntry = new HashMap<>();
21+
private HashMap<String, NormalizedSqlCompareCacheEntry> _editorSqlToEntry = new HashMap<>();
22+
23+
public String getResultTabSqlNormalized(ISession session, IResultTab sqlResultTab)
24+
{
25+
NormalizedSqlCompareCacheEntry resultTabEntry = _resultTabIdToEntry.get(sqlResultTab.getIdentifier());
26+
27+
if(null == resultTabEntry)
28+
{
29+
resultTabEntry = new NormalizedSqlCompareCacheEntry(getReformator(session).getNormalizedSql(sqlResultTab.getSqlString()), ++_resultTabCounter);
30+
_resultTabIdToEntry.put(sqlResultTab.getIdentifier(), resultTabEntry);
31+
}
32+
33+
return resultTabEntry.getNormalizedSql();
34+
}
35+
36+
public String getEditorSqlNormalized(ISession session, String editorSql)
37+
{
38+
NormalizedSqlCompareCacheEntry editorEntry = _editorSqlToEntry.get(editorSql);
39+
40+
if(null == editorEntry)
41+
{
42+
editorEntry = new NormalizedSqlCompareCacheEntry(getReformator(session).getNormalizedSql(editorSql), ++_editorSqlCounter);
43+
_editorSqlToEntry.put(editorSql, editorEntry);
44+
}
45+
return editorEntry.getNormalizedSql();
46+
}
47+
48+
49+
private CodeReformator getReformator(ISession session)
50+
{
51+
if( null == _codeReformator)
52+
{
53+
_codeReformator = new CodeReformator(CodeReformatorConfigFactory.createConfig(session));
54+
}
55+
56+
doHouseKeeping(_editorSqlToEntry, _editorSqlCounter);
57+
doHouseKeeping(_resultTabIdToEntry, _resultTabCounter);
58+
59+
return _codeReformator;
60+
}
61+
62+
private void doHouseKeeping(HashMap<?, NormalizedSqlCompareCacheEntry> cache, int currentCounter)
63+
{
64+
if(60 > cache.size())
65+
{
66+
return;
67+
}
68+
69+
int minRemainCacheCounter = currentCounter - 40;
70+
71+
ArrayList<Object> resTabKeyToRemove = new ArrayList<>();
72+
73+
for(Map.Entry<?, NormalizedSqlCompareCacheEntry> entry : cache.entrySet())
74+
{
75+
if(minRemainCacheCounter >= entry.getValue().getCountNo())
76+
{
77+
resTabKeyToRemove.add(entry.getKey());
78+
}
79+
}
80+
resTabKeyToRemove.forEach(key -> cache.remove(key));
81+
}
82+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package net.sourceforge.squirrel_sql.client.session.mainpanel.resulttabheader;
2+
3+
public class NormalizedSqlCompareCacheEntry
4+
{
5+
private final String _normalizedSql;
6+
private final int _countNo;
7+
8+
public NormalizedSqlCompareCacheEntry(String normalizedSql, int countNo)
9+
{
10+
_normalizedSql = normalizedSql;
11+
_countNo = countNo;
12+
}
13+
14+
public String getNormalizedSql()
15+
{
16+
return _normalizedSql;
17+
}
18+
19+
public int getCountNo()
20+
{
21+
return _countNo;
22+
}
23+
}

sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/resulttabheader/ResultTabMatchingCurrentSqlHandler.java

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,21 @@
11
package net.sourceforge.squirrel_sql.client.session.mainpanel.resulttabheader;
22

3-
import java.util.ArrayList;
4-
import java.util.Collections;
5-
import java.util.Comparator;
6-
import java.util.List;
7-
import javax.swing.JTabbedPane;
8-
import javax.swing.Timer;
9-
103
import net.sourceforge.squirrel_sql.client.Main;
114
import net.sourceforge.squirrel_sql.client.session.ISQLEntryPanel;
125
import net.sourceforge.squirrel_sql.client.session.editorpaint.TextAreaPaintListener;
136
import net.sourceforge.squirrel_sql.client.session.mainpanel.IResultTab;
147
import net.sourceforge.squirrel_sql.client.session.mainpanel.SQLResultExecutorPanel;
158
import net.sourceforge.squirrel_sql.client.session.sqlbounds.BoundsOfSqlHandler;
16-
import net.sourceforge.squirrel_sql.client.util.codereformat.CodeReformator;
17-
import net.sourceforge.squirrel_sql.client.util.codereformat.CodeReformatorConfigFactory;
189
import net.sourceforge.squirrel_sql.fw.sql.querytokenizer.IQueryTokenizer;
1910
import org.apache.commons.lang3.StringUtils;
2011

12+
import javax.swing.JTabbedPane;
13+
import javax.swing.Timer;
14+
import java.util.ArrayList;
15+
import java.util.Collections;
16+
import java.util.Comparator;
17+
import java.util.List;
18+
2119
public class ResultTabMatchingCurrentSqlHandler
2220
{
2321
private boolean _resultTabHeaderMarkingActive;
@@ -29,6 +27,7 @@ public class ResultTabMatchingCurrentSqlHandler
2927

3028
private Timer _paintTimer;
3129

30+
private NormalizedSqlCompareCache _normalizedSqlCompareCache = new NormalizedSqlCompareCache();
3231

3332
public ResultTabMatchingCurrentSqlHandler(ISQLEntryPanel entryPanel, SQLResultExecutorPanel sqlExecPanel)
3433
{
@@ -93,13 +92,11 @@ private void onTextAreaPaint(boolean activateLastMarked)
9392
}
9493
else
9594
{
96-
CodeReformator cr = new CodeReformator(CodeReformatorConfigFactory.createConfig(_entryPanel.getSession()));
97-
String resultTabSqlNormalized = cr.getNormalizedSql(sqlResultTab.getSqlString());
98-
String sqlToBeExecutedNormalized = cr.getNormalizedSql(qt.nextQuery().getCleanQuery());
95+
String resultTabSqlNormalized = _normalizedSqlCompareCache.getResultTabSqlNormalized(_entryPanel.getSession(), sqlResultTab);
96+
String sqlToBeExecutedNormalized = _normalizedSqlCompareCache.getEditorSqlNormalized(_entryPanel.getSession(), qt.nextQuery().getCleanQuery());
9997

10098
tabMatchesSqlToBeExecuted = StringUtils.equalsIgnoreCase(resultTabSqlNormalized, sqlToBeExecutedNormalized);
10199
}
102-
103100
}
104101
else
105102
{

sql12/core/src/net/sourceforge/squirrel_sql/client/util/codereformat/CodeReformator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -658,7 +658,7 @@ private String flatenWhiteSpaces(String in, boolean force)
658658
return in;
659659
}
660660

661-
StringBuffer ret = new StringBuffer();
661+
StringBuilder ret = new StringBuilder(in.length());
662662
int aposCount = 0;
663663
char lastAppended = '\0';
664664
for (int i = 0; i < in.length(); ++i)

sql12/core/src/net/sourceforge/squirrel_sql/fw/id/IntegerIdentifier.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ public boolean equals(Object rhs)
3838
boolean rc = false;
3939
if (rhs != null && rhs.getClass().equals(getClass()))
4040
{
41-
rc = ((IntegerIdentifier)rhs).toString().equals(toString());
41+
rc = rhs.toString().equals(toString());
4242
}
4343
return rc;
4444
}

0 commit comments

Comments
 (0)