
it.unibz.inf.ontop.generation.serializer.impl.BigQuerySelectFromWhereSerializer Maven / Gradle / Ivy
The newest version!
package it.unibz.inf.ontop.generation.serializer.impl;
import com.google.common.collect.ImmutableMap;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import it.unibz.inf.ontop.dbschema.DBParameters;
import it.unibz.inf.ontop.dbschema.QualifiedAttributeID;
import it.unibz.inf.ontop.dbschema.RelationID;
import it.unibz.inf.ontop.generation.algebra.SQLFlattenExpression;
import it.unibz.inf.ontop.generation.algebra.SelectFromWhereWithModifiers;
import it.unibz.inf.ontop.generation.serializer.SelectFromWhereSerializer;
import it.unibz.inf.ontop.model.term.TermFactory;
import it.unibz.inf.ontop.model.term.Variable;
import it.unibz.inf.ontop.model.type.DBTermType;
import it.unibz.inf.ontop.utils.ImmutableCollectors;
import java.util.Optional;
@Singleton
public class BigQuerySelectFromWhereSerializer extends DefaultSelectFromWhereSerializer implements SelectFromWhereSerializer {
@Inject
private BigQuerySelectFromWhereSerializer(TermFactory termFactory) {
super(new DefaultSQLTermSerializer(termFactory) {
@Override
protected String serializeDatetimeConstant(String datetime, DBTermType dbType) {
return String.format("TIMESTAMP %s", serializeStringConstant(datetime));
}
});
}
@Override
public QuerySerialization serialize(SelectFromWhereWithModifiers selectFromWhere, DBParameters dbParameters) {
return selectFromWhere.acceptVisitor(
new DefaultRelationVisitingSerializer(dbParameters.getQuotedIDFactory()) {
private static final String VIEW_PREFIX = "r";
@Override
protected String serializeLimitOffset(long limit, long offset, boolean noSortCondition) {
return String.format("LIMIT %d OFFSET %d", limit, offset);
}
@Override
protected String serializeOffset(long offset, boolean noSortCondition) {
//OFFSET is not available without LIMIT, so we add a very large LIMIT
return String.format("LIMIT 9999999999 OFFSET %d", offset);
}
@Override
protected RelationID generateFreshViewAlias() {
return idFactory.createRelationID(VIEW_PREFIX + viewCounter.incrementAndGet());
}
@Override
protected QuerySerialization serializeFlatten(SQLFlattenExpression sqlFlattenExpression, Variable flattenedVar, Variable outputVar, Optional indexVar, DBTermType flattenedType, ImmutableMap allColumnIDs, QuerySerialization subQuerySerialization) {
//We build the query string of the form SELECT FROM CROSS JOIN UNNEST() WITH OFFSET
StringBuilder builder = new StringBuilder();
builder.append(
String.format(
"%s CROSS JOIN UNNEST(%s) %s ",
subQuerySerialization.getString(),
allColumnIDs.get(flattenedVar).getSQLRendering(),
allColumnIDs.get(outputVar).getSQLRendering()
));
indexVar.ifPresent( v -> builder.append(String.format(" WITH OFFSET %s ", allColumnIDs.get(indexVar.get()).getSQLRendering())));
return new QuerySerializationImpl(
builder.toString(),
allColumnIDs.entrySet().stream()
.filter(e -> e.getKey() != flattenedVar)
.collect(ImmutableCollectors.toMap())
);
}
});
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy