Skip to content

Commit d61c1f4

Browse files
committed
Feature: SQL result and table, sum display for numerical columns:
The dialog opened by the "more ..." button now offers to show means and deviations of the selection.
1 parent 6af0006 commit d61c1f4

File tree

11 files changed

+332
-18
lines changed

11 files changed

+332
-18
lines changed

sql12/core/doc/changes.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@ Not yet released, available in our GIT repository, snapshots and future releases
66

77
Enhancements:
88

9+
SQL result and table, sum display for numerical columns:
10+
The dialog opened by the "more ..." button now offers to show means and deviations of the selection.
11+
912
SQL result and table export to CSV files:
1013
New info button behind the CSV radio button informs about the way the export handles
1114
values containing the separator character, line breaks, double quotes.

sql12/core/src/net/sourceforge/squirrel_sql/client/resources/SquirrelResources.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,8 @@ public interface IImageNames
6363
String SPLASH_SCREEN = "SplashScreen";
6464
String SPLASH_SCREEN_LESS_HIGH = "SplashScreenLessHigh";
6565

66+
String PIC_MEAN_DEVIATION_DEFINITION = "MeanDeviationDefinition";
67+
6668

6769
String VIEW = "View";
6870

26.2 KB
Loading

sql12/core/src/net/sourceforge/squirrel_sql/client/resources/squirrel.properties

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,8 @@ run_all.image=eclipse/active/run_all.png
198198

199199
pinned.image=pinned.png
200200

201+
MeanDeviationDefinition.image=pics/MeanDeviationDefinition.png
202+
201203
########
202204
# Configuration information for ObjectTreeInternalFrame.
203205
########

sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/rowcolandsum/Calculator.java

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

3-
import java.sql.Types;
4-
import java.util.ArrayList;
5-
63
import net.sourceforge.squirrel_sql.fw.datasetviewer.ColumnDisplayDefinition;
74
import net.sourceforge.squirrel_sql.fw.datasetviewer.DataSetViewerTable;
85
import net.sourceforge.squirrel_sql.fw.datasetviewer.ExtTableColumn;
96
import net.sourceforge.squirrel_sql.fw.sql.ResultSetReader;
107

8+
import java.sql.Types;
9+
import java.util.ArrayList;
10+
1111
public class Calculator
1212
{
1313
static ArrayList<SumAndColumn> calculateSums(DataSetViewerTable table)
@@ -32,6 +32,48 @@ static ArrayList<SumAndColumn> calculateSums(DataSetViewerTable table)
3232
return sums;
3333
}
3434

35+
public static ArrayList<MeanAndColumn> calculateMeans(DataSetViewerTable table)
36+
{
37+
int[] selectedColumns = table.getSelectedColumns();
38+
39+
int[] selectedRows = table.getSelectedRows();
40+
41+
ArrayList<MeanAndColumn> means = new ArrayList<>();
42+
43+
for (int selectedColumn : selectedColumns)
44+
{
45+
MeanAndColumn meanAndCol = createMeanAndColumn(table, selectedRows, selectedColumn);
46+
47+
if (null != meanAndCol)
48+
{
49+
means.add(meanAndCol);
50+
}
51+
52+
}
53+
return means;
54+
}
55+
56+
public static ArrayList<DeviationAndColumn> calculateDeviations(DataSetViewerTable table)
57+
{
58+
int[] selectedColumns = table.getSelectedColumns();
59+
60+
int[] selectedRows = table.getSelectedRows();
61+
62+
ArrayList<DeviationAndColumn> deviations = new ArrayList<>();
63+
64+
for (int selectedColumn : selectedColumns)
65+
{
66+
DeviationAndColumn meanAndCol = createDeviationAndColumn(table, selectedRows, selectedColumn);
67+
68+
if (null != meanAndCol)
69+
{
70+
deviations.add(meanAndCol);
71+
}
72+
73+
}
74+
return deviations;
75+
}
76+
3577
public static SumAndColumn calculateFirstSum(DataSetViewerTable table)
3678
{
3779
int selectedColumn = table.getSelectedColumn();
@@ -92,6 +134,97 @@ else if(isReal(columnDisplayDefinition))
92134
return sumAndCol;
93135
}
94136

137+
private static MeanAndColumn createMeanAndColumn(DataSetViewerTable table, int[] selectedRows, int selectedColumn)
138+
{
139+
if(false == table.getColumnModel().getColumn(selectedColumn) instanceof ExtTableColumn)
140+
{
141+
return null;
142+
}
143+
144+
ExtTableColumn column = (ExtTableColumn) table.getColumnModel().getColumn(selectedColumn);
145+
146+
ColumnDisplayDefinition columnDisplayDefinition = column.getColumnDisplayDefinition();
147+
148+
MeanAndColumn meanAndColumn = null;
149+
150+
if(isIntegral(columnDisplayDefinition) || isReal(columnDisplayDefinition))
151+
{
152+
double sum = getSumAsDouble(table, selectedRows, selectedColumn);
153+
154+
double mean;
155+
if(0 == selectedRows.length)
156+
{
157+
mean = 0;
158+
}
159+
else
160+
{
161+
mean = sum / (double) selectedRows.length;
162+
}
163+
164+
meanAndColumn = new MeanAndColumn(columnDisplayDefinition, mean);
165+
}
166+
167+
return meanAndColumn;
168+
}
169+
170+
private static DeviationAndColumn createDeviationAndColumn(DataSetViewerTable table, int[] selectedRows, int selectedColumn)
171+
{
172+
if(false == table.getColumnModel().getColumn(selectedColumn) instanceof ExtTableColumn)
173+
{
174+
return null;
175+
}
176+
177+
ExtTableColumn column = (ExtTableColumn) table.getColumnModel().getColumn(selectedColumn);
178+
179+
ColumnDisplayDefinition columnDisplayDefinition = column.getColumnDisplayDefinition();
180+
181+
DeviationAndColumn deviationAndColumn = null;
182+
183+
if(isIntegral(columnDisplayDefinition) || isReal(columnDisplayDefinition))
184+
{
185+
double sum = getSumAsDouble(table, selectedRows, selectedColumn);
186+
double mean = sum / selectedRows.length;
187+
188+
double deviationSquaredSum = 0;
189+
for (int selectedRow : selectedRows)
190+
{
191+
Number number = (Number) table.getValueAt(selectedRow, selectedColumn);
192+
if (null != number)
193+
{
194+
deviationSquaredSum += (mean - number.doubleValue()) * (mean - number.doubleValue());
195+
}
196+
}
197+
198+
double deviation;
199+
if(2 > selectedRows.length)
200+
{
201+
deviation = 0;
202+
}
203+
else
204+
{
205+
deviation = Math.sqrt(deviationSquaredSum / (selectedRows.length - 1));
206+
}
207+
208+
deviationAndColumn = new DeviationAndColumn(columnDisplayDefinition, deviation);
209+
}
210+
211+
return deviationAndColumn;
212+
}
213+
214+
private static double getSumAsDouble(DataSetViewerTable table, int[] selectedRows, int selectedColumn)
215+
{
216+
double sum = 0;
217+
for (int selectedRow : selectedRows )
218+
{
219+
Number number = (Number) table.getValueAt(selectedRow, selectedColumn);
220+
if (null != number)
221+
{
222+
sum += number.doubleValue();
223+
}
224+
}
225+
return sum;
226+
}
227+
95228
/**
96229
* See {@link ResultSetReader#doRead()} and {@link ResultSetReader#doContentTabRead()}.
97230
*/
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package net.sourceforge.squirrel_sql.client.session.mainpanel.rowcolandsum;
2+
3+
import net.sourceforge.squirrel_sql.fw.datasetviewer.ColumnDisplayDefinition;
4+
5+
public class DeviationAndColumn
6+
{
7+
private ColumnDisplayDefinition _columnDisplayDefinition;
8+
private Double _deviation;
9+
10+
public DeviationAndColumn(ColumnDisplayDefinition columnDisplayDefinition, double deviation)
11+
{
12+
_columnDisplayDefinition = columnDisplayDefinition;
13+
_deviation = deviation;
14+
}
15+
16+
public ColumnDisplayDefinition getColumnDisplayDefinition()
17+
{
18+
return _columnDisplayDefinition;
19+
}
20+
21+
22+
public Double getDeviation()
23+
{
24+
return _deviation;
25+
}
26+
}

sql12/core/src/net/sourceforge/squirrel_sql/client/session/mainpanel/rowcolandsum/FunctionController.java

Lines changed: 53 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,48 +3,56 @@
33
import net.sourceforge.squirrel_sql.fw.datasetviewer.ColumnDisplayDefinition;
44
import net.sourceforge.squirrel_sql.fw.datasetviewer.DataSetException;
55
import net.sourceforge.squirrel_sql.fw.datasetviewer.DataSetViewerTable;
6-
import net.sourceforge.squirrel_sql.fw.datasetviewer.DataSetViewerTablePanel;
76
import net.sourceforge.squirrel_sql.fw.datasetviewer.SimpleDataSet;
87
import net.sourceforge.squirrel_sql.fw.gui.GUIUtils;
8+
import net.sourceforge.squirrel_sql.fw.props.Props;
99
import net.sourceforge.squirrel_sql.fw.util.StringManager;
1010
import net.sourceforge.squirrel_sql.fw.util.StringManagerFactory;
1111
import net.sourceforge.squirrel_sql.fw.util.Utilities;
1212

13-
import javax.swing.JDialog;
1413
import javax.swing.JPanel;
15-
import javax.swing.JScrollPane;
1614
import javax.swing.WindowConstants;
17-
import java.awt.GridLayout;
1815
import java.util.ArrayList;
1916
import java.util.stream.Collectors;
2017

2118
public class FunctionController
2219
{
2320
private static final StringManager s_stringMgr = StringManagerFactory.getStringManager(FunctionController.class);
21+
22+
public static final String PREFS_KEY_MEAN_CHECKED = "FunctionController.mean.checked";
23+
public static final String PREFS_KEY_DEVIATION_CHECKED = "FunctionController.deviation.checked";
24+
2425
private FunctionDialog _dlg;
25-
private final DataSetViewerTablePanel _functionValuesTablePanel;
26+
private DataSetViewerTable _currentTableToSum;
2627

2728
public FunctionController(JPanel parent)
2829
{
2930
_dlg = new FunctionDialog(GUIUtils.getOwningFrame(parent), s_stringMgr.getString("FunctionController.title"));
3031

3132
_dlg.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
3233

33-
_dlg.getContentPane().setLayout(new GridLayout(1,1));
34-
35-
_functionValuesTablePanel = new DataSetViewerTablePanel();
36-
_functionValuesTablePanel.init(null, null);
37-
38-
_dlg.getContentPane().add(new JScrollPane(_functionValuesTablePanel.getComponent()));
39-
34+
_dlg.chkMean.setSelected(Props.getBoolean(PREFS_KEY_MEAN_CHECKED, false));
35+
_dlg.chkDeviation.setSelected(Props.getBoolean(PREFS_KEY_DEVIATION_CHECKED, false));
36+
_dlg.chkMean.addActionListener(e -> onCheckMean());
37+
_dlg.chkDeviation.addActionListener(e -> onCheckDeviation());
4038

4139
GUIUtils.enableCloseByEscape(_dlg);
4240

4341
GUIUtils.initLocation(_dlg, 250, 150);
4442

4543
_dlg.setVisible(true);
44+
}
4645

46+
private ArrayList<SumAndColumn> onCheckDeviation()
47+
{
48+
Props.putBoolean(PREFS_KEY_DEVIATION_CHECKED, _dlg.chkDeviation.isSelected());
49+
return update(_currentTableToSum);
50+
}
4751

52+
private ArrayList<SumAndColumn> onCheckMean()
53+
{
54+
Props.putBoolean(PREFS_KEY_MEAN_CHECKED, _dlg.chkMean.isSelected());
55+
return update(_currentTableToSum);
4856
}
4957

5058
public boolean isDisposed()
@@ -62,26 +70,57 @@ public ArrayList<SumAndColumn> update(DataSetViewerTable table)
6270
{
6371
try
6472
{
73+
if(null == table)
74+
{
75+
return new ArrayList<>();
76+
}
77+
78+
_currentTableToSum = table;
79+
6580
ArrayList<SumAndColumn> sums = Calculator.calculateSums(table);
81+
ArrayList<MeanAndColumn> means = Calculator.calculateMeans(table);
82+
ArrayList<DeviationAndColumn> deviations = Calculator.calculateDeviations(table);
6683

6784
ArrayList<ColumnDisplayDefinition> columns = new ArrayList<>();
6885
columns.add(new ColumnDisplayDefinition(10, s_stringMgr.getString("FunctionController.function")));
6986
columns.addAll(sums.stream().map( s -> s.getColumnDisplayDefinition()).collect(Collectors.toList()));
7087

7188

7289
ArrayList<Object[]> rows = new ArrayList<>();
73-
Object[] sumRow = new Object[sums.size() + 1];
7490

91+
Object[] sumRow = new Object[sums.size() + 1];
7592
sumRow[0] = s_stringMgr.getString("FunctionController.sums");
7693
for (int i = 0; i < sums.size(); i++)
7794
{
7895
sumRow[i+1] = sums.get(i).getSum();
7996
}
8097
rows.add(sumRow);
8198

99+
if(_dlg.chkMean.isSelected())
100+
{
101+
Object[] meanRow = new Object[sums.size() + 1];
102+
meanRow[0] = s_stringMgr.getString("FunctionController.mean");
103+
for (int i = 0; i < means.size(); i++)
104+
{
105+
meanRow[i+1] = means.get(i).getMean();
106+
}
107+
rows.add(meanRow);
108+
}
109+
110+
if(_dlg.chkDeviation.isSelected())
111+
{
112+
Object[] deviationRow = new Object[sums.size() + 1];
113+
deviationRow[0] = s_stringMgr.getString("FunctionController.deviation");
114+
for (int i = 0; i < deviations.size(); i++)
115+
{
116+
deviationRow[i+1] = deviations.get(i).getDeviation();
117+
}
118+
rows.add(deviationRow);
119+
}
120+
82121
SimpleDataSet simpleDataSet = new SimpleDataSet(rows, columns.toArray(new ColumnDisplayDefinition[0]));
83122

84-
_functionValuesTablePanel.show(simpleDataSet);
123+
_dlg.functionValuesTablePanel.show(simpleDataSet);
85124

86125
return sums;
87126
}

0 commit comments

Comments
 (0)