/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
* <p/>
* http://www.apache.org/licenses/LICENSE-2.0
* <p/>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.ambari.view.hive2.resources.uploads.query;
import org.apache.ambari.view.hive2.client.ColumnDescription;
import org.apache.ambari.view.hive2.resources.uploads.ColumnDescriptionImpl;
import org.apache.ambari.view.hive2.resources.uploads.HiveFileType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
/**
* generates the sql query from given data
*/
public class QueryGenerator {
protected final static Logger LOG =
LoggerFactory.getLogger(QueryGenerator.class);
public String generateCreateQuery(TableInfo tableInfo) {
String tableName = tableInfo.getTableName();
List<ColumnDescriptionImpl> cdList = tableInfo.getHeader();
StringBuilder query = new StringBuilder();
query.append("CREATE TABLE ").append(tableName).append(" (");
Collections.sort(cdList, new Comparator<ColumnDescription>() {
@Override
public int compare(ColumnDescription o1, ColumnDescription o2) {
return o1.getPosition() - o2.getPosition();
}
});
boolean first = true;
for (ColumnDescriptionImpl cd : cdList) {
if (first) {
first = false;
} else {
query.append(", ");
}
query.append(cd.getName()).append(" ").append(cd.getType());
if (cd.getPrecision() != null) {
query.append("(").append(cd.getPrecision());
if (cd.getScale() != null) {
query.append(",").append(cd.getScale());
}
query.append(")");
}
}
query.append(")");
if(tableInfo.getHiveFileType().equals(HiveFileType.TEXTFILE)) {
query.append(getRowFormatQuery(tableInfo.getRowFormat()));
}
query.append(" STORED AS ").append(tableInfo.getHiveFileType().toString());
String queryString = query.append(";").toString();
LOG.info("Query : {}", queryString);
return queryString;
}
private String getRowFormatQuery(RowFormat rowFormat) {
StringBuilder sb = new StringBuilder();
if(rowFormat != null) {
sb.append(" ROW FORMAT DELIMITED");
if(rowFormat.getFieldsTerminatedBy() != null ){
sb.append(" FIELDS TERMINATED BY '").append(rowFormat.getFieldsTerminatedBy()).append('\'');
}
if(rowFormat.getEscapedBy() != null){
String escape = String.valueOf(rowFormat.getEscapedBy());
if(rowFormat.getEscapedBy() == '\\'){
escape = escape + '\\'; // special handling of slash as its escape char for strings in hive as well.
}
sb.append(" ESCAPED BY '").append(escape).append('\'');
}
}
return sb.toString();
}
public String generateInsertFromQuery(InsertFromQueryInput ifqi) {
StringBuilder insertQuery = new StringBuilder("INSERT INTO TABLE ").append(ifqi.getToDatabase()).append(".")
.append(ifqi.getToTable()).append(" SELECT ");
boolean first = true;
for(ColumnDescriptionImpl column : ifqi.getHeader()){
String type = column.getType();
boolean unhex = ifqi.getUnhexInsert() && (
ColumnDescription.DataTypes.STRING.toString().equals(type)
|| ColumnDescription.DataTypes.VARCHAR.toString().equals(type)
|| ColumnDescription.DataTypes.CHAR.toString().equals(type)
);
if(!first){
insertQuery.append(", ");
}
if(unhex) {
insertQuery.append("UNHEX(");
}
insertQuery.append(column.getName());
if(unhex) {
insertQuery.append(")");
}
first = false;
}
insertQuery.append(" FROM ").append(ifqi.getFromDatabase()).append(".").append(ifqi.getFromTable()).append(";");
String query = insertQuery.toString();
LOG.info("Insert Query : {}", query);
return query;
}
public String generateDropTableQuery(DeleteQueryInput deleteQueryInput) {
String dropQuery = new StringBuilder("DROP TABLE ").append(deleteQueryInput.getDatabase())
.append(".").append(deleteQueryInput.getTable()).append(";").toString();
LOG.info("Drop Query : {}", dropQuery);
return dropQuery;
}
}