Skip to content

Commit

Permalink
Move predicate view column name responsibility to SqlManager
Browse files Browse the repository at this point in the history
  • Loading branch information
minborg committed Aug 20, 2016
1 parent f60bd6c commit eccc6c0
Show file tree
Hide file tree
Showing 13 changed files with 81 additions and 77 deletions.
6 changes: 3 additions & 3 deletions src/main/java/com/speedment/db/DatabaseNamingConvention.java
Expand Up @@ -53,11 +53,11 @@ public interface DatabaseNamingConvention {
* with a separator, but that might be different in different
* implementations.
*
* @param schemaName schema name
* @param tableName table name
* @param parentName parent name (e.g. schema name or table bane)
* @param targetName target name (e.g. table name or column name)
* @return the full name
*/
String fullNameOf(String schemaName, String tableName);
String fullNameOf(String parentName, String targetName);

/**
* Returns the full name used in the database for the specified
Expand Down
Expand Up @@ -48,7 +48,7 @@ public final class MariaDbDbmsType {
.withDatabaseNamingConvention(NAMER)
.withDbmsMapper(MySqlDbmsHandler::new)
.withConnectionUrlGenerator(new MariaDbConnectionUrlGenerator())
.withSpeedmentPredicateView(new MySqlSpeedmentPredicateView(NAMER))
.withSpeedmentPredicateView(new MySqlSpeedmentPredicateView())

// Optional parameters
.withInitialQuery("select version() as `MariaDB version`")
Expand Down
Expand Up @@ -49,7 +49,7 @@ public final class MySqlDbmsType {
.withDatabaseNamingConvention(NAMER)
.withDbmsMapper(MySqlDbmsHandler::new)
.withConnectionUrlGenerator(new MySqlConnectionUrlGenerator())
.withSpeedmentPredicateView(new MySqlSpeedmentPredicateView(NAMER))
.withSpeedmentPredicateView(new MySqlSpeedmentPredicateView())

// Optional parameters
.withInitialQuery("select version() as `MySQL version`")
Expand Down
Expand Up @@ -52,7 +52,7 @@ public final class PostgresDbmsType {
.withDatabaseNamingConvention(NAMER)
.withDbmsMapper(PostgresDbmsHandler::new)
.withConnectionUrlGenerator(new PostgresConnectionUrlGenerator())
.withSpeedmentPredicateView(new PostgresSpeedmentPredicateView(NAMER))
.withSpeedmentPredicateView(new PostgresSpeedmentPredicateView())
// Optional parameters
.withInitialQuery("select version() as \"PostgreSQL version\"")
.withResultSetTableSchema("TABLE_SCHEM")
Expand Down
Expand Up @@ -39,9 +39,9 @@ public String fullNameOf(String schemaName, String tableName, String columnName)
}

@Override
public String fullNameOf(String schemaName, String tableName) {
return encloseField(schemaName) + DEFAULT_DELIMITER
+ encloseField(tableName);
public String fullNameOf(String parentName, String targetName) {
return encloseField(parentName) + DEFAULT_DELIMITER
+ encloseField(targetName);
}

// @Override
Expand Down
Expand Up @@ -16,7 +16,6 @@
*/
package com.speedment.internal.core.manager.sql;

import com.speedment.db.DatabaseNamingConvention;
import com.speedment.field.Inclusion;
import com.speedment.field.predicate.PredicateType;
import static com.speedment.field.predicate.PredicateType.NOT_BETWEEN;
Expand All @@ -43,11 +42,11 @@
*/
public abstract class AbstractSpeedmentPredicateView implements SpeedmentPredicateView {

private final DatabaseNamingConvention namingConvention;
// private final DatabaseNamingConvention namingConvention;

protected AbstractSpeedmentPredicateView(DatabaseNamingConvention namingConvention) {
this.namingConvention = requireNonNull(namingConvention);
}
// protected AbstractSpeedmentPredicateView(DatabaseNamingConvention namingConvention) {
// this.namingConvention = requireNonNull(namingConvention);
// }

protected abstract SqlPredicateFragment equalIgnoreCaseHelper(String cn, SpeedmentPredicate<?, ?, ?> model, boolean negated);

Expand All @@ -58,14 +57,18 @@ protected AbstractSpeedmentPredicateView(DatabaseNamingConvention namingConventi
protected abstract SqlPredicateFragment containsHelper(String cn, SpeedmentPredicate<?, ?, ?> model, boolean negated);

@Override
public SqlPredicateFragment transform(SpeedmentPredicate<?, ?, ?> model) {
return render(requireNonNull(model));
public SqlPredicateFragment transform(SqlManager<?> manager, SpeedmentPredicate<?, ?, ?> model) {
return render(requireNonNull(manager), requireNonNull(model));
}

protected SqlPredicateFragment render(SpeedmentPredicate<?, ?, ?> model) {
protected SqlPredicateFragment render(SqlManager<?> manager, SpeedmentPredicate<?, ?, ?> model) {
final PredicateType pt = model.getEffectivePredicateType();

final String cn = namingConvention.fullNameOf(model.getField().getIdentifier());
/// final String cn = namingConvention.fullNameOf(model.getField().getIdentifier()); Previously

//final String cn = namingConvention.encloseField(model.getField().getIdentifier().columnName()); Doesn't work for VC

final String cn = manager.fullColumnName(model.getField()); // Let the manager resolve the name

switch (pt) {
// Constants
Expand Down
Expand Up @@ -550,4 +550,9 @@ public Struct createStruct(String typeName, Object[] attributes) throws SQLExcep
return dbmsHandler().createStruct(typeName, attributes);
}

@Override
public String fullColumnName(FieldTrait fieldTrait) {
return naming().fullNameOf(fieldTrait.getIdentifier());
}

}
Expand Up @@ -16,7 +16,6 @@
*/
package com.speedment.internal.core.manager.sql;

import com.speedment.db.DatabaseNamingConvention;
import com.speedment.field.predicate.SpeedmentPredicate;
import static com.speedment.internal.core.field.predicate.PredicateUtil.*;
import com.speedment.manager.SpeedmentPredicateView;
Expand All @@ -29,9 +28,6 @@
@SuppressWarnings("rawtypes")
public final class MySqlSpeedmentPredicateView extends AbstractSpeedmentPredicateView implements SpeedmentPredicateView {

public MySqlSpeedmentPredicateView(DatabaseNamingConvention namingConvention) {
super(namingConvention);
}

@Override
protected SqlPredicateFragment equalIgnoreCaseHelper(String cn, SpeedmentPredicate<?, ?, ?> model, boolean negated) {
Expand Down
Expand Up @@ -16,7 +16,6 @@
*/
package com.speedment.internal.core.manager.sql;

import com.speedment.db.DatabaseNamingConvention;
import com.speedment.field.predicate.SpeedmentPredicate;
import static com.speedment.internal.core.field.predicate.PredicateUtil.getFirstOperandAsRaw;
import static com.speedment.internal.core.manager.sql.AbstractSpeedmentPredicateView.of;
Expand All @@ -29,10 +28,6 @@
* @author Fatih Dirlikli
*/
public class PostgresSpeedmentPredicateView extends AbstractSpeedmentPredicateView implements SpeedmentPredicateView {

public PostgresSpeedmentPredicateView(DatabaseNamingConvention namingConvention) {
super(namingConvention);
}

// Info from:
// http://stackoverflow.com/questions/23320945/postgresql-select-if-string-contains
Expand Down
Expand Up @@ -17,6 +17,7 @@
package com.speedment.internal.core.manager.sql;

import com.speedment.db.SqlFunction;
import com.speedment.field.trait.FieldTrait;
import com.speedment.manager.Manager;
import java.sql.ResultSet;

Expand All @@ -31,4 +32,12 @@ public interface SqlManager<ENTITY> extends Manager<ENTITY> {

void setEntityMapper(SqlFunction<ResultSet, ENTITY> entityMapper);

/**
* Returns the fully qualified name for this field.
*
* @param fieldTrait to use
* @return the fully qualified name for this field
*/
String fullColumnName(FieldTrait fieldTrait);

}
Expand Up @@ -16,12 +16,11 @@
*/
package com.speedment.internal.core.manager.sql;

import com.speedment.config.db.Column;
import com.speedment.config.db.mapper.TypeMapper;
import com.speedment.db.AsynchronousQueryResult;
import com.speedment.field.FieldIdentifier;
import com.speedment.field.predicate.SpeedmentPredicate;
import com.speedment.field.trait.FieldTrait;
import com.speedment.field.trait.ReferenceFieldTrait;
import com.speedment.internal.core.stream.builder.pipeline.DoublePipeline;
import com.speedment.internal.core.stream.builder.pipeline.IntPipeline;
import com.speedment.internal.core.stream.builder.pipeline.LongPipeline;
Expand Down Expand Up @@ -50,121 +49,117 @@
* @param <ENTITY> the entity type
*/
public final class SqlStreamTerminator<ENTITY> implements StreamTerminator {

private final AbstractSqlManager<ENTITY> manager;
private final AsynchronousQueryResult<ENTITY> asynchronousQueryResult;
private final StreamDecorator decorator;

public SqlStreamTerminator(AbstractSqlManager<ENTITY> manager, AsynchronousQueryResult<ENTITY> asynchronousQueryResult, StreamDecorator decorator) {
this.manager = requireNonNull(manager);
this.asynchronousQueryResult = requireNonNull(asynchronousQueryResult);
this.decorator = requireNonNull(decorator);
}

@Override
public StreamDecorator getStreamDecorator() {
return decorator;
}

@Override
public <P extends Pipeline> P optimize(P initialPipeline) {
requireNonNull(initialPipeline);
final List<SpeedmentPredicate<ENTITY, ?, ?>> andPredicateBuilders = StreamTerminatorUtil.topLevelAndPredicates(initialPipeline);

if (!andPredicateBuilders.isEmpty()) {
modifySource(andPredicateBuilders, asynchronousQueryResult);
}

return getStreamDecorator().apply(initialPipeline);
}

public void modifySource(final List<SpeedmentPredicate<ENTITY, ?, ?>> predicateBuilders, AsynchronousQueryResult<ENTITY> qr) {
requireNonNull(predicateBuilders);
requireNonNull(qr);
if (predicateBuilders.isEmpty()) {
// Nothing to do...
return;
}

final List<Column> columns = predicateBuilders
.stream()
.map(SpeedmentPredicate::getField)
.map(FieldTrait::getIdentifier)
.map(FieldIdentifier::columnName)
.map(this::findColumn)
.collect(toList());

// final List<FieldTrait> fields = predicateBuilders
// .stream()
// .map(SpeedmentPredicate::getField)
// .collect(toList());
final SpeedmentPredicateView spv = manager.getDbmsType().getSpeedmentPredicateView();
final List<SqlPredicateFragment> fragments = predicateBuilders.stream()
.map(spv::transform)
.collect(toList());

final String sql = manager.sqlSelect() +
" WHERE " +
fragments.stream()
.map(SqlPredicateFragment::getSql)
.collect(joining(" AND "))
;
.map(sp -> spv.transform(manager, sp))
.collect(toList());

final String sql = manager.sqlSelect()
+ " WHERE "
+ fragments.stream()
.map(SqlPredicateFragment::getSql)
.collect(joining(" AND "));

final List<Object> values = new ArrayList<>();
for (int i = 0; i < fragments.size(); i++) {
final SpeedmentPredicate<ENTITY, ?, ?> p = predicateBuilders.get(i);
@SuppressWarnings("unchecked")
final TypeMapper<Object, Object> tm = (TypeMapper<Object, Object>) columns.get(i).findTypeMapper();
final ReferenceFieldTrait<?, ?, ?> referenceFieldTrait = p.getReferenceField();
// @SuppressWarnings("unchecked")
// final ReferenceFieldTrait<?, ?, ?> referenceFieldTrait = (ReferenceFieldTrait<?, ?, ?>)fields.get(i);
@SuppressWarnings("unchecked")
final TypeMapper<Object, Object> tm = (TypeMapper<Object, Object>) referenceFieldTrait.typeMapper();
fragments.get(i).objects()
.map(tm::toDatabaseType)
.forEach(values::add);
.map(tm::toDatabaseType)
.forEach(values::add);
}

qr.setSql(sql);
qr.setValues(values);
}

private Column findColumn(String name) {
return manager.getTable().columns()
.filter(c -> name.equals(c.getName()))
.findAny().get();
qr.setValues(values);
}

@Override
public long count(DoublePipeline pipeline) {
requireNonNull(pipeline);
return countHelper(pipeline, () -> StreamTerminator.super.count(pipeline));
}

@Override
public long count(IntPipeline pipeline) {
requireNonNull(pipeline);
return countHelper(pipeline, () -> StreamTerminator.super.count(pipeline));
}

@Override
public long count(LongPipeline pipeline) {
requireNonNull(pipeline);
return countHelper(pipeline, () -> StreamTerminator.super.count(pipeline));
}

@Override
public <T> long count(ReferencePipeline<T> pipeline) {
requireNonNull(pipeline);
return countHelper(pipeline, () -> StreamTerminator.super.count(pipeline));
}

private static final Predicate<Action<?, ?>> CHECK_RETAIN_SIZE = action -> action.is(PRESERVE, SIZE);

/**
* Optimizer for count operations.
*
* @param pipeline the pipeline
* @param fallbackSupplier a fallback supplier should every item be size
* retaining
* @param pipeline the pipeline
* @param fallbackSupplier a fallback supplier should every item be size
* retaining
* @return the number of rows
*/
private long countHelper(Pipeline pipeline, LongSupplier fallbackSupplier) {
requireNonNulls(pipeline, fallbackSupplier);

if (pipeline.stream().allMatch(CHECK_RETAIN_SIZE)) {
return manager.count();
} else return fallbackSupplier.getAsLong();
} else {
return fallbackSupplier.getAsLong();
}
}

}
2 changes: 1 addition & 1 deletion src/main/java/com/speedment/manager/Manager.java
Expand Up @@ -469,5 +469,5 @@ default Stream<ENTITY> stream() {
*
* @return the {@link Speedment} instance for this Manager
*/
Speedment speedment();
Speedment speedment();
}
Expand Up @@ -17,6 +17,7 @@
package com.speedment.manager;

import com.speedment.field.predicate.SpeedmentPredicate;
import com.speedment.internal.core.manager.sql.SqlManager;

/**
*
Expand All @@ -25,6 +26,6 @@
@FunctionalInterface
public interface SpeedmentPredicateView {

SqlPredicateFragment transform(SpeedmentPredicate<?, ?, ?> model);
SqlPredicateFragment transform(SqlManager<?> manager, SpeedmentPredicate<?, ?, ?> model);

}

0 comments on commit eccc6c0

Please sign in to comment.