Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance. Project price only 1 $
You can buy this project and download/modify it how often you want.
getTableExporter() {
return this.spannerTableExporter;
}
/* SELECT-related functions */
@Override
public boolean supportsCurrentTimestampSelection() {
return true;
}
@Override
public boolean isCurrentTimestampSelectStringCallable() {
return false;
}
@Override
public String getCurrentTimestampSelectString() {
return "select current_timestamp() as now";
}
@Override
public void appendBooleanValueString(SqlAppender appender, boolean bool) {
appender.appendSql( bool );
}
@Override
public String translateExtractField(TemporalUnit unit) {
switch (unit) {
case WEEK:
return "isoweek";
case DAY_OF_MONTH:
return "day";
case DAY_OF_WEEK:
return "dayofweek";
case DAY_OF_YEAR:
return "dayofyear";
default:
return super.translateExtractField(unit);
}
}
@Override
public String timestampaddPattern(TemporalUnit unit, TemporalType temporalType, IntervalType intervalType) {
if ( temporalType == TemporalType.TIMESTAMP ) {
switch (unit) {
case YEAR:
case QUARTER:
case MONTH:
throw new SemanticException("Illegal unit for timestamp_add(): " + unit);
default:
return "timestamp_add(?3,interval ?2 ?1)";
}
}
else {
switch (unit) {
case NANOSECOND:
case SECOND:
case MINUTE:
case HOUR:
case NATIVE:
throw new SemanticException("Illegal unit for date_add(): " + unit);
default:
return "date_add(?3,interval ?2 ?1)";
}
}
}
@Override
public String timestampdiffPattern(TemporalUnit unit, TemporalType fromTemporalType, TemporalType toTemporalType) {
if ( toTemporalType == TemporalType.TIMESTAMP || fromTemporalType == TemporalType.TIMESTAMP ) {
switch (unit) {
case YEAR:
case QUARTER:
case MONTH:
throw new SemanticException("Illegal unit for timestamp_diff(): " + unit);
default:
return "timestamp_diff(?3,?2,?1)";
}
}
else {
switch (unit) {
case NANOSECOND:
case SECOND:
case MINUTE:
case HOUR:
case NATIVE:
throw new SemanticException("Illegal unit for date_diff(): " + unit);
default:
return "date_diff(?3,?2,?1)";
}
}
}
@Override
public void appendDatetimeFormat(SqlAppender appender, String format) {
appender.appendSql( datetimeFormat( format ).result() );
}
public static Replacer datetimeFormat(String format) {
return MySQLDialect.datetimeFormat(format)
//day of week
.replace("EEEE", "%A")
.replace("EEE", "%a")
//minute
.replace("mm", "%M")
.replace("m", "%M")
//month of year
.replace("MMMM", "%B")
.replace("MMM", "%b")
.replace("MM", "%m")
.replace("M", "%m")
//week of year
.replace("ww", "%V")
.replace("w", "%V")
//year for week
.replace("YYYY", "%G")
.replace("YYY", "%G")
.replace("YY", "%g")
.replace("Y", "%g")
//timezones
.replace("zzz", "%Z")
.replace("zz", "%Z")
.replace("z", "%Z")
.replace("ZZZ", "%z")
.replace("ZZ", "%z")
.replace("Z", "%z")
.replace("xxx", "%Ez")
.replace("xx", "%z"); //note special case
}
/* DDL-related functions */
@Override
public boolean canCreateSchema() {
return false;
}
@Override
public String[] getCreateSchemaCommand(String schemaName) {
throw new UnsupportedOperationException(
"No create schema syntax supported by " + getClass().getName() );
}
@Override
public String[] getDropSchemaCommand(String schemaName) {
throw new UnsupportedOperationException(
"No drop schema syntax supported by " + getClass().getName() );
}
@Override
public String getCurrentSchemaCommand() {
throw new UnsupportedOperationException(
"No current schema syntax supported by " + getClass().getName() );
}
@Override
public SchemaNameResolver getSchemaNameResolver() {
// Spanner does not have a notion of database name schemas, so return "".
return (connection, dialect) -> "";
}
@Override
public boolean dropConstraints() {
return false;
}
@Override
public boolean qualifyIndexName() {
return false;
}
@Override
public String getDropForeignKeyString() {
throw new UnsupportedOperationException(
"Cannot drop foreign-key constraint because Cloud Spanner does not support foreign keys." );
}
@Override
public String getAddForeignKeyConstraintString(
String constraintName,
String[] foreignKey,
String referencedTable,
String[] primaryKey,
boolean referencesPrimaryKey) {
throw new UnsupportedOperationException(
"Cannot add foreign-key constraint because Cloud Spanner does not support foreign keys." );
}
@Override
public String getAddForeignKeyConstraintString(
String constraintName,
String foreignKeyDefinition) {
throw new UnsupportedOperationException(
"Cannot add foreign-key constraint because Cloud Spanner does not support foreign keys." );
}
@Override
public String getAddPrimaryKeyConstraintString(String constraintName) {
throw new UnsupportedOperationException( "Cannot add primary key constraint in Cloud Spanner." );
}
/* Lock acquisition functions */
@Override
public boolean supportsLockTimeouts() {
return false;
}
@Override
public LockingStrategy getLockingStrategy(Lockable lockable, LockMode lockMode) {
return LOCKING_STRATEGY;
}
@Override
public String getForUpdateString(LockOptions lockOptions) {
return "";
}
@Override
public String getForUpdateString() {
return "";
}
@Override
public String getForUpdateString(String aliases) {
throw new UnsupportedOperationException(
"Cloud Spanner does not support selecting for lock acquisition." );
}
@Override
public String getForUpdateString(String aliases, LockOptions lockOptions) {
throw new UnsupportedOperationException(
"Cloud Spanner does not support selecting for lock acquisition." );
}
@Override
public String getWriteLockString(int timeout) {
throw new UnsupportedOperationException(
"Cloud Spanner does not support selecting for lock acquisition." );
}
@Override
public String getWriteLockString(String aliases, int timeout) {
throw new UnsupportedOperationException(
"Cloud Spanner does not support selecting for lock acquisition." );
}
@Override
public String getReadLockString(int timeout) {
throw new UnsupportedOperationException(
"Cloud Spanner does not support selecting for lock acquisition." );
}
@Override
public String getReadLockString(String aliases, int timeout) {
throw new UnsupportedOperationException(
"Cloud Spanner does not support selecting for lock acquisition." );
}
@Override
public boolean supportsOuterJoinForUpdate() {
return false;
}
@Override
public String getForUpdateNowaitString() {
throw new UnsupportedOperationException(
"Cloud Spanner does not support selecting for lock acquisition." );
}
@Override
public String getForUpdateNowaitString(String aliases) {
throw new UnsupportedOperationException(
"Cloud Spanner does not support selecting for lock acquisition." );
}
@Override
public String getForUpdateSkipLockedString() {
throw new UnsupportedOperationException(
"Cloud Spanner does not support selecting for lock acquisition." );
}
@Override
public String getForUpdateSkipLockedString(String aliases) {
throw new UnsupportedOperationException(
"Cloud Spanner does not support selecting for lock acquisition." );
}
/* Unsupported Hibernate Exporters */
@Override
public Exporter getSequenceExporter() {
return NOOP_EXPORTER;
}
@Override
public Exporter getForeignKeyExporter() {
return NOOP_EXPORTER;
}
@Override
public Exporter getUniqueKeyExporter() {
return NOOP_EXPORTER;
}
@Override
public String applyLocksToSql(
String sql,
LockOptions aliasedLockOptions,
Map keyColumnNames) {
return sql;
}
@Override
public UniqueDelegate getUniqueDelegate() {
return NOOP_UNIQUE_DELEGATE;
}
@Override
public boolean supportsCircularCascadeDeleteConstraints() {
return false;
}
@Override
public boolean supportsCascadeDelete() {
return false;
}
@Override
public boolean supportsOffsetInSubquery() {
return true;
}
@Override
public char openQuote() {
return '`';
}
@Override
public char closeQuote() {
return '`';
}
@Override
public LimitHandler getLimitHandler() {
return LimitOffsetLimitHandler.INSTANCE;
}
/* Type conversion and casting */
/**
* A no-op {@link Exporter} which is responsible for returning empty Create and Drop SQL strings.
*
* @author Daniel Zou
*/
static class EmptyExporter implements Exporter {
@Override
public String[] getSqlCreateStrings(T exportable, Metadata metadata, SqlStringGenerationContext context) {
return ArrayHelper.EMPTY_STRING_ARRAY;
}
@Override
public String[] getSqlDropStrings(T exportable, Metadata metadata, SqlStringGenerationContext context) {
return ArrayHelper.EMPTY_STRING_ARRAY;
}
}
/**
* A locking strategy for the Cloud Spanner dialect that does nothing. Cloud Spanner does not
* support locking.
*
* @author Chengyuan Zhao
*/
static class DoNothingLockingStrategy implements LockingStrategy {
@Override
public void lock(
Object id, Object version, Object object, int timeout, EventSource session)
throws StaleObjectStateException, LockingStrategyException {
// Do nothing. Cloud Spanner doesn't have have locking strategies.
}
}
/**
* A no-op delegate for generating Unique-Constraints. Cloud Spanner offers unique-restrictions
* via interleaved indexes with the "UNIQUE" option. This is not currently supported.
*
* @author Chengyuan Zhao
*/
static class DoNothingUniqueDelegate implements UniqueDelegate {
@Override
public String getColumnDefinitionUniquenessFragment(Column column, SqlStringGenerationContext context) {
return "";
}
@Override
public String getTableCreationUniqueConstraintsFragment(Table table, SqlStringGenerationContext context) {
return "";
}
@Override
public String getAlterTableToAddUniqueKeyCommand(UniqueKey uniqueKey, Metadata metadata, SqlStringGenerationContext context) {
return "";
}
@Override
public String getAlterTableToDropUniqueKeyCommand(UniqueKey uniqueKey, Metadata metadata, SqlStringGenerationContext context) {
return "";
}
}
}