diff --git a/SQLBuilder/QueryBuilder.java b/SQLBuilder/QueryBuilder.java index 9d28a14a34f27bee475ae71b1980e58ee66ef883..94b4f922b1e1036e7d8d76b823f8a4cb14ff8b0a 100644 --- a/SQLBuilder/QueryBuilder.java +++ b/SQLBuilder/QueryBuilder.java @@ -137,7 +137,7 @@ public class QueryBuilder { break; case "Conversions": // To do - query = null; + query = builder.filter(new String[] {"server_log"}, new String[] {"entry_date"}, start, end, new String[] {granulStment + "entry_date) AS granularity", "COUNT(conversion)"}, " AND conversion = 1 GROUP BY granularity"); break; case "Total Cost": String impression_tbl = builder.selectStatement(new String[]{granulStment + "date) AS granularity", "SUM(impression_cost) AS impr_sum"}, new String[]{"impression_log"}, "", "GROUP BY granularity"); @@ -198,7 +198,7 @@ public class QueryBuilder { break; case "Conversions": // To do - query = null; + query = builder.filter(new String[] {"server_log"}, new String[] {"entry_date"}, start, end, new String[] {"COUNT(conversion)"}, " AND conversion = 1"); break; case "Total Cost": query = builder.filter(new String[]{"impression_log"}, new String[]{"date"},start, end, new String[]{"ROUND(SUM(impression_cost)+("+ builder.selectStatement(new String[]{"SUM(click_cost)"}, new String[]{"click_log"}, "", "")+"),2)"}, ""); @@ -257,7 +257,7 @@ public class QueryBuilder { break; case "Conversions": // To do - query = null; + query = builder.filter(new String[] { builder.innerJoin("server_log", "impression_log", "server_log.user_id", "impression_log.user_id")}, filter, "impression_log", filterVal, new String[] { granulStment + "server_log.entry_date) as granularity", "COUNT(conversion)"}, " AND conversion = 1 GROUP BY granularity"); break; case "Total Cost": String impression_tbl = builder.selectStatement(new String[]{granulStment+"impression_log.date) AS granularity", "SUM(impression_cost) AS impr_sum"}, new String[]{"impression_log"}, @@ -329,7 +329,7 @@ public class QueryBuilder { break; case "Conversions": // To do - query = null; + query = builder.filter(new String[] { builder.innerJoin("server_log", "impression_log", "server_log.user_id", "impression_log.user_id")}, filter, "impression_log", filterVal, new String[] {"COUNT(conversion)"}, " AND conversion = 1"); break; case "Total Cost": query = builder.filter(new String[] {builder.innerJoin("click_log","impression_log","click_log.user_id","impression_log.user_id")},filter,"impression_log", filterVal, new String[]{"ROUND(SUM(impression_cost)+(SELECT SUM(click_cost) FROM click_log ),2)"}, ""); @@ -407,7 +407,9 @@ public class QueryBuilder { } private String[] buildConv() { - return null; + String conversions = builder.selectStatement(new String[] {"COUNT(conversion)"}, new String[] {"server_log"}, "WHERE conversion = 1", ""); + String conversionsByGranularity = builder.selectStatement(new String[] { granulStment + "entry_date) AS granularity", "COUNT(conversion)"}, new String[] {"server_log"}, "WHERE conversion = 1", "GROUP BY granularity"); + return new String[] { conversions, conversionsByGranularity }; } private String[] buildBounces() { diff --git a/src/DataViewScreen2.java b/src/DataViewScreen2.java index 33c47e266d5b37c32208a7c05e9814c8061b0dc0..d06150b5cfe66a73cf7af2b657dcd35cfa9f26a4 100644 --- a/src/DataViewScreen2.java +++ b/src/DataViewScreen2.java @@ -24,7 +24,7 @@ public class DataViewScreen2 { private Scene fileSelectScene; private final List<Button> metricButtons; - private String currentFilter; + private Filter currentFilter; private Button selectedButton; // DO NOT REMOVE WHITESPACE IN THESE STRINGS @@ -41,8 +41,6 @@ public class DataViewScreen2 { private final int APPLIED_FILTER_FONT_SIZE = 15; private final int GRANULARITY_HEADING_FONT_SIZE = 17; - //private final Axis yAxis = new NumberAxis(); - public DataViewScreen2(Stage stage, DatabaseController dbc, QueryExecutor queryExecutor, FontSizeHandler fontSizeHandler, WindowsHandler windowsHandler, Scene fileSelectScene) { this.stage = stage; this.dbc = dbc; @@ -51,7 +49,6 @@ public class DataViewScreen2 { this.windowsHandler = windowsHandler; this.fileSelectScene = fileSelectScene; metricButtons = new ArrayList<>(); - currentFilter = "No Filter"; } private void configureStage(BorderPane borderPane, VBox leftVBox, VBox topVBox) { @@ -90,7 +87,6 @@ public class DataViewScreen2 { VBox topVBox = setupTopBorderPane(); borderPane.setTop(topVBox); - //borderPane.setBottom(setupBottomBorderPane()); borderPane.setLeft(leftVBox); borderPane.setRight(rightVBox); borderPane.setCenter(centreVBox); @@ -100,11 +96,13 @@ public class DataViewScreen2 { fontSizeHandler.updateFontSize(fontSizeHandler.DATA_VIEW_SCREEN); })); granularityComboBox.valueProperty().addListener(((observableValue, oldValue, newValue) -> { - if (!currentFilter.equals("No Filter")) { - Platform.runLater(() -> - filterUpdate(newValue, metricCount, appliedFilterLabel)); - //fontSizeHandler.updateFontSize(fontSizeHandler.DATA_VIEW_SCREEN); - } else { + if (currentFilter != null) { // if filter == null ==> "No Filter" is selected + Platform.runLater(() -> { + currentFilter.filter(); + }); + filterUpdate(newValue, metricCount, appliedFilterLabel); + } + else { selectedButton.fire(); } })); @@ -227,29 +225,36 @@ public class DataViewScreen2 { // What to do when filters are updated private void filterUpdate(String newValue, Label metricCount, Label appliedFilters){ if (newValue != null) { - currentFilter = newValue; switch (newValue) { case "No Filter" -> { Platform.runLater(() -> selectedButton.fire()); appliedFilters.setText("No filters applied."); + currentFilter = null; + } + case "Date Range" -> { + currentFilter = new DateFilter(queryExecutor, metricCount, getTableName(selectedButton.getText()), getColumns(selectedButton.getText()), this, selectedButton.getText(), CHART_FONT_SIZE); + currentFilter.load(); } - case "Date Range" -> new DateFilter(queryExecutor, metricCount, getTableName(selectedButton.getText()), getColumns(selectedButton.getText()), this, selectedButton.getText(), CHART_FONT_SIZE); case "Age" -> { String[] ages = {"<25", "25-34", "35-44", "45-54", ">54"}; - new FilterController(queryExecutor, metricCount, ages, "Age", getTableName(selectedButton.getText()), getColumns(selectedButton.getText()), this, selectedButton.getText(), CHART_FONT_SIZE); + currentFilter = new FilterController(queryExecutor, metricCount, ages, "Age", getTableName(selectedButton.getText()), getColumns(selectedButton.getText()), this, selectedButton.getText(), CHART_FONT_SIZE); + currentFilter.load(); } case "Context" -> { String[] contexts = {"News", "Shopping", "Social Media", "Blog", "Hobbies", "Travel"}; - new FilterController(queryExecutor, metricCount, contexts, "Context", getTableName(selectedButton.getText()), getColumns(selectedButton.getText()), this, selectedButton.getText(), CHART_FONT_SIZE); + currentFilter = new FilterController(queryExecutor, metricCount, contexts, "Context", getTableName(selectedButton.getText()), getColumns(selectedButton.getText()), this, selectedButton.getText(), CHART_FONT_SIZE); + currentFilter.load(); } case "Income" -> { String[] incomes = {"High", "Medium", "Low"}; - new FilterController(queryExecutor, metricCount, incomes, "Income", getTableName(selectedButton.getText()), getColumns(selectedButton.getText()), this, selectedButton.getText(), CHART_FONT_SIZE); + currentFilter = new FilterController(queryExecutor, metricCount, incomes, "Income", getTableName(selectedButton.getText()), getColumns(selectedButton.getText()), this, selectedButton.getText(), CHART_FONT_SIZE); + currentFilter.load(); } case "Gender" -> { String[] genders = {"Male", "Female"}; - new FilterController(queryExecutor, metricCount, genders, "Gender", + currentFilter = new FilterController(queryExecutor, metricCount, genders, "Gender", getTableName(selectedButton.getText()), getColumns(selectedButton.getText()), this, selectedButton.getText(), CHART_FONT_SIZE); + currentFilter.load(); } } } diff --git a/src/DatabaseController.java b/src/DatabaseController.java index 144fc5190231a43f5c65601b11b192bdb5feaf23..39810ed34b9f9f931d45f422febb2b4e5dd58bfc 100644 --- a/src/DatabaseController.java +++ b/src/DatabaseController.java @@ -180,6 +180,7 @@ public class DatabaseController { System.err.println("Query error: "+e); } // attempts to executes the query + System.out.println(query); try (ResultSet rs = statement.executeQuery(query)) { // creates an ArrayList of Arrays List<String[]> data = new ArrayList<String[]>(); diff --git a/src/DateFilter.java b/src/DateFilter.java index 71a3dc00431694824cc6c1d8d1c1a880a3469513..f0050a0ff136967b0eaf33990ee84a0b69f1590d 100644 --- a/src/DateFilter.java +++ b/src/DateFilter.java @@ -38,7 +38,6 @@ public class DateFilter extends Filter { this.dvs = dvs; this.metricName = metricName; this.fontSize = fontSize; - load(); } public void load (){ @@ -243,11 +242,22 @@ public class DateFilter extends Filter { this.endVal = null; } + @Override + public void setFilterValues(String[] filterValues) { + startVal = filterValues[0]; + endVal = filterValues[1]; + } + + @Override + public String getFilterName() { + return "Date Range"; + } + private void setStart(DatePicker start) { startVal = start.getValue().format(DateTimeFormatter.ISO_LOCAL_DATE); } - private void setEnd (DatePicker end){ + private void setEnd(DatePicker end){ endVal = end.getValue().format(DateTimeFormatter.ISO_LOCAL_DATE); } diff --git a/src/Filter.java b/src/Filter.java index 7f0d1063bebabfd912c897bbc7f3374d09d67d4b..a669278ee7cb54460d92872c577657d2ddd50edb 100644 --- a/src/Filter.java +++ b/src/Filter.java @@ -14,6 +14,8 @@ abstract class Filter { public abstract void load(); // Need implementation public abstract void filter(); // Need implementation public abstract void tearDown(); // Need implementation + public abstract void setFilterValues(String[] filterValues); + public abstract String getFilterName(); public Scene done() { BorderPane bp = new BorderPane(); diff --git a/src/FilterController.java b/src/FilterController.java index a76437cb5d300e4e0bf028a440ecbe183e76f091..e8ca919171fe8f8b69d33b2bb4363ddd08684b72 100644 --- a/src/FilterController.java +++ b/src/FilterController.java @@ -5,7 +5,6 @@ import javafx.geometry.Pos; import javafx.scene.Scene; import javafx.scene.chart.*; import javafx.scene.control.Button; -import javafx.scene.control.ComboBox; import javafx.scene.control.Label; import javafx.scene.layout.BorderPane; import javafx.scene.layout.HBox; @@ -14,7 +13,6 @@ import javafx.scene.text.Font; import javafx.stage.Stage; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; public class FilterController extends Filter { @@ -50,8 +48,7 @@ public class FilterController extends Filter { this.columns = columns; this.dvs = dvs; this.metricName = metricName; - this.fontSize=fontSize; - load(); + this.fontSize = fontSize; } @Override @@ -70,7 +67,7 @@ public class FilterController extends Filter { filterOptions.getChildren().add(filterButton); filterButton.setOnAction( action -> { - setFilterValue(filterButton.getText()); + setFilterValues(new String[] { filterButton.getText() }); filterStage.setScene(super.done()); try { java.util.concurrent.TimeUnit.SECONDS.sleep(1); @@ -123,36 +120,6 @@ public class FilterController extends Filter { String[] valArray = currentVal.split(" "); String granularity = dvs.getGranularity(); - /* - if (metric.getText().contains("bounces")){ - tableName = "server_log"; - System.out.println(SQLCommands.filter(tableName, filterName.toLowerCase(), selectedValue, columns, " AND (viewed = '1' OR (JULIANDAY(exit_date) - JULIANDAY(entry_date)) * 60 * 60 * 24 < 30)")); - filiteredValue = db_ctrl.dbQuery(SQLCommands.filter(tableName, filterName.toLowerCase(), selectedValue, columns, " AND (viewed = '1' OR (JULIANDAY(exit_date) - JULIANDAY(entry_date)) * 60 * 60 * 24 < 30)"),1).get(0)[0]; - } else { - System.out.println(SQLCommands.filter(tableName, filterName.toLowerCase(), selectedValue, columns, "")); - filiteredValue = db_ctrl.dbQuery(SQLCommands.filter(tableName, filterName.toLowerCase(), selectedValue, columns, ""),1).get(0)[0]; - } - - // Update Chart - //System.out.println(SQLCommands.filter(tableName, filterName.toLowerCase(), selectedValue, new String[]{"distinct date("+tableName+".date) AS uniq_date, COUNT("+tableName+".id)"}, " GROUP BY uniq_date")); - //List<String[]> filteredValues = db_ctrl.dbQuery(SQLCommands.filter(tableName, filterName.toLowerCase(), selectedValue, new String[]{"distinct date("+tableName+".date) AS uniq_date, COUNT("+tableName+".id)"}, " GROUP BY uniq_date"),2); - //gets the columns from the given columns, not just counting the ID - /* - String[] initial; - - if (metric.getText().contains("bounces")){ - initial = new String[] {"distinct date(impression_log.date) AS uniq_date"}; - } else { - initial = new String[] {"distinct date("+tableName+".date) AS uniq_date"}; - } - String[] all = Arrays.copyOf(initial,initial.length + columns.length); - System.arraycopy(columns, 0, all, initial.length,columns.length); - - //System.out.println(SQLCommands.filter(tableName, filterName.toLowerCase(), selectedValue, all, " GROUP BY uniq_date")); - List<String[]> filteredValues = db_ctrl.dbQuery(SQLCommands.filter(tableName, filterName.toLowerCase(), selectedValue, all, " GROUP BY uniq_date"),2); - */ - - List<List<String[]>> queryResponse = qry_exec.executeQuery(metricName,filterName.toLowerCase(),selectedValue,granularity); String filteredValue = queryResponse.get(0).get(0)[0]; if (filteredValue == null) @@ -184,7 +151,7 @@ public class FilterController extends Filter { } else { for (int i = 0; i < filteredValues.size(); i++) { String[] record = filteredValues.get(i); - System.out.println(metric.getText() + " - " + record[1]); + //System.out.println(metric.getText() + " - " + record[1]); data.getData().add(new XYChart.Data(record[0], Double.valueOf(record[1]))); } } @@ -271,15 +238,21 @@ public class FilterController extends Filter { return linechart; } - private void setFilterValue(String value) { - selectedValue = value; - } - @Override public void tearDown() { this.selectedValue = null; } + @Override + public void setFilterValues(String[] filterValues) { + selectedValue = filterValues[0]; + } + + @Override + public String getFilterName() { + return filterName; + } + // public void initFonts(Button[] dataButtons,Button cancel, Label title){ // metric.setFont(new Font("Arial", fontSize)); // for(Button b : dataButtons){ diff --git a/src/MetricEventsHandler.java b/src/MetricEventsHandler.java index 109d82a23b22ef3a82e8ce85c2a46daee2d8ff64..f93d188bb4c785a25f7263bdcf1967c65f5e32f5 100644 --- a/src/MetricEventsHandler.java +++ b/src/MetricEventsHandler.java @@ -182,12 +182,9 @@ public class MetricEventsHandler { XYChart.Series uniqueUsersChart = new XYChart.Series(); uniqueUsersChart.setName("Unique users per day"); - List<String[]> l1 = queryExecutor.executeQuery("Unique Users", granularity).get(1); - int i =0; - while(i<l1.size()){ - uniqueUsersChart.getData().add(new XYChart.Data(l1.get(i)[0], Integer.parseInt(l1.get(i)[1]))); - i++; - + List<String[]> uniqueUsersQueryResult = queryExecutor.executeQuery("Unique Users", granularity).get(1); + for (int i = 0; i < uniqueUsersQueryResult.size(); i++) { + uniqueUsersChart.getData().add(new XYChart.Data(uniqueUsersQueryResult.get(i)[0], Integer.parseInt(uniqueUsersQueryResult.get(i)[1]))); } List<XYChart.Series> series = new ArrayList<XYChart.Series>(){{ add(uniqueUsersChart); }}; @@ -278,12 +275,34 @@ public class MetricEventsHandler { private void conversionsClickEvent() { filtersComboBox.getSelectionModel().select(0); String granularity = granularityComboBox.getSelectionModel().getSelectedItem(); - //String conversionsCount = ; + Thread thread = new Thread(() -> { + List<List<String[]>> result = queryExecutor.executeQuery("Conversions", granularity); + Platform.runLater(() -> { + metricCount.setText("Conversions: " + result.get(0).get(0)[0]); + XYChart.Series conversionsChart = new XYChart.Series(); + conversionsChart.setName("Number of Conversions"); - centreVBox.getChildren().clear(); - //centreVBox.getChildren().add(); - //centreVBox.setVgrow(lineChart, Priority.ALWAYS); + List<String[]> conversionsQueryResult = result.get(1); + for (int i = 0; i < conversionsQueryResult.size(); i++) { + conversionsChart.getData().add(new XYChart.Data(conversionsQueryResult.get(i)[0], Integer.parseInt(conversionsQueryResult.get(i)[1]))); + } + + List<XYChart.Series> series = new ArrayList<XYChart.Series>(){{ add(conversionsChart); }}; + + + Axis xAxis = new CategoryAxis(); + Axis yAxis = new NumberAxis(); + xAxis.setLabel("Day"); + yAxis.setLabel("Number Of Conversions"); + LineChart lineChart = buildLineChart(series, xAxis, yAxis, "Conversions"); + + centreVBox.getChildren().clear(); + centreVBox.getChildren().add(lineChart); + centreVBox.setVgrow(lineChart, Priority.ALWAYS); + }); + }); + thread.start(); metricCount.setText("Not Yet Implemented"); } @@ -302,14 +321,14 @@ public class MetricEventsHandler { metricCount.setText("Total Cost:\n" + result.get(0).get(0)[0] + "p"); XYChart.Series totalCost = new XYChart.Series(); totalCost.setName("Total cost per day"); + List<String[]> totalCostQueryResult = result.get(1); - int i = 0; double cumulativeCost = 0; - while (i < totalCostQueryResult.size()) { + for (int i = 0; i < totalCostQueryResult.size(); i++) { cumulativeCost += Double.parseDouble(totalCostQueryResult.get(i)[1]); totalCost.getData().add(new XYChart.Data(totalCostQueryResult.get(i)[0], cumulativeCost)); - i++; } + List<XYChart.Series> series = new ArrayList<XYChart.Series>(){{ add(totalCost); }}; Axis xAxis = new CategoryAxis(); diff --git a/src/SQLCommands.java b/src/SQLCommands.java deleted file mode 100644 index c42298252695a87f3814e647f817b85477029109..0000000000000000000000000000000000000000 --- a/src/SQLCommands.java +++ /dev/null @@ -1,72 +0,0 @@ -package src; - -public class SQLCommands { - - // Counts - final static public String numberOfClicks = "SELECT COUNT(id) FROM click_log;"; - final static public String numberOfImpressions = "SELECT COUNT(id) FROM impression_log;"; - final static public String numberOfUniqueUsers = "SELECT COUNT(DISTINCT user_id) FROM click_log;"; - - // check that these are 100% correct - // a bounce is defined as a user viewing only 1 screen, or staying on that site for < 30 seconds - final static public String numberOfBounces = "SELECT COUNT(id) FROM server_log WHERE viewed = '1' OR (JULIANDAY(exit_date) - JULIANDAY(entry_date)) * 60 * 60 * 24 < 30;"; - final static public String numberOfConversions = "SELECT SUM(conversion) FROM server_log;"; - final static public String totalCost = "SELECT SUM(click_cost) FROM click_log;"; - final static public String clickThroughRate = "SELECT COUNT(click_log.id) / COUNT(impression_log.id) FROM click_log, impression_log;"; - final static public String costPerAcquisition = "SELECT SUM(impression_cost) / SUM(conversion) FROM impression_log, server_log;"; - final static public String costPerClick = "SELECT SUM(click_cost) / COUNT(id) FROM click_log;"; - final static public String costPerThousandImpressions = "SELECT 1000 * SUM(impression_cost) / COUNT(id) FROM impression_log;"; - final static public String bounceRate = "SELECT (CAST (COUNT(server_log.id) AS float)) / (SELECT (CAST (COUNT(click_log.id) AS float)) FROM click_log) FROM server_log WHERE viewed = '1' OR (JULIANDAY(server_log.exit_date) - JULIANDAY(server_log.entry_date)) * 60 * 60 * 24 < 30;"; - - // Values - final static public String clickLogDates = "SELECT distinct date(date) AS uniq_date, COUNT(id) FROM click_log GROUP BY uniq_date"; // Number of clicks per date - final static public String impressionLogDates = "SELECT distinct date(date) AS uniq_date, COUNT(id) FROM impression_log GROUP BY uniq_date";// Number of impressions per date - final static public String uniqueUserDates ="SELECT distinct date(date) AS uniq_date, COUNT(DISTINCT user_id) FROM click_log GROUP BY uniq_date";// Number of unique users per date - final static public String totalCostDates ="SELECT distinct date(date) AS uniq_date, SUM(impression_cost) FROM impression_log GROUP BY uniq_date";//Total Cost per day - final static public String bouncesPerDates = "SELECT distinct date(server_log.entry_date) AS uniq_date, COUNT(server_log.id) FROM server_log WHERE viewed = '1' OR (JULIANDAY(exit_date) - JULIANDAY(entry_date)) * 60 * 60 * 24 < 30 GROUP BY uniq_date;"; - final static public String totalImpressionCostPerDates = "SELECT distinct date(date) AS uniq_date, SUM(impression_cost) FROM impression_log GROUP BY uniq_date;"; // total impression cost per day - final static public String totalClickCostPerDates = "SELECT distinct date(date) AS uniq_date, SUM(click_cost) AS total_click_cost FROM click_log GROUP BY uniq_date;"; // total click cost per day - final static public String totalConversionsPerDates = "SELECT distinct date(entry_date) AS uniq_date, SUM(conversion) FROM server_log GROUP BY uniq_date;"; - final static public String totalClickCostDates="SELECT distinct date(date) AS uniq_date, SUM(click_cost), COUNT(id) FROM click_log GROUP BY uniq_date"; - - // Filters - - /* - Filter a table between two dates - @param - tableName - Name of table to filter - @param - startDate - Start Date - @param - endDate - End Date - */ - public static String filterByDateRange (String tableName, String startDate, String endDate, String[] columns, String extraParameters){ - return "SELECT "+String.join(", ",columns)+" FROM "+tableName+" WHERE date BETWEEN '"+startDate+"' AND '"+endDate+"'"+extraParameters; - } - - /* - Filter table - @param - tableName - Name of table to filter - @param - filter - Metric to filter (e.g. income, age, context) - @param - income - Category as string (e.g. Age: <25, 25-34, 35-44, 45-54, >54 or Income: High, Medium, Low) - @param - columns - List of column names to get - */ - public static String filter (String tableName, String filter, String parameter, String[] columns, String extraParameters){ - - if (tableName.equals("impression_log")) { - System.out.println("SELECT "+String.join(", ",columns)+" FROM "+tableName+" WHERE impression_log."+filter+" = '"+parameter+"'"+extraParameters); - return "SELECT " + String.join(", ", columns) + " FROM " + tableName + " WHERE impression_log." + filter + " = '" + parameter + "'" + extraParameters; - }else { - System.out.println("SELECT "+String.join(", ",columns)+" FROM "+tableName+" INNER JOIN impression_log ON "+tableName+".user_id = impression_log.user_id WHERE impression_log."+filter+" = '"+parameter+"'"+extraParameters); - return "SELECT " + String.join(", ", columns) + " FROM " + tableName + " INNER JOIN impression_log ON " + tableName + ".user_id = impression_log.user_id WHERE impression_log." + filter + " = '" + parameter + "'" + extraParameters; - } - } - - /* - Number of clicks by gender - @param - gender - */ - public static String filterClicksByGender (String gender){ - return "SELECT COUNT(DISTINCT click_log.user_id) FROM click_log INNER JOIN impression_log ON click_log.user_id = impression_log.user_id WHERE impression_log.gender = '"+ gender +"'"; - } - - - -}