All Downloads are FREE. Search and download functionalities are using the official Maven repository.
Please wait. This can take some minutes ...
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.
ru.yandex.clickhouse.jdbc.parser.ClickHouseSqlStatement Maven / Gradle / Ivy
package ru.yandex.clickhouse.jdbc.parser;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Map.Entry;
public class ClickHouseSqlStatement {
public static final String DEFAULT_DATABASE = "system";
public static final String DEFAULT_TABLE = "unknown";
public static final List DEFAULT_PARAMETERS = Collections.emptyList();
public static final Map DEFAULT_POSITIONS = Collections.emptyMap();
public static final String KEYWORD_DATABASE = "DATABASE";
public static final String KEYWORD_EXISTS = "EXISTS";
public static final String KEYWORD_FORMAT = "FORMAT";
public static final String KEYWORD_REPLACE = "REPLACE";
public static final String KEYWORD_TOTALS = "TOTALS";
public static final String KEYWORD_VALUES = "VALUES";
private final String sql;
private final StatementType stmtType;
private final String cluster;
private final String database;
private final String table;
private final String format;
private final String outfile;
private final List parameters;
private final Map positions;
public ClickHouseSqlStatement(String sql) {
this(sql, StatementType.UNKNOWN, null, null, null, null, null, null, null);
}
public ClickHouseSqlStatement(String sql, StatementType stmtType) {
this(sql, stmtType, null, null, null, null, null, null, null);
}
public ClickHouseSqlStatement(String sql, StatementType stmtType, String cluster, String database, String table,
String format, String outfile, List parameters, Map positions) {
this.sql = sql;
this.stmtType = stmtType;
this.cluster = cluster;
this.database = database;
this.table = table == null || table.isEmpty() ? DEFAULT_TABLE : table;
this.format = format;
this.outfile = outfile;
if (parameters != null && parameters.size() > 0) {
this.parameters = Collections.unmodifiableList(parameters);
} else {
this.parameters = DEFAULT_PARAMETERS;
}
if (positions != null && positions.size() > 0) {
Map p = new HashMap<>();
for (Entry e : positions.entrySet()) {
String keyword = e.getKey();
Integer position = e.getValue();
if (keyword != null && position != null) {
p.put(keyword.toUpperCase(Locale.ROOT), position);
}
}
this.positions = Collections.unmodifiableMap(p);
} else {
this.positions = DEFAULT_POSITIONS;
}
}
public String getSQL() {
return this.sql;
}
public boolean isRecognized() {
return stmtType != StatementType.UNKNOWN;
}
public boolean isDDL() {
return this.stmtType.getLanguageType() == LanguageType.DDL;
}
public boolean isDML() {
return this.stmtType.getLanguageType() == LanguageType.DML;
}
public boolean isQuery() {
return this.stmtType.getOperationType() == OperationType.READ && !this.hasOutfile();
}
public boolean isMutation() {
return this.stmtType.getOperationType() == OperationType.WRITE || this.hasOutfile();
}
public boolean isIdemponent() {
boolean result = this.stmtType.isIdempotent() && !this.hasOutfile();
if (!result) { // try harder
switch (this.stmtType) {
case ATTACH:
case CREATE:
case DETACH:
case DROP:
result = positions.containsKey(KEYWORD_EXISTS) || positions.containsKey(KEYWORD_REPLACE);
break;
default:
break;
}
}
return result;
}
public LanguageType getLanguageType() {
return this.stmtType.getLanguageType();
}
public OperationType getOperationType() {
return this.stmtType.getOperationType();
}
public StatementType getStatementType() {
return this.stmtType;
}
public String getCluster() {
return this.cluster;
}
public String getDatabase() {
return this.database;
}
public String getDatabaseOrDefault(String database) {
return this.database == null ? (database == null ? DEFAULT_DATABASE : database) : this.database;
}
public String getTable() {
return this.table;
}
public String getFormat() {
return this.format;
}
public String getOutfile() {
return this.outfile;
}
public boolean containsKeyword(String keyword) {
if (keyword == null || keyword.isEmpty()) {
return false;
}
return positions.containsKey(keyword.toUpperCase(Locale.ROOT));
}
public boolean hasFormat() {
return this.format != null && !this.format.isEmpty();
}
public boolean hasOutfile() {
return this.outfile != null && !this.outfile.isEmpty();
}
public boolean hasWithTotals() {
return this.positions.containsKey(KEYWORD_TOTALS);
}
public boolean hasValues() {
return this.positions.containsKey(KEYWORD_VALUES);
}
public List getParameters() {
return this.parameters;
}
public int getStartPosition(String keyword) {
int position = -1;
if (!this.positions.isEmpty() && keyword != null) {
Integer p = this.positions.get(keyword.toUpperCase(Locale.ROOT));
if (p != null) {
position = p.intValue();
}
}
return position;
}
public int getEndPosition(String keyword) {
int position = getStartPosition(keyword);
return position != -1 && keyword != null ? position + keyword.length() : position;
}
public Map getPositions() {
return this.positions;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append('[').append(stmtType.name()).append(']').append(" cluster=").append(cluster).append(", database=")
.append(database).append(", table=").append(table).append(", format=").append(format)
.append(", outfile=").append(outfile).append(", parameters=").append(parameters).append(", positions=")
.append(positions).append("\nSQL:\n").append(sql);
return sb.toString();
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((cluster == null) ? 0 : cluster.hashCode());
result = prime * result + ((database == null) ? 0 : database.hashCode());
result = prime * result + ((format == null) ? 0 : format.hashCode());
result = prime * result + ((outfile == null) ? 0 : outfile.hashCode());
result = prime * result + ((parameters == null) ? 0 : parameters.hashCode());
result = prime * result + ((positions == null) ? 0 : positions.hashCode());
result = prime * result + ((sql == null) ? 0 : sql.hashCode());
result = prime * result + ((stmtType == null) ? 0 : stmtType.hashCode());
result = prime * result + ((table == null) ? 0 : table.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
ClickHouseSqlStatement other = (ClickHouseSqlStatement) obj;
if (cluster == null) {
if (other.cluster != null)
return false;
} else if (!cluster.equals(other.cluster))
return false;
if (database == null) {
if (other.database != null)
return false;
} else if (!database.equals(other.database))
return false;
if (format == null) {
if (other.format != null)
return false;
} else if (!format.equals(other.format))
return false;
if (outfile == null) {
if (other.outfile != null)
return false;
} else if (!outfile.equals(other.outfile))
return false;
if (parameters == null) {
if (other.parameters != null)
return false;
} else if (!parameters.equals(other.parameters))
return false;
if (positions == null) {
if (other.positions != null)
return false;
} else if (!positions.equals(other.positions))
return false;
if (sql == null) {
if (other.sql != null)
return false;
} else if (!sql.equals(other.sql))
return false;
if (stmtType != other.stmtType)
return false;
if (table == null) {
if (other.table != null)
return false;
} else if (!table.equals(other.table))
return false;
return true;
}
}