diff --git a/.gitignore b/.gitignore index 8cfd120f..c3477ecd 100644 --- a/.gitignore +++ b/.gitignore @@ -6,10 +6,13 @@ dist/ /.classpath *.iml .idea/ +target/ +*.class # Repo specific ignores /ScanReport.xlsx *swp tmp/* Try* -/examples/ \ No newline at end of file +/examples/ +.DS_Store \ No newline at end of file diff --git a/docs/WhiteRabbit.md b/docs/WhiteRabbit.md index 9c00b502..c714e7c0 100644 --- a/docs/WhiteRabbit.md +++ b/docs/WhiteRabbit.md @@ -36,6 +36,13 @@ Once the scan report is created, this report can then be used in the Rabbit-In-A Note: on releases earlier than version 0.8.0, open the respective WhiteRabbit.jar or RabbitInAHat.jar files instead. +### Memory +WhiteRabbit possibly does not start when the memory allocated by the JVM is too big or too small. +By default this is set to 1200m. +To increase the memory (in this example to 2400m), either set the environment variable `EXTRA_JVM_ARGUMENTS=-Xmx2400m` before starting or edit in `bin/WhiteRabbit.bat` the line `%JAVACMD% %JAVA_OPTS% -Xmx2400m...`. +To lower the memory, set one of these variables to e.g. `-Xmx600m`. +If you have a 32-bit Java VM installed and problems persist, consider installing 64-bit Java. + ## Support All source code, descriptions and input/output examples are available on GitHub: diff --git a/pom.xml b/pom.xml index 762672c7..70f033da 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ org.ohdsi leporidae pom - 0.10.1 + 0.10.2 rabbitinahat whiterabbit diff --git a/rabbit-core/pom.xml b/rabbit-core/pom.xml index a6e4e8d4..b96bce1f 100644 --- a/rabbit-core/pom.xml +++ b/rabbit-core/pom.xml @@ -5,7 +5,7 @@ leporidae org.ohdsi - 0.10.1 + 0.10.2 4.0.0 @@ -30,7 +30,7 @@ mysql mysql-connector-java - 5.1.37 + 8.0.16 dom4j @@ -40,17 +40,17 @@ org.apache.poi poi - 3.9 + 3.17 org.apache.poi poi-ooxml - 3.9 + 3.17 org.apache.poi poi-excelant - 3.9 + 3.17 org.apache.poi @@ -70,7 +70,7 @@ org.postgresql postgresql - 9.4-1204-jdbc41 + 42.2.5 com.cedarsoftware diff --git a/rabbit-core/src/main/java/org/ohdsi/databases/RichConnection.java b/rabbit-core/src/main/java/org/ohdsi/databases/RichConnection.java index 6e5c8f67..17f691e7 100644 --- a/rabbit-core/src/main/java/org/ohdsi/databases/RichConnection.java +++ b/rabbit-core/src/main/java/org/ohdsi/databases/RichConnection.java @@ -146,15 +146,22 @@ public List getTableNames(String database) { if (dbType == DbType.MYSQL) { query = "SHOW TABLES IN " + database; } else if (dbType == DbType.MSSQL || dbType == DbType.PDW || dbType == DbType.AZURE) { - query = "SELECT CONCAT(schemas.name, '.', tables.name) FROM " + database + ".sys.tables INNER JOIN " + database + ".sys.schemas ON tables.schema_id = schemas.schema_id ORDER BY schemas.name, tables.name"; + query = "SELECT CONCAT(schemas.name, '.', tables_views.name) FROM " + + "(SELECT schema_id, name FROM %1$s.sys.tables UNION ALL SELECT schema_id, name FROM %1$s.sys.views) tables_views " + + "INNER JOIN %1$s.sys.schemas ON tables_views.schema_id = schemas.schema_id " + + "ORDER BY schemas.name, tables_views.name"; + query = String.format(query, database); + System.out.println(query); } else if (dbType == DbType.ORACLE) { - query = "SELECT table_name FROM all_tables WHERE owner='" + database.toUpperCase() + "'"; + query = "SELECT table_name FROM " + + "(SELECT table_name, owner FROM all_tables UNION ALL SELECT view_name, owner FROM all_views) tables_views " + + "WHERE owner='" + database.toUpperCase() + "'"; } else if (dbType == DbType.POSTGRESQL || dbType == DbType.REDSHIFT) { query = "SELECT table_name FROM information_schema.tables WHERE table_schema = '" + database.toLowerCase() + "' ORDER BY table_name"; } else if (dbType == DbType.MSACCESS) { - query = "SELECT Name FROM sys.MSysObjects WHERE Type=1 AND Flags=0;"; + query = "SELECT Name FROM sys.MSysObjects WHERE (Type=1 OR Type=5) AND Flags=0;"; } else if (dbType == DbType.TERADATA) { - query = "SELECT TableName from dbc.tables WHERE tablekind = 'T' and databasename='" + database + "'"; + query = "SELECT TableName from dbc.tables WHERE tablekind IN ('T','V') and databasename='" + database + "'"; } else if (dbType == DbType.BIGQUERY) { query = "SELECT table_name from " + database + ".INFORMATION_SCHEMA.TABLES ORDER BY table_name;"; } diff --git a/rabbitinahat/pom.xml b/rabbitinahat/pom.xml index 1d290a9b..fe67c65a 100644 --- a/rabbitinahat/pom.xml +++ b/rabbitinahat/pom.xml @@ -5,7 +5,7 @@ leporidae org.ohdsi - 0.10.1 + 0.10.2 4.0.0 diff --git a/rabbitinahat/src/main/java/org/ohdsi/rabbitInAHat/ETLTestFrameWorkGenerator.java b/rabbitinahat/src/main/java/org/ohdsi/rabbitInAHat/ETLTestFrameWorkGenerator.java index 97e2cdc1..713ee344 100644 --- a/rabbitinahat/src/main/java/org/ohdsi/rabbitInAHat/ETLTestFrameWorkGenerator.java +++ b/rabbitinahat/src/main/java/org/ohdsi/rabbitInAHat/ETLTestFrameWorkGenerator.java @@ -31,6 +31,7 @@ import org.ohdsi.rabbitInAHat.dataModel.*; import org.ohdsi.rabbitInAHat.dataModel.ETL.FileFormat; +// TODO: use templating to generate the R code (e.g. Jinja/Apache FreeMarker/Mustache). At least put static R code in separate (.R) files. public class ETLTestFrameWorkGenerator { private static int DEFAULT = 0; @@ -260,7 +261,7 @@ private void createAddFunctions() { writer.println(" frameworkContext$sourceFieldsTested <- c(frameworkContext$sourceFieldsTested, '" + convertFieldToFullName(field) + "')"); writer.println(" }"); writer.println(" fields <- c(fields, \"" + sqlFieldName + "\")"); - writer.println(" values <- c(values, " + createSqlValueCode(rFieldName) + ")"); + writer.println(" values <- c(values, " + createValueCode(rFieldName) + ")"); writer.println(""); } writer.println(" inserts <- list(testId = frameworkContext$testId, testDescription = frameworkContext$testDescription, table = \"" + sqlTableName @@ -335,7 +336,7 @@ private void createLookupFunctions() { writer.println(" } else {"); writer.println(" statement <- paste0(statement, \" AND\")"); writer.println(" }"); - writer.println(" statement <- paste0(statement, \" " + sqlFieldName + " = \", " + createSqlValueCode(rFieldName) + ")"); + writer.println(" statement <- paste0(statement, \" " + sqlFieldName + "\"," + createSqlValueCode(rFieldName) + ")"); writer.println(" }"); writer.println(""); } @@ -454,7 +455,7 @@ private void createGenerateTestSqlFunction() { writer.println(" \"' AS test, CASE WHEN (SELECT COUNT(*) FROM @cdm_database_schema.\","); writer.println(" expect$table,"); writer.println(" \" WHERE \","); - writer.println(" paste(paste(expect$fields, operators, expect$values), collapse = \" AND \"),"); + writer.println(" paste(paste(expect$fields, expect$values), collapse = \" AND \"),"); writer.println(" \") \","); writer.println(" if (expect$type == " + DEFAULT + ") \"= 0\" else if (expect$type == " + NEGATE + ") \"!= 0\" else paste(\"!=\", expect$rowCount),"); @@ -581,7 +582,14 @@ private String convertToRName(String name) { return name; } - private String createSqlValueCode(String rFieldName) { + private String createSqlValueCode(String rFieldName) { + return "if (is.null(" + rFieldName + ")) \" IS NULL\" " + + "else if (is(" + rFieldName + ", \"subQuery\")) " + + "paste0(\" = (\", as.character(" + rFieldName + "), \")\") " + + "else paste0(\" = '\", as.character(" + rFieldName + "), \"'\")"; + } + + private String createValueCode(String rFieldName) { return "if (is.null(" + rFieldName + ")) \"NULL\" " + "else if (is(" + rFieldName + ", \"subQuery\")) " + "paste0(\"(\", as.character(" + rFieldName + "), \")\") " + diff --git a/rabbitinahat/src/main/java/org/ohdsi/rabbitInAHat/FilterDialog.java b/rabbitinahat/src/main/java/org/ohdsi/rabbitInAHat/FilterDialog.java index 259803b6..a39f6b14 100644 --- a/rabbitinahat/src/main/java/org/ohdsi/rabbitInAHat/FilterDialog.java +++ b/rabbitinahat/src/main/java/org/ohdsi/rabbitInAHat/FilterDialog.java @@ -8,6 +8,8 @@ import java.awt.event.FocusListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; import org.ohdsi.rabbitInAHat.ResizeListener; @@ -16,6 +18,7 @@ import javax.swing.JLabel; import javax.swing.JTextField; import javax.swing.SpringLayout; +import javax.swing.WindowConstants; public class FilterDialog extends JDialog implements ActionListener, ResizeListener { @@ -24,6 +27,7 @@ public class FilterDialog extends JDialog implements ActionListener, ResizeListe * */ private static final long serialVersionUID = 7009265246652874341L; + private static FilterDialog instance; private JTextField sourceSearchField; @@ -34,9 +38,11 @@ public class FilterDialog extends JDialog implements ActionListener, ResizeListe Container contentPane = this.getContentPane(); - public FilterDialog(Window parentWindow){ - - super(parentWindow,"Filter",ModalityType.MODELESS); + public FilterDialog(Window parentWindow) throws ExceptionInInitializerError{ + super(parentWindow,"Filter",ModalityType.MODELESS); + if (alreadyOpened()) { + throw new ExceptionInInitializerError("An instance of FilterDialog already exists"); + } this.setResizable(false); this.setLocation(parentWindow.getX()+parentWindow.getWidth()/2, parentWindow.getY()+100); @@ -96,7 +102,28 @@ public FilterDialog(Window parentWindow){ layout.putConstraint(SpringLayout.EAST, contentPane, 5, SpringLayout.EAST, targetClearBtn); this.pack(); - }; + + // Make sure the instance is reset to null when the search dialog window is closed + this.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); + this.addWindowListener(new WindowAdapter() { + @Override + public void windowClosing(WindowEvent arg0) { + instance = null; + } + }); + + instance = this; + } + + public static boolean alreadyOpened(){ + return (instance != null); + } + + public static void bringToFront(){ + if (alreadyOpened()) { + instance.toFront(); + } + } public void setFilterPanel(MappingPanel aFilterPanel){ if (filterPanel != null) { diff --git a/rabbitinahat/src/main/java/org/ohdsi/rabbitInAHat/RabbitInAHatMain.java b/rabbitinahat/src/main/java/org/ohdsi/rabbitInAHat/RabbitInAHatMain.java index 90996559..10ff392c 100644 --- a/rabbitinahat/src/main/java/org/ohdsi/rabbitInAHat/RabbitInAHatMain.java +++ b/rabbitinahat/src/main/java/org/ohdsi/rabbitInAHat/RabbitInAHatMain.java @@ -489,12 +489,14 @@ private void doSetTargetCDM(CDMVersion cdmVersion) { } private void doOpenFilterDialog() { - FilterDialog filter; - filter = new FilterDialog(frame); - - filter.setFilterPanel(tableMappingPanel); - - filter.setVisible(true); + if (FilterDialog.alreadyOpened()){ + FilterDialog.bringToFront(); + } + else { + FilterDialog filter = new FilterDialog(frame); + filter.setFilterPanel(tableMappingPanel); + filter.setVisible(true); + } } private void doMakeMappings() { diff --git a/whiterabbit/pom.xml b/whiterabbit/pom.xml index 2752e3ee..439bcfea 100644 --- a/whiterabbit/pom.xml +++ b/whiterabbit/pom.xml @@ -5,7 +5,7 @@ leporidae org.ohdsi - 0.10.1 + 0.10.2 4.0.0 @@ -24,8 +24,7 @@ appassembler-maven-plugin ${project.parent.basedir}/dist - - -Xmx2400m + -Xmx1200m org.ohdsi.whiteRabbit.WhiteRabbitMain