=== modified file 'dhis-2/dhis-services/dhis-service-datamart-default/src/main/java/org/hisp/dhis/datamart/crosstab/DefaultCrossTabService.java' --- dhis-2/dhis-services/dhis-service-datamart-default/src/main/java/org/hisp/dhis/datamart/crosstab/DefaultCrossTabService.java 2011-01-20 21:08:24 +0000 +++ dhis-2/dhis-services/dhis-service-datamart-default/src/main/java/org/hisp/dhis/datamart/crosstab/DefaultCrossTabService.java 2011-04-13 16:09:45 +0000 @@ -53,7 +53,13 @@ private static final Log log = LogFactory.getLog( DefaultCrossTabService.class ); private static final int MAX_LENGTH = 20; - private static final int MAX_COLUMNS = 1500; + + private int maxColumns = 1500; + + public void setMaxColumns( int maxColumns ) + { + this.maxColumns = maxColumns; + } // ------------------------------------------------------------------------- // Dependencies @@ -94,7 +100,7 @@ { if ( validate( operands, periodIds, organisationUnitIds ) ) { - final PaginatedList operandList = new PaginatedList( operands, MAX_COLUMNS ); + final PaginatedList operandList = new PaginatedList( operands, maxColumns ); final List crossTabTableKeys = new ArrayList(); @@ -110,7 +116,7 @@ crossTabStore.createCrossTabTable( operandPage, key ); final BatchHandler batchHandler = batchHandlerFactory.createBatchHandler( GenericBatchHandler.class ); - batchHandler.setTableName( CrossTabStore.TABLE_NAME + key ); + batchHandler.setTableName( CrossTabStore.TABLE_PREFIX + key ); batchHandler.init(); for ( final Integer periodId : periodIds ) === modified file 'dhis-2/dhis-services/dhis-service-datamart-default/src/main/java/org/hisp/dhis/datamart/crosstab/jdbc/CrossTabStore.java' --- dhis-2/dhis-services/dhis-service-datamart-default/src/main/java/org/hisp/dhis/datamart/crosstab/jdbc/CrossTabStore.java 2011-01-20 21:08:24 +0000 +++ dhis-2/dhis-services/dhis-service-datamart-default/src/main/java/org/hisp/dhis/datamart/crosstab/jdbc/CrossTabStore.java 2011-04-13 16:09:45 +0000 @@ -40,8 +40,8 @@ public interface CrossTabStore { final String ID = CrossTabStore.class.getName(); - final String TABLE_NAME = "datavaluecrosstab_"; - final String TABLE_NAME_TRIMMED = "datavaluecrosstabtrimmed_"; + final String TABLE_PREFIX = "datavaluecrosstab_"; + final String TABLE_PREFIX_TRIMMED = "datavaluecrosstabtrimmed_"; /** * Filters and returns the DataElementOperands with data from the given === modified file 'dhis-2/dhis-services/dhis-service-datamart-default/src/main/java/org/hisp/dhis/datamart/crosstab/jdbc/JDBCCrossTabStore.java' --- dhis-2/dhis-services/dhis-service-datamart-default/src/main/java/org/hisp/dhis/datamart/crosstab/jdbc/JDBCCrossTabStore.java 2011-01-20 21:08:24 +0000 +++ dhis-2/dhis-services/dhis-service-datamart-default/src/main/java/org/hisp/dhis/datamart/crosstab/jdbc/JDBCCrossTabStore.java 2011-04-13 16:09:45 +0000 @@ -28,6 +28,7 @@ */ import static org.hisp.dhis.system.util.TextUtils.getCommaDelimitedString; +import static org.hisp.dhis.system.util.TextUtils.trimEnd; import java.sql.ResultSet; import java.sql.SQLException; @@ -46,9 +47,7 @@ */ public class JDBCCrossTabStore implements CrossTabStore -{ - private static final String ALIAS_PREFIX = "c"; - +{ // ------------------------------------------------------------------------- // Dependencies // ------------------------------------------------------------------------- @@ -94,7 +93,7 @@ try { - final StringBuffer sql = new StringBuffer( "CREATE TABLE " + TABLE_NAME + key + " ( " ); + final StringBuffer sql = new StringBuffer( "CREATE TABLE " + TABLE_PREFIX + key + " ( " ); sql.append( "periodid INTEGER NOT NULL, " ); sql.append( "sourceid INTEGER NOT NULL, " ); @@ -124,7 +123,7 @@ try { - final String sql = "DROP TABLE IF EXISTS " + TABLE_NAME + key; + final String sql = "DROP TABLE IF EXISTS " + TABLE_PREFIX + key; holder.getStatement().executeUpdate( sql ); } @@ -146,20 +145,13 @@ Collection periodIds, Collection sourceIds, List keys ) { final StatementHolder holder = statementManager.getHolder(); - + + String sql = getCrossTabSelectJoin( keys ); + + sql += " WHERE c.periodid IN (" + getCommaDelimitedString( periodIds ) + ") AND c.sourceid IN (" + getCommaDelimitedString( sourceIds ) + ")"; + try - { - String sql = "SELECT * FROM " + TABLE_NAME + keys.get( 0 ) + " AS c0 "; - - for ( int i = 1; i < keys.size(); i++ ) - { - final String alias = ALIAS_PREFIX + i; - - sql += "FULL JOIN " + TABLE_NAME + keys.get( i ) + " AS " + alias + " ON c0.periodid=" + alias + ".periodid AND c0.sourceid=" + alias + ".sourceid "; - } - - sql += "WHERE c0.periodid IN (" + getCommaDelimitedString( periodIds ) + ") AND c0.sourceid IN (" + getCommaDelimitedString( sourceIds ) + ")"; - + { final ResultSet resultSet = holder.getStatement().executeQuery( sql ); return getCrossTabDataValues( resultSet, operands ); @@ -178,20 +170,13 @@ Collection periodIds, int sourceId, List keys ) { final StatementHolder holder = statementManager.getHolder(); + + String sql = getCrossTabSelectJoin( keys ); + sql += " WHERE c.periodid IN (" + getCommaDelimitedString( periodIds ) + ") AND c.sourceid = " + sourceId; + try { - String sql = "SELECT * FROM " + TABLE_NAME + keys.get( 0 ) + " AS c0 "; - - for ( int i = 1; i < keys.size(); i++ ) - { - final String alias = ALIAS_PREFIX + i; - - sql += "FULL JOIN " + TABLE_NAME + keys.get( i ) + " AS " + alias + " ON c0.periodid=" + alias + ".periodid AND c0.sourceid=" + alias + ".sourceid "; - } - - sql += "WHERE c0.periodid IN (" + getCommaDelimitedString( periodIds ) + ") AND c0.sourceid=" + sourceId; - final ResultSet resultSet = holder.getStatement().executeQuery( sql ); return getCrossTabDataValues( resultSet, operands ); @@ -239,4 +224,39 @@ return values; } + + private String getCrossTabSelectJoin( List keys ) + { + String sql = "SELECT"; + + if ( keys.size() == 1 ) + { + sql += " * FROM " + TABLE_PREFIX + keys.get( 0 ) + " AS c"; + } + else + { + sql += " c.periodid, c.sourceid"; + + for ( String key : keys ) + { + sql += ", " + TABLE_PREFIX + key + ".*"; + } + + sql += " FROM ( SELECT DISTINCT periodid, sourceid FROM ("; + + for ( String key : keys ) + { + sql += " SELECT periodid, sourceid FROM " + TABLE_PREFIX + key + " UNION"; + } + + sql = trimEnd( sql, " UNION".length() ) + " ) AS x ) AS c"; + + for ( String key : keys ) + { + sql += " LEFT JOIN " + TABLE_PREFIX + key + " ON c.periodid = " + TABLE_PREFIX + key + ".periodid AND c.sourceid = " + TABLE_PREFIX + key + ".sourceid"; + } + } + + return sql; + } } === modified file 'dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/system/util/TextUtils.java' --- dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/system/util/TextUtils.java 2011-02-15 13:44:03 +0000 +++ dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/system/util/TextUtils.java 2011-04-13 16:09:45 +0000 @@ -62,6 +62,24 @@ return string.substring( beginIndex, endIndex ); } + + /** + * Trims the given string from the end. + * + * @param value the value to trim. + * @param length the number of characters to trim. + * @return the trimmed value, empty if given value is null or length is higher + * than the value length. + */ + public static String trimEnd( String value, int length ) + { + if ( value == null || length > value.length() ) + { + return ""; + } + + return value.substring( 0, value.length() - length ); + } /** * Transforms a collection of Integers into a comma delimited String. === modified file 'dhis-2/dhis-support/dhis-support-system/src/test/java/org/hisp/dhis/system/util/TextUtilsTest.java' --- dhis-2/dhis-support/dhis-support-system/src/test/java/org/hisp/dhis/system/util/TextUtilsTest.java 2011-01-25 19:27:15 +0000 +++ dhis-2/dhis-support/dhis-support-system/src/test/java/org/hisp/dhis/system/util/TextUtilsTest.java 2011-04-13 16:09:45 +0000 @@ -27,19 +27,20 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -import junit.framework.TestCase; +import static org.hisp.dhis.system.util.TextUtils.*; +import static junit.framework.Assert.*; -import static org.hisp.dhis.system.util.TextUtils.subString; +import org.junit.Test; /** * @author Lars Helge Overland * @version $Id $ */ public class TextUtilsTest - extends TestCase { private static final String STRING = "abcdefghij"; + @Test public void testSubString() { assertEquals( "abcdefghij", subString( STRING, 0, 10 ) ); @@ -56,4 +57,10 @@ assertEquals( "", subString( STRING, 4, 0 ) ); } + + @Test + public void testTrim() + { + assertEquals( "abcdefgh", trimEnd( "abcdefghijkl", 4 ) ); + } }