diff --git a/src/DataViewScreen.java b/src/DataViewScreen.java index 3919bafa3a5d80812a2ae857a47f3e5953f425d6..2af91004e3bd7b2319136cf06d1526347753ca11 100644 --- a/src/DataViewScreen.java +++ b/src/DataViewScreen.java @@ -21,6 +21,7 @@ import javafx.scene.text.Text; import javafx.stage.Stage; import javafx.util.Pair; +import java.lang.management.GarbageCollectorMXBean; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -80,16 +81,11 @@ public class DataViewScreen { private HBox metricBox = new HBox(); private AnchorPane bottomOfUI = new AnchorPane(); private HBox dropDowns = new HBox(); - private VBox multiGraphs = new VBox(); - // #justChartThings - private ArrayList<Series> series_line = new ArrayList<Series>(); - private LineChart linechart; - private PieChart piechart; - final Axis xAxis = new NumberAxis(); - final Axis yAxis = new NumberAxis(); + // #justChartThings + private GraphManager graphManager; //lists of things to change fontSize on @@ -113,6 +109,8 @@ public class DataViewScreen { this.qry_exec = qry_exec; fileSelectScene = stage.getScene(); + this.graphManager = new GraphManager(); + //this.menuBarHandler = menuBarHandler; buttonSetup(); @@ -220,6 +218,8 @@ public class DataViewScreen { uiDivider.setLeft(metrics); uiDivider.setCenter(filtersNGraphs); uiDivider.setBottom(bottomOfUI); + + filtersNGraphs.getChildren().addAll(filterBox, graphManager); } @@ -278,7 +278,7 @@ public class DataViewScreen { // Function defining update by changing metric private void metricUpdate(RadioButton selected){ String granularity = granularitySelect.getSelectionModel().getSelectedItem(); - String metricText, metricTextMale, metricTextFemale; + String metricText = "", metricTextMale = "", metricTextFemale = ""; appliedFilters.setText("No filters applied."); currentFilter = "No Filter"; @@ -287,38 +287,40 @@ public class DataViewScreen { Thread t = null; - if (selected == imprnsBtn){ + graphManager.clear(); - metricText = "Number of impressions is "+ qry_exec.executeQuery("Impressions", granularity).get(0).get(0)[0]; - metricTextMale = ""; - metricTextFemale = ""; - Series metric3 = new Series(); - metric3.setName("Impressions per day"); + if (selected == imprnsBtn){ + var queryResult = qry_exec.executeQuery("Impressions", granularity); + metricText = "Number of impressions is " + queryResult.get(0).get(0)[0]; List<String[]> l1 = qry_exec.executeQuery("Impressions", granularity).get(1); - int i = 0; - while(i<l1.size()){ - metric3.getData().add(new XYChart.Data(l1.get(i)[0], Integer.parseInt(l1.get(i)[1]))); - i++; - - } - series_line = new ArrayList<Series>(){ - { - add(metric3); - } - }; - - Axis x = new CategoryAxis(); - x.setLabel("Day"); - yAxis.setLabel("Number of impressions"); - - - setLineChart(buildLineChart(series_line, x, yAxis, "Impressions per day")); +// Series metric3 = new Series(); +// metric3.setName("Impressions per day"); +// +// for(var x : l1){ +// metric3.getData().add(new XYChart.Data(x[0], Integer.parseInt(x[1]))); +// } +// +// ArrayList<Series> series_line = new ArrayList<Series>(){ +// { +// add(metric3); +// } +// }; +// +// Axis x = new CategoryAxis(); +// Axis yAxis = new NumberAxis(); +// x.setLabel("Day"); +// yAxis.setLabel("Number of impressions"); +// +// +// setLineChart(buildLineChart(series_line, x, yAxis, "Impressions per day")); + graphManager.createGraph(graphManager.resultToMetric(l1), "Impressions", granularity); filterSelect.getSelectionModel().clearSelection(); } else if(selected == clicks){ - metricText = "Number of clicks is " + qry_exec.executeQuery("Clicks", granularity).get(0).get(0)[0]; + var queryResult = qry_exec.executeQuery("Clicks", granularity); + metricText = "Number of clicks is " + queryResult.get(0).get(0)[0]; int maleCount = Integer.parseInt(qry_exec.executeQuery("Clicks", "gender","Male", granularity).get(0).get(0)[0]); int femaleCount = Integer.parseInt(qry_exec.executeQuery("Clicks", "gender","Female", granularity).get(0).get(0)[0]); int totalClicks = maleCount + femaleCount; @@ -332,42 +334,24 @@ public class DataViewScreen { Series metric3 = new Series(); metric3.setName("Clicks per day"); - multiGraphs.getChildren().clear(); - multiGraphs.setSpacing(10); - filtersNGraphs.getChildren().clear(); - filtersNGraphs.getChildren().addAll(filterBox, multiGraphs); - filtersNGraphs.setHgrow(multiGraphs, Priority.ALWAYS); // Resize chart - List<String[]> l1 = qry_exec.executeQuery("Clicks", granularity).get(1); - int i =0; - while(i<l1.size()){ - metric3.getData().add(new XYChart.Data(l1.get(i)[0], Integer.parseInt(l1.get(i)[1]))); - i++; - //indexOfDate++; +// multiGraphs.getChildren().clear(); +// multiGraphs.setSpacing(10); +// filtersNGraphs.setHgrow(multiGraphs, Priority.ALWAYS); // Resize chart - } - series_line = new ArrayList<Series>(){ - { - add(metric3); - } - }; + List<String[]> l1 = queryResult.get(1); - Axis x = new CategoryAxis(); - x.setLabel("Day"); - NumberAxis y = new NumberAxis(); - y.setLabel("Number of clicks"); + graphManager.createGraph(graphManager.resultToMetric(l1), "Clicks", granularity); - LineChart lineChart = buildLineChart(series_line, x, y, "Clicks per day"); - multiGraphs.setVgrow(lineChart, Priority.ALWAYS); - multiGraphs.getChildren().add(lineChart); +// multiGraphs.setVgrow(lineChart, Priority.ALWAYS); +// multiGraphs.getChildren().add(lineChart); inUse = clicks; t = new Thread( () -> { List < String[]>results = qry_exec.executeQuery("Clicks", "age groups", 2, granularity); - // Pie Chart ArrayList<PieChart.Data> data = new ArrayList<PieChart.Data>() { { results.forEach(x -> @@ -375,11 +359,11 @@ public class DataViewScreen { ); } }; - piechart = buildPieChart(data, "Clicks by age ranges"); + PieChart piechart = graphManager.buildPieChart(data, "Clicks by age ranges"); if (inUse == clicks) Platform.runLater( () ->{ - setMultiChart(piechart, lineChart); + graphManager.addPieChart(piechart);//setMultiChart(piechart, lineChart); } ); @@ -389,45 +373,41 @@ public class DataViewScreen { } else if(selected == uniqueUsrs){ - metricText = "Number of unique users is "+qry_exec.executeQuery("Unique Users", granularity).get(0).get(0)[0]; - metricTextMale = ""; - metricTextFemale = ""; - - Series metric3 = new Series(); - metric3.setName("Unique users per day"); - List<String[]> l1 = qry_exec.executeQuery("Unique Users", granularity).get(1); - int i =0; - while(i<l1.size()){ - metric3.getData().add(new XYChart.Data(l1.get(i)[0], Integer.parseInt(l1.get(i)[1]))); - i++; - - } - series_line = new ArrayList<Series>(){ - { - add(metric3); - } - }; - - Axis x = new CategoryAxis(); - x.setLabel("Day"); - yAxis.setLabel("Number of unique users"); - setLineChart(buildLineChart(series_line, x, yAxis, "Unique users per day")); + var queryResult = qry_exec.executeQuery("Unique Users", granularity); + metricText = "Number of unique users is " + queryResult.get(0).get(0)[0]; + List<String[]> l1 = queryResult.get(1); + +// Series metric3 = new Series(); +// metric3.setName("Unique users per day"); +// +// int i =0; +// while(i<l1.size()){ +// metric3.getData().add(new XYChart.Data(l1.get(i)[0], Integer.parseInt(l1.get(i)[1]))); +// i++; +// +// } +// series_line = new ArrayList<Series>(){ +// { +// add(metric3); +// } +// }; +// +// Axis x = new CategoryAxis(); +// x.setLabel("Day"); +// yAxis.setLabel("Number of unique users"); +// setLineChart(buildLineChart(series_line, x, yAxis, "Unique users per day")); + graphManager.createGraph(graphManager.resultToMetric(l1), "Unique users", granularity); filterSelect.getSelectionModel().clearSelection(); } else if (selected == conversions){ - filtersNGraphs.getChildren().clear(); - filtersNGraphs.getChildren().addAll(filterBox); + graphManager.clear(); metricText = "Not yet implemented."; - metricTextMale = ""; - metricTextFemale = ""; } else if(selected== cost){ - filtersNGraphs.getChildren().clear(); - filtersNGraphs.getChildren().addAll(filterBox); +// filtersNGraphs.getChildren().clear(); +// filtersNGraphs.getChildren().addAll(filterBox); metricText = "Calculating total cost..."; - metricTextMale = ""; - metricTextFemale = ""; t = new Thread( () -> { List<List<String[]>> result = qry_exec.executeQuery("Total Cost", granularity); @@ -436,28 +416,18 @@ public class DataViewScreen { metricDisplay.setText("Total cost is " + result.get(0).get(0)[0]); metricDisplayMale.setText(""); metricDisplayFemale.setText(""); - Series metric3 = new Series(); - metric3.setName("Total cost per day"); + + Series metric = new Series(); + metric.setName("Total cost per day"); List<String[]> l1 = result.get(1); int i = 0; double cumulativeCost=0; - while (i < l1.size()) { - cumulativeCost=cumulativeCost+Double.parseDouble(l1.get(i)[1]); - metric3.getData().add(new XYChart.Data(l1.get(i)[0], cumulativeCost)); - //metric3.getData().add(new XYChart.Data(l1.get(i)[0], Double.parseDouble(l1.get(i)[1]))); - i++; - + for(var x : l1){ + cumulativeCost=cumulativeCost+Double.parseDouble(x[1]); + metric.getData().add(new XYChart.Data(x[0], cumulativeCost)); } - series_line = new ArrayList<Series>() { - { - add(metric3); - } - }; - Axis x = new CategoryAxis(); - x.setLabel("Day"); - yAxis.setLabel("cost in pence"); - setLineChart(buildLineChart(series_line, x, yAxis, "Total cost per day")); + graphManager.createGraph(metric, "Total Cost", granularity); } ); } @@ -466,10 +436,7 @@ public class DataViewScreen { filterSelect.getSelectionModel().clearSelection(); } else if (selected == bounces){ - metricText = "Loading bounces..."; - metricTextFemale = ""; - metricTextMale = ""; final HBox bounceRateBox = new HBox(); bounceRateLabel = new Label("Calculating bounce rate..."); @@ -483,12 +450,9 @@ public class DataViewScreen { filterBox.getChildren().clear(); filterBox.getChildren().addAll(new Text("Filters"), filterSelect, appliedFilters, metricBox, bounceRateBox); - multiGraphs.getChildren().clear(); - multiGraphs.setSpacing(10); + graphManager.clear(); - filtersNGraphs.getChildren().clear(); - filtersNGraphs.getChildren().addAll(filterBox, multiGraphs); - filtersNGraphs.setHgrow(multiGraphs, Priority.ALWAYS); // Resize chart + filtersNGraphs.setHgrow(graphManager, Priority.ALWAYS); // Resize chart // Bounces thread Thread bounce_t = new Thread ( @@ -496,9 +460,8 @@ public class DataViewScreen { Integer bounces = Integer.valueOf(qry_exec.executeQuery("Bounces", granularity).get(0).get(0)[0]); Integer totalClicks = Integer.valueOf(qry_exec.executeQuery("Clicks", granularity).get(0).get(0)[0]); Platform.runLater( - () -> { - metricDisplay.setText("Number of bounces: "+ bounces); + metricDisplay.setText("Number of bounces: " + bounces); // Pie Chart ArrayList<PieChart.Data> data = new ArrayList<PieChart.Data>(){ @@ -507,9 +470,8 @@ public class DataViewScreen { add(new PieChart.Data("Normal clicks", totalClicks-bounces)); } }; - piechart = buildPieChart(data, "Proportion of bounces"); - multiGraphs.setVgrow(piechart, Priority.ALWAYS); - multiGraphs.getChildren().add(piechart); + PieChart piechart = graphManager.buildPieChart(data, "Proportion of bounces"); + graphManager.addPieChart(piechart); } ); } @@ -518,12 +480,12 @@ public class DataViewScreen { // Bounce rate thread Thread rate_t = new Thread ( () ->{ - Double bounceRate = Double.valueOf(qry_exec.executeQuery("Bounces", "bounce rate",1, granularity).get(0)[0]); + Double bounceRate = Double.valueOf(qry_exec.executeQuery("Bounces", "bounce rate",1, granularity).get(0)[0]); List<String[]> bouncesPerDay = qry_exec.executeQuery("Bounces", granularity).get(1); List<String[]> clicksPerDay = qry_exec.executeQuery("Clicks", granularity).get(1); Platform.runLater( () -> { - bounceRateLabel.setText("Bounce rate: "+ bounceRate); + bounceRateLabel.setText("Bounce rate: " + bounceRate); Series metric = new Series(); metric.setName("Bounce rate per day"); @@ -532,20 +494,10 @@ public class DataViewScreen { double avg = (Double.parseDouble(bouncesPerDay.get(i)[1])) / (Double.parseDouble(clicksPerDay.get(i)[1])); metric.getData().add(new XYChart.Data(bouncesPerDay.get(i)[0], avg)); i++; - } - series_line = new ArrayList<Series>(){ - { - add(metric); - } - }; - - Axis x = new CategoryAxis(); - x.setLabel("Day"); - yAxis.setLabel("Bounce rate"); - - multiGraphs.setVgrow(buildLineChart(series_line, x, yAxis, "Bounce rate per day"), Priority.ALWAYS); - multiGraphs.getChildren().addAll(buildLineChart(series_line, x, yAxis, "Bounce rate per day")); + graphManager.createGraph(metric, "Bounce rate", granularity); +// multiGraphs.setVgrow(buildLineChart(series_line, x, yAxis, "Bounce rate per day"), Priority.ALWAYS); +// multiGraphs.getChildren().addAll(buildLineChart(series_line, x, yAxis, "Bounce rate per day")); } ); } @@ -558,16 +510,12 @@ public class DataViewScreen { } catch (InterruptedException e) { e.printStackTrace(); } - } else if (selected == cpc){ inUse = cpc; - filtersNGraphs.getChildren().clear(); - filtersNGraphs.getChildren().addAll(filterBox); + graphManager.clear(); metricText = "Calculating cost-per-click..."; - metricTextMale = ""; - metricTextFemale = ""; t = new Thread( () -> { Series metric3 = new Series(); @@ -580,20 +528,7 @@ public class DataViewScreen { metricDisplayMale.setText(""); metricDisplayFemale.setText(""); - for(String[] record : result.get(1)){ - metric3.getData().add(new XYChart.Data(record[0], Double.parseDouble(record[1]))); - } - - series_line = new ArrayList<Series>(){ - { - add(metric3); - } - }; - - Axis x = new CategoryAxis(); - x.setLabel("Day"); - yAxis.setLabel("CPC in pence"); - setLineChart(buildLineChart(series_line, x, yAxis, "Cost per click over the campaign")); + graphManager.createGraph(graphManager.resultToMetric(result.get(1)), "Cost per click", granularity); } ); } @@ -602,15 +537,9 @@ public class DataViewScreen { filterSelect.getSelectionModel().clearSelection(); } else if (selected == cpa) { - //List<String[]> totalImpCostPerDay = dbc.dbQuery(SQLCommands.totalImpressionCostPerDates,2); - //List<String[]> totalClickCostPerDay = dbc.dbQuery(SQLCommands.totalClickCostPerDates,2); - //List<String[]> totalConversionsPerDay = dbc.dbQuery(SQLCommands.totalConversionsPerDates,2); inUse = cpa; - filtersNGraphs.getChildren().clear(); - filtersNGraphs.getChildren().addAll(filterBox); + graphManager.clear(); metricText = "Calculating cost-per-acquisition..."; - metricTextMale = ""; - metricTextFemale = ""; t = new Thread( () -> { Series metric = new Series(); @@ -623,9 +552,6 @@ public class DataViewScreen { metricDisplayMale.setText(""); metricDisplayFemale.setText(""); - double convEntireTotal = 0.0; - double costEntireTotal = 0.0; - /* for (String[] convEntry : totalConversionsPerDay) { // manually joining the data String date = convEntry[0]; // fuck you sql this is your fault @@ -652,7 +578,6 @@ public class DataViewScreen { } metricText += Double.toString(costEntireTotal / convEntireTotal) + " pence"; - */ for (String[] record : result.get(1)) { metric.getData().add(new XYChart.Data(record[0], Double.parseDouble(record[1]))); @@ -666,6 +591,9 @@ public class DataViewScreen { x.setLabel("Day"); yAxis.setLabel("CPA"); setLineChart(buildLineChart(series_line, x, yAxis, "Cost-per-Acquisition")); + */ + + graphManager.createGraph(graphManager.resultToMetric(result.get(1)), "Cost per Acquistion", granularity); } ); } @@ -676,11 +604,8 @@ public class DataViewScreen { else if (selected == ctr) { inUse = ctr; - filtersNGraphs.getChildren().clear(); - filtersNGraphs.getChildren().addAll(filterBox); + graphManager.clear(); metricText = "Calculating click-through-rate..."; - metricTextMale = ""; - metricTextFemale = ""; t = new Thread( () -> { Series metric = new Series(); @@ -693,21 +618,23 @@ public class DataViewScreen { metricDisplayMale.setText(""); metricDisplayFemale.setText(""); - for(String[] record : result.get(1)){ - metric.getData().add(new XYChart.Data(record[0], Double.parseDouble(record[1]))); - } - - - series_line = new ArrayList<Series>(){ - { - add(metric); - } - }; - - Axis x = new CategoryAxis(); - x.setLabel("Day"); - yAxis.setLabel("CTR"); - setLineChart(buildLineChart(series_line, x, yAxis, "Click Through Rate over the campaign")); + graphManager.createGraph(graphManager.resultToMetric(result.get(1)), "Click through rate", granularity); + +// for(String[] record : result.get(1)){ +// metric.getData().add(new XYChart.Data(record[0], Double.parseDouble(record[1]))); +// } +// +// +// series_line = new ArrayList<Series>(){ +// { +// add(metric); +// } +// }; +// +// Axis x = new CategoryAxis(); +// x.setLabel("Day"); +// yAxis.setLabel("CTR"); +// setLineChart(buildLineChart(series_line, x, yAxis, "Click Through Rate over the campaign")); } ); } @@ -716,24 +643,17 @@ public class DataViewScreen { filterSelect.getSelectionModel().clearSelection(); } else if (selected == cpm){ - filtersNGraphs.getChildren().clear(); - filtersNGraphs.getChildren().addAll(filterBox); + graphManager.clear(); metricText = "Not yet implemented."; - metricTextMale = ""; - metricTextFemale = ""; } else if (selected == null){ // Used on graph reset // No actions needed metricText = ""; - metricTextFemale = ""; - metricTextMale = ""; } else{ metricText = selected.getText(); - metricTextFemale = ""; - metricTextMale = ""; filterSelect.getSelectionModel().clearSelection(); } @@ -819,49 +739,6 @@ public class DataViewScreen { appliedFilters.setText("Applied filter:\n\n- "+filter); } - - /* - @desc - populates two series' with test data - @return - a pair of series containing the test data - */ - private Pair<Series, Series> createTestSeriesData() { - Series metric1 = new Series(); - metric1.setName("Metric 1"); - //populating the series with data - metric1.getData().add(new XYChart.Data(1, 23)); - metric1.getData().add(new XYChart.Data(2, 14)); - metric1.getData().add(new XYChart.Data(3, 15)); - metric1.getData().add(new XYChart.Data(4, 24)); - metric1.getData().add(new XYChart.Data(5, 34)); - metric1.getData().add(new XYChart.Data(6, 36)); - metric1.getData().add(new XYChart.Data(7, 22)); - metric1.getData().add(new XYChart.Data(8, 45)); - metric1.getData().add(new XYChart.Data(9, 43)); - metric1.getData().add(new XYChart.Data(10, 17)); - metric1.getData().add(new XYChart.Data(11, 29)); - metric1.getData().add(new XYChart.Data(12, 25)); - - Series metric2 = new Series(); - metric2.setName("Metric 2"); - //populating the series with data - metric2.getData().add(new XYChart.Data(1, 25)); - metric2.getData().add(new XYChart.Data(2, 10)); - metric2.getData().add(new XYChart.Data(3, 19)); - metric2.getData().add(new XYChart.Data(4, 32)); - metric2.getData().add(new XYChart.Data(5, 33)); - metric2.getData().add(new XYChart.Data(6, 35)); - metric2.getData().add(new XYChart.Data(7, 38)); - metric2.getData().add(new XYChart.Data(8, 40)); - metric2.getData().add(new XYChart.Data(9, 41)); - metric2.getData().add(new XYChart.Data(10, 10)); - metric2.getData().add(new XYChart.Data(11, 24)); - metric2.getData().add(new XYChart.Data(12, 21)); - - return new Pair(metric1,metric2); - } - - - private String getTableName(ToggleGroup metricGroup) { switch (((RadioButton) metricGroup.getSelectedToggle()).getText()) { case "Impressions": @@ -896,54 +773,6 @@ public class DataViewScreen { return null; } - public void setLineChart(LineChart chart){ - this.linechart = chart; - filtersNGraphs.getChildren().clear(); - filtersNGraphs.getChildren().addAll(filterBox, linechart); - filtersNGraphs.setHgrow(linechart, Priority.ALWAYS); // Resize chart - } - - public LineChart getLineChart(){ - return linechart; - } - - public void setMultiChart(PieChart piechart, LineChart linechart){ - this.piechart = piechart; - this.linechart = linechart; - multiGraphs.getChildren().clear(); - multiGraphs.setVgrow(piechart, Priority.SOMETIMES); // Resize chart - multiGraphs.setVgrow(linechart, Priority.SOMETIMES); // Resize chart - multiGraphs.getChildren().add(piechart); - multiGraphs.getChildren().add(linechart); - } - - public PieChart getPieChart(){ - return piechart; - } - - private LineChart buildLineChart(ArrayList<Series> series, Axis x, Axis y, String title){ - LineChart linechart = new LineChart(x, y); - linechart.getData().addAll(series); - linechart.setTitle(title); - linechart.setStyle("-fx-font: "+sizeOfFont+"px \"Arial\";"); - return linechart; - } - - private BarChart buildBarChart(ArrayList<XYChart.Series> series, Axis x, Axis y, String title){ - BarChart barchart = new BarChart(x, y); - barchart.getData().addAll(series); - barchart.setTitle(title); - return barchart; - } - - private PieChart buildPieChart(ArrayList<PieChart.Data> data, String title){ - ObservableList<PieChart.Data> pieChartData = FXCollections.observableArrayList(data); - final PieChart piechart = new PieChart(pieChartData); - piechart.setTitle(title); - piechart.setStyle("-fx-font: "+sizeOfFont+"px \"Arial\";"); - return piechart; - } - //changes the UI to set size private void initFonts(){ for (Label l : allLabels){ @@ -963,16 +792,17 @@ public class DataViewScreen { metrics.setSpacing(20); fontSize.setStyle("-fx-font: "+sizeOfFont+"px \"Arial\";"); granularitySelect.setStyle("-fx-font: "+sizeOfFont+"px \"Arial\";"); - linechart.getXAxis().tickLabelFontProperty().set(Font.font(sizeOfFont)); - yAxis.setTickLabelFont(Font.font(sizeOfFont)); - xAxis.setTickLabelFont(Font.font(sizeOfFont)); - linechart.setStyle("-fx-font: "+sizeOfFont+"px \"Arial\";"); - if (piechart != null) - piechart.setStyle("-fx-font: "+sizeOfFont+"px \"Arial\";"); + + graphManager.changeFontSize(sizeOfFont); + filterSelect.setStyle("-fx-font: "+sizeOfFont+"px \"Arial\";"); back.setFont(new Font("Arial", sizeOfFont)); stage.sizeToScene(); } + public GraphManager getGraphManager(){ + return graphManager; + } + } diff --git a/src/DateFilter.java b/src/DateFilter.java index 32736bb3cab128ca34104aaca9edf8d61b168786..3a8268e9663c46b9808f7696efcf891ce4986ef3 100644 --- a/src/DateFilter.java +++ b/src/DateFilter.java @@ -181,10 +181,10 @@ public class DateFilter extends Filter { if (metricName.equals("Bounces")) { PieChart pieChart = updateBounces(Integer.valueOf(filiteredValue)); LineChart lineChart = updateBounceRate(filteredValues, granularity); - dvs.setMultiChart(pieChart, lineChart); + dvs.getGraphManager().setMultiChart(pieChart, lineChart); } else { Series data = new Series(); - data.setName(dvs.getLineChart().getTitle()); + data.setName(dvs.getGraphManager().getLinechart().getTitle()); //cumulative chart for total cost, standard for others @@ -213,28 +213,28 @@ public class DateFilter extends Filter { Axis x = new CategoryAxis(); x.setLabel("Day"); Axis y = new NumberAxis(); - y.setLabel(dvs.getLineChart().getYAxis().getLabel()); + y.setLabel(dvs.getGraphManager().getLinechart().getYAxis().getLabel()); LineChart linechart = new LineChart(x, y); linechart.getData().addAll(data); - linechart.setTitle(dvs.getLineChart().getTitle()); + linechart.setTitle(dvs.getGraphManager().getLinechart().getTitle()); if (metricName.equals("Clicks")){ - PieChart pieChart = dvs.getPieChart(); + PieChart pieChart = dvs.getGraphManager().getPieChart(); pieChart.getData().clear(); List<String[]> ageValues = qry_exec.executeQuery("Clicks", "date", startVal+","+endVal, "age groups",2); for(String[] record : ageValues) { pieChart.getData().add(new PieChart.Data(record[0], Integer.valueOf(record[1]))); } - dvs.setMultiChart(pieChart, linechart); + dvs.getGraphManager().setMultiChart(pieChart, linechart); } else - dvs.setLineChart(linechart); + dvs.getGraphManager().setLineChart(linechart); } dvs.showFilterApplied("Date range: "+startVal+" to "+endVal); } private PieChart updateBounces(Integer bounces) { // Update pie chart - PieChart pieChart = dvs.getPieChart(); + PieChart pieChart = dvs.getGraphManager().getPieChart(); pieChart.getData().remove(0); pieChart.getData().add(new PieChart.Data("Bounce clicks", bounces)); diff --git a/src/FilterController.java b/src/FilterController.java index 48742d1504e8646929ecfc0f52131eb6463ed545..47516f2f10aaf668e4c4f956ecb40a66597734f9 100644 --- a/src/FilterController.java +++ b/src/FilterController.java @@ -169,10 +169,16 @@ public class FilterController extends Filter { pieChart.setStyle("-fx-font: "+fontSize+"px \"Arial\";"); lineChart.getXAxis().tickLabelFontProperty().set(Font.font(fontSize)); lineChart.setStyle("-fx-font: "+fontSize+"px \"Arial\";"); - dvs.setMultiChart(pieChart, lineChart); + + dvs.getGraphManager().setMultiChart(pieChart, lineChart); + //dvs.getGraphManager().changeFontSize(); } else { XYChart.Series data = new XYChart.Series(); - data.setName(dvs.getLineChart().getTitle()); + //data.setName(dvs.getLineChart().getTitle()); + + GraphManager graphManager = dvs.getGraphManager(); + + data.setName(graphManager.getLinechart().getTitle()); //cumulative chart for total cost, standard for others @@ -200,25 +206,25 @@ public class FilterController extends Filter { */ Axis x = new CategoryAxis(); NumberAxis y = new NumberAxis(); - y.setLabel(dvs.getLineChart().getYAxis().getLabel()); + y.setLabel(dvs.getGraphManager().getLinechart().getYAxis().getLabel()); x.setLabel("Day"); //dvs.getLineChart().getYAxis().setLabel(dvs.getLineChart().getYAxis().getLabel()); LineChart linechart = new LineChart(x,y); linechart.getData().addAll(data); - linechart.setTitle(dvs.getLineChart().getTitle()); + linechart.setTitle(graphManager.getLinechart().getTitle()); if (metricName.equals("Clicks")){ - PieChart pieChart = dvs.getPieChart(); + PieChart pieChart = graphManager.getPieChart(); pieChart.getData().clear(); List<String[]> ageValues = qry_exec.executeQuery("Clicks", filterName.toLowerCase(), selectedValue, "age groups",2); for(String[] record : ageValues) { pieChart.getData().add(new PieChart.Data(record[0], Integer.valueOf(record[1]))); } - dvs.setMultiChart(pieChart, linechart); + dvs.getGraphManager().setMultiChart(pieChart, linechart); } else - dvs.setLineChart(linechart); + graphManager.setLineChart(linechart); linechart.getXAxis().tickLabelFontProperty().set(Font.font(fontSize)); - dvs.getLineChart().getYAxis().setTickLabelFont(Font.font(fontSize)); + graphManager.getLinechart().getYAxis().setTickLabelFont(Font.font(fontSize)); x.setTickLabelFont(Font.font(fontSize)); linechart.setStyle("-fx-font: "+fontSize+"px \"Arial\";"); @@ -230,7 +236,7 @@ public class FilterController extends Filter { private PieChart updateBounces(Integer bounces) { // Update pie chart - PieChart pieChart = dvs.getPieChart(); + PieChart pieChart = dvs.getGraphManager().getPieChart(); pieChart.getData().clear(); Integer totalClicks = Integer.valueOf(qry_exec.executeQuery("Clicks", "").get(0).get(0)[0]); pieChart.getData().add(new PieChart.Data("Normal clicks",totalClicks-bounces)); diff --git a/src/GraphManager.java b/src/GraphManager.java new file mode 100644 index 0000000000000000000000000000000000000000..46589402dfb73e6ca4a93a7441a6ab9cb183b8fa --- /dev/null +++ b/src/GraphManager.java @@ -0,0 +1,125 @@ +package src; + +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; +import javafx.scene.chart.*; +import javafx.scene.layout.Priority; +import javafx.scene.layout.VBox; +import javafx.scene.text.Font; + +import java.util.ArrayList; +import java.util.List; + +public class GraphManager extends VBox { + + private ArrayList<XYChart.Series> series_line = new ArrayList<XYChart.Series>(); + private LineChart linechart; + private PieChart piechart; + private Axis xAxis = new NumberAxis(); + private Axis yAxis = new NumberAxis(); + private int fontSize; + + + public GraphManager(){ + super(); + this.setSpacing(10); + } + + public void changeFontSize(int size){ + fontSize = size; + // Changes to current graph next + + linechart.getXAxis().tickLabelFontProperty().set(Font.font(fontSize)); + yAxis.setTickLabelFont(Font.font(fontSize)); + xAxis.setTickLabelFont(Font.font(fontSize)); + linechart.setStyle("-fx-font: "+fontSize+"px \"Arial\";"); + if (piechart != null) + piechart.setStyle("-fx-font: "+fontSize+"px \"Arial\";"); + } + + public void clear(){ + getChildren().clear(); + setSpacing(10); + } + + public XYChart.Series resultToMetric(List<String[]> data){ + XYChart.Series metric = new XYChart.Series(); + for(var x : data){ + metric.getData().add(new XYChart.Data(x[0], Double.parseDouble(x[1]))); + } + return metric; + } + + public void createGraph(XYChart.Series metric, String name, String granuleUnit){ + String thing = name + " per " + granuleUnit; + metric.setName(thing); + + ArrayList<XYChart.Series> series_line = new ArrayList<XYChart.Series>(){ + { + add(metric); + } + }; + + xAxis = new CategoryAxis(); + yAxis = new NumberAxis(); + xAxis.setLabel(granuleUnit); + yAxis.setLabel("Number of " + name); + + setLineChart(buildLineChart(series_line, xAxis, yAxis, thing)); + } + + public void setLineChart(LineChart chart){ + this.linechart = chart; + setVgrow(linechart, Priority.ALWAYS); + this.getChildren().add(linechart); + } + + + public void addPieChart(PieChart piechart){ + this.piechart = piechart; + setVgrow(this.piechart, Priority.SOMETIMES); + setVgrow(linechart, Priority.SOMETIMES); + this.getChildren().add(0, piechart); + } + + public void setMultiChart(PieChart piechart, LineChart linechart){ + this.piechart = piechart; + this.linechart = linechart; + this.getChildren().clear(); + setVgrow(piechart, Priority.SOMETIMES); // Resize chart + setVgrow(linechart, Priority.SOMETIMES); // Resize chart + this.getChildren().add(piechart); + this.getChildren().add(linechart); + } + + public PieChart getPieChart(){ + return piechart; + } + + public LineChart buildLineChart(ArrayList<XYChart.Series> series, Axis x, Axis y, String title){ + LineChart linechart = new LineChart(x, y); + linechart.getData().addAll(series); + linechart.setTitle(title); + linechart.setStyle("-fx-font: "+fontSize+"px \"Arial\";"); + return linechart; + } + + public BarChart buildBarChart(ArrayList<XYChart.Series> series, Axis x, Axis y, String title){ + BarChart barchart = new BarChart(x, y); + barchart.getData().addAll(series); + barchart.setTitle(title); + return barchart; + } + + public PieChart buildPieChart(ArrayList<PieChart.Data> data, String title){ + ObservableList<PieChart.Data> pieChartData = FXCollections.observableArrayList(data); + final PieChart piechart = new PieChart(pieChartData); + piechart.setTitle(title); + piechart.setStyle("-fx-font: "+fontSize+"px \"Arial\";"); + return piechart; + } + + public LineChart getLinechart() { + return linechart; + } +}