Search in sources :

Example 51 with Column

use of org.molgenis.emx2.Column in project molgenis-emx2 by molgenis.

the class TestGetSetAllTypesOnRows method addContents.

private void addContents(SchemaMetadata m, List<ColumnType> columnTypes) {
    TableMetadata t = m.create(table("TypeTest"));
    for (ColumnType columnType : columnTypes) {
        t.add(column("test" + columnType).setType(columnType).setRequired(true));
        t.add(column("test" + columnType + "_nullable").setType(columnType));
        t.add(column("test" + columnType + "_readonly").setType(columnType).setReadonly(true));
    }
}
Also used : ColumnType(org.molgenis.emx2.ColumnType)

Example 52 with Column

use of org.molgenis.emx2.Column in project molgenis-emx2 by molgenis.

the class SqlTable method executeTransaction.

private static int executeTransaction(Database db, String schemaName, String tableName, Iterable<Row> rows, MutationType transactionType) {
    long start = System.currentTimeMillis();
    final AtomicInteger count = new AtomicInteger(0);
    final Map<String, List<Row>> subclassRows = new LinkedHashMap<>();
    final Map<String, Set<String>> columnsProvided = new LinkedHashMap<>();
    SqlSchema schema = (SqlSchema) db.getSchema(schemaName);
    SqlTable table = schema.getTable(tableName);
    String tableClass = getMgTableClass(table.getMetadata());
    // validate
    if (table.getMetadata().getPrimaryKeys().isEmpty())
        throw new MolgenisException("Transaction failed: Table " + table.getName() + " cannot process row insert/update/delete requests because no primary key is defined");
    db.tx(db2 -> {
        for (Row row : rows) {
            // set table class if not set, and see for first time
            if (row.notNull(MG_TABLECLASS) && !subclassRows.containsKey(row.getString(MG_TABLECLASS))) {
                // validate
                String rowTableName = row.getString(MG_TABLECLASS);
                if (!rowTableName.contains(".")) {
                    if (schema.getTable(rowTableName) != null) {
                        row.setString(MG_TABLECLASS, schemaName + "." + rowTableName);
                    } else {
                        throw new MolgenisException(MG_TABLECLASS + " value failed in row " + count.get() + ": found '" + rowTableName + "'");
                    }
                } else {
                    String rowSchemaName = rowTableName.split("\\.")[0];
                    String rowTableName2 = rowTableName.split("\\.")[1];
                    if (db.getSchema(rowSchemaName) == null || db.getSchema(rowSchemaName).getTable(rowTableName2) == null) {
                        throw new MolgenisException("invalid value in column '" + MG_TABLECLASS + "' on row " + count.get() + ": found '" + rowTableName + "'");
                    }
                }
            } else {
                row.set(MG_TABLECLASS, tableClass);
            }
            // create batches for each table class
            String subclassName = row.getString(MG_TABLECLASS);
            if (!subclassRows.containsKey(subclassName)) {
                subclassRows.put(subclassName, new ArrayList<>());
            }
            // check columns provided didn't change
            if (columnsProvided.get(subclassName) == null) {
                columnsProvided.put(subclassName, new LinkedHashSet<>(row.getColumnNames()));
            }
            // execute batch if 1000 rows, or columns provided changes
            if (columnsProvidedAreDifferent(columnsProvided.get(subclassName), row) || subclassRows.get(subclassName).size() >= 1000) {
                executeBatch((SqlSchema) db2.getSchema(subclassName.split("\\.")[0]), transactionType, count, subclassRows, subclassName, columnsProvided.get(subclassName));
                // reset columns provided
                columnsProvided.get(subclassName).clear();
                columnsProvided.get(subclassName).addAll(row.getColumnNames());
            }
            // add to batch list, and execute if batch is large enough
            subclassRows.get(subclassName).add(row);
        }
        // execute any remaining batches
        for (Map.Entry<String, List<Row>> batch : subclassRows.entrySet()) {
            if (batch.getValue().size() > 0) {
                executeBatch((SqlSchema) db2.getSchema(batch.getKey().split("\\.")[0]), transactionType, count, subclassRows, batch.getKey(), columnsProvided.get(batch.getKey()));
            }
        }
    });
    log(db.getActiveUser(), table.getJooqTable().getName(), start, count, transactionType.name().toLowerCase() + "d (incl subclass if applicable)");
    return count.get();
}
Also used : AtomicInteger(java.util.concurrent.atomic.AtomicInteger) Row(org.molgenis.emx2.Row)

Example 53 with Column

use of org.molgenis.emx2.Column in project molgenis-emx2 by molgenis.

the class SqlTable method copyIn.

public void copyIn(Iterable<Row> rows) {
    db.getJooq().connection(connection -> {
        try {
            CopyManager cm = new CopyManager(connection.unwrap(BaseConnection.class));
            // must be batched
            StringBuilder tmp = new StringBuilder();
            tmp.append(this.getMetadata().getLocalColumnNames().stream().map(c -> "\"" + c + "\"").collect(Collectors.joining(",")) + "\n");
            for (Row row : rows) {
                StringBuilder line = new StringBuilder();
                for (Column c : this.getMetadata().getStoredColumns()) {
                    if (!row.containsName(c.getName())) {
                        line.append(",");
                    } else {
                        Object value = getTypedValue(row, c);
                        line.append(value + ",");
                    }
                }
                tmp.append(line.substring(0, line.length() - 1) + "\n");
            }
            String tableName = "\"" + getSchema().getMetadata().getName() + "\".\"" + getName() + "\"";
            String columnNames = "(" + this.getMetadata().getLocalColumnNames().stream().map(c -> "\"" + c + "\"").collect(Collectors.joining(",")) + ")";
            String sql = "COPY " + tableName + columnNames + " FROM STDIN (FORMAT CSV,HEADER )";
            cm.copyIn(sql, new StringReader(tmp.toString()));
        } catch (Exception e) {
            throw new MolgenisException("copyOut failed: ", e);
        }
    });
}
Also used : EvaluateExpressions.checkValidation(org.molgenis.emx2.sql.EvaluateExpressions.checkValidation) java.util(java.util) DSL(org.jooq.impl.DSL) Logger(org.slf4j.Logger) LocalDateTime(java.time.LocalDateTime) LoggerFactory(org.slf4j.LoggerFactory) Constants(org.molgenis.emx2.Constants) org.molgenis.emx2(org.molgenis.emx2) Collectors(java.util.stream.Collectors) EvaluateExpressions.checkForMissingVariablesColumns(org.molgenis.emx2.sql.EvaluateExpressions.checkForMissingVariablesColumns) ADMIN_USER(org.molgenis.emx2.sql.SqlDatabase.ADMIN_USER) Query(org.molgenis.emx2.Query) MutationType(org.molgenis.emx2.MutationType) StringReader(java.io.StringReader) Table(org.molgenis.emx2.Table) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) org.jooq(org.jooq) Writer(java.io.Writer) BaseConnection(org.postgresql.core.BaseConnection) CopyManager(org.postgresql.copy.CopyManager) SqlTypeUtils.getTypedValue(org.molgenis.emx2.sql.SqlTypeUtils.getTypedValue) Row(org.molgenis.emx2.Row) StringReader(java.io.StringReader) CopyManager(org.postgresql.copy.CopyManager) Row(org.molgenis.emx2.Row) BaseConnection(org.postgresql.core.BaseConnection)

Example 54 with Column

use of org.molgenis.emx2.Column in project molgenis-emx2 by molgenis.

the class SqlTable method updateBatch.

private static int updateBatch(SqlTable table, List<Row> rows, Set<String> updateColumns) {
    boolean inherit = table.getMetadata().getInherit() != null;
    if (inherit) {
        SqlTable inheritedTable = table.getInheritedTable();
        inheritedTable.updateBatch(inheritedTable, rows, updateColumns);
    }
    // get metadata
    Set<Column> columns = table.getColumnsToBeUpdated(updateColumns);
    List<Column> pkeyFields = table.getMetadata().getPrimaryKeyColumns();
    // check that columns exist for validation
    checkForMissingVariablesColumns(columns);
    // create batch of updates
    List<UpdateConditionStep> list = new ArrayList();
    String user = table.getSchema().getDatabase().getActiveUser();
    if (user == null) {
        user = ADMIN_USER;
    }
    LocalDateTime now = LocalDateTime.now();
    for (Row row : rows) {
        Map values = SqlTypeUtils.getValuesAsMap(row, columns);
        if (!inherit) {
            values.put(MG_UPDATEDBY, user);
            values.put(MG_UPDATEDON, now);
        }
        if (!row.isDraft()) {
            checkRequired(row, columns);
            checkValidation(values, columns);
        }
        list.add(table.getJooq().update(table.getJooqTable()).set(values).where(table.getUpdateCondition(row, pkeyFields)));
    }
    return Arrays.stream(table.getJooq().batch(list).execute()).reduce(Integer::sum).getAsInt();
}
Also used : LocalDateTime(java.time.LocalDateTime) Row(org.molgenis.emx2.Row)

Example 55 with Column

use of org.molgenis.emx2.Column in project molgenis-emx2 by molgenis.

the class SqlTableMetadata method dropColumn.

@Override
public void dropColumn(String name) {
    Column column = getColumn(name);
    if (column == null) {
        throw new MolgenisException("Drop column " + name + " failed: column does not exist");
    }
    // if changing 'ref' then check if not refBack exists
    checkNotRefback(name, column);
    long start = System.currentTimeMillis();
    // return silently, idempotent
    if (getColumn(name) == null)
        return;
    getDatabase().tx(db -> sync(dropColumnTransaction(db, getSchemaName(), getTableName(), name)));
    log(start, "removed column '" + name + "' from ");
}
Also used : MetadataUtils.deleteColumn(org.molgenis.emx2.sql.MetadataUtils.deleteColumn)

Aggregations

org.jaxdb.www.ddlx_0_5.xLygluGCXAA.$Column (org.jaxdb.www.ddlx_0_5.xLygluGCXAA.$Column)21 ArrayList (java.util.ArrayList)20 Test (org.junit.Test)20 Row (org.molgenis.emx2.Row)15 Table (org.molgenis.emx2.Table)14 HashMap (java.util.HashMap)11 Column (org.molgenis.emx2.Column)11 List (java.util.List)10 org.jaxdb.www.ddlx_0_5.xLygluGCXAA.$Bigint (org.jaxdb.www.ddlx_0_5.xLygluGCXAA.$Bigint)10 org.jaxdb.www.ddlx_0_5.xLygluGCXAA.$Smallint (org.jaxdb.www.ddlx_0_5.xLygluGCXAA.$Smallint)10 ColumnType (org.molgenis.emx2.ColumnType)10 Column (com.google.bigtable.v2.Column)9 TableMetadata (org.molgenis.emx2.TableMetadata)9 Family (com.google.bigtable.v2.Family)8 org.jaxdb.www.ddlx_0_5.xLygluGCXAA.$Tinyint (org.jaxdb.www.ddlx_0_5.xLygluGCXAA.$Tinyint)8 Schema (org.molgenis.emx2.Schema)8 MolgenisException (org.molgenis.emx2.MolgenisException)7 Collectors (java.util.stream.Collectors)6 Map (java.util.Map)5 org.jaxdb.www.ddlx_0_5.xLygluGCXAA.$Table (org.jaxdb.www.ddlx_0_5.xLygluGCXAA.$Table)5