Skip to content

Commit

Permalink
TEIIDDES-3015 allowing '-' in columns names and double-quoting if needed
Browse files Browse the repository at this point in the history
  • Loading branch information
blafond committed Apr 3, 2017
1 parent d9fdf4c commit e7fcd2a
Show file tree
Hide file tree
Showing 4 changed files with 135 additions and 13 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
public class RelationalStringNameValidator extends StringNameValidator {

public static String DESIGNER_CORE_PACKAGE = ModelerCore.class.getPackage().getName();
public static char[] INVALID_CHARS = {' ', '.'};
public static char[] INVALID_CHARS = {' ', '.', '-'};
public static char[] INVALID_QUOTED_CHARS = {' '};

boolean isTable = false;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,15 @@
import java.util.Collection;
import java.util.List;
import java.util.StringTokenizer;

import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.teiid.core.designer.util.CoreArgCheck;
import org.teiid.core.designer.util.I18nUtil;
import org.teiid.core.designer.util.StringConstants;
import org.teiid.core.designer.util.StringUtilities;
import org.teiid.designer.core.ModelerCore;
import org.teiid.designer.core.validation.rules.StringNameValidator;
import org.teiid.designer.metamodels.relational.RelationalPlugin;
import org.teiid.designer.metamodels.relational.aspects.validation.RelationalStringNameValidator;
import org.teiid.designer.query.IProcedureService;
import org.teiid.designer.query.IQueryService;
Expand All @@ -39,8 +41,9 @@

public class TeiidMetadataFileInfo extends TeiidFileInfo implements UiConstants, ITeiidMetadataFileInfo {
private static final String I18N_PREFIX = I18nUtil.getPropertyPrefix(TeiidMetadataFileInfo.class);
private static char[] THESE_INVALID_CHARS = {' ', '.', '-'};

private static final StringNameValidator validator = new RelationalStringNameValidator(false);
protected final NameValidator validator = new NameValidator(false);

private static String getString( final String id ) {
return Util.getString(I18N_PREFIX + id);
Expand Down Expand Up @@ -561,7 +564,8 @@ private void defineColumns() {
nextTok = nextTok.substring(1, nextTok.length()-1);
}
if( nextTok != null && nextTok.length() > 0 ) {
names.add(nextTok);
String colName = checkAndConvertName(nextTok);
names.add(colName);
}
}

Expand Down Expand Up @@ -599,6 +603,17 @@ private void defineColumns() {
validate();
}

private String checkAndConvertName(String colName) {
// Check to see if all characters are letters or numbers
// if not, then double-quote the name
String result = validator.checkNameCharacters(colName);
if( StringUtilities.isNotEmpty(result)) {
return StringConstants.DQUOTE + colName + StringConstants.DQUOTE;
}

return colName;
}

@Override
public void validate() {
if( this.useHeaderForColumnNames ) {
Expand All @@ -610,7 +625,7 @@ public void validate() {

if( this.columnInfoList.size() == 1 ) {
// COULD HAVE ONE COLUMN, SO VALIDATE
String message = TeiidMetadataFileInfo.validator.checkValidName(this.columnInfoList.iterator().next().getSymbolName());
String message = validator.checkValidName(this.columnInfoList.iterator().next().getSymbolName());
if( message != null ) {
setStatus(new Status(IStatus.ERROR, PLUGIN_ID, getString("status.noHeaderFound"))); //$NON-NLS-1$
return;
Expand Down Expand Up @@ -1084,4 +1099,73 @@ public int getRowDelimiterOption() {
return this.rowDelimiterOption;
}

class NameValidator extends RelationalStringNameValidator {

public NameValidator(boolean isTable, boolean restrictChars) {
super(isTable, restrictChars);
// TODO Auto-generated constructor stub
}

public NameValidator(boolean isTable) {
super(isTable);
// TODO Auto-generated constructor stub
}

@Override
public String checkNameCharacters(String name) {
CoreArgCheck.isNotNull(name);

// Go through the string and ensure that each character is valid ...

int length = name.length();

if (length == 0) {
return null;
}

char c = name.charAt(0);

String msg = null;

for (int index = 1; index < length; index++) {
c = name.charAt(index);
msg = isValidChar(c, index);

if (msg != null) {
return msg;
}
}

// Valid, so return no error message
return null;
}

@Override
protected String isValidChar(char c, int index) {
boolean valid = true;

String result = super.isValidChar(c, index);
if( StringUtilities.isNotEmpty(result) ) {
return result;
}

if( index == 0 ) {
valid = Character.isLetter(c);
} else {
for( char nextChar : THESE_INVALID_CHARS ) {
if( c == nextChar ) {
valid = false;
break;
}
}
}

if( !valid ) {
final Object[] params = new Object[] {new Character(c), new Integer(index+1), getValidNonLetterOrDigitMessageSuffix()};
return RelationalPlugin.Util.getString("RelationalStringNameValidator.nameIsInvalidTheCharacterAt", params); //$NON-NLS-1$
}

return null;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -79,8 +79,13 @@ public String getSQLStatement(ITeiidMetadataFileInfo metadataFileInfo, String re
// Need to check for d-quotes and triple d-quote the column alias.
String aliasColumnName = columnName;
boolean aliasColumn = false;
if( columnName.startsWith(D_QUOTE) ) {
aliasColumnName = D_QUOTE + D_QUOTE + columnName + D_QUOTE + D_QUOTE;
if( columnName.startsWith(D_QUOTE)) {
if(!columnName.startsWith(D_QUOTE + D_QUOTE + D_QUOTE) ) {
aliasColumnName = D_QUOTE + D_QUOTE + columnName + D_QUOTE + D_QUOTE;
} else {
int len = columnName.length();
columnName = columnName.substring(2, len-2);
}
aliasColumn = true;
}
sb.append(alias).append(DOT).append(columnName);
Expand All @@ -99,7 +104,12 @@ public String getSQLStatement(ITeiidMetadataFileInfo metadataFileInfo, String re
sb = new StringBuffer();
i=0;
for( ITeiidColumnInfo columnStr : columnInfoList) {
sb.append(columnStr.getSymbolName()).append(SPACE).append(columnStr.getDatatype());
String columnName = columnStr.getSymbolName();
if(columnName.startsWith(D_QUOTE + D_QUOTE + D_QUOTE) ) {
int len = columnName.length();
columnName = columnName.substring(2, len-2);
}
sb.append(columnName).append(SPACE).append(columnStr.getDatatype());
if( metadataFileInfo.isFixedWidthColumns()) {
sb.append(SPACE).append(WIDTH).append(SPACE).append(Integer.toString(columnStr.getWidth()));
if(columnStr.isNoTrim()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,25 @@ public String getSQLStatement(ITeiidMetadataFileInfo metadataFileInfo, String re
int i=0;
int nColumns = columnInfoList.size();
for(ITeiidColumnInfo columnStr : columnInfoList) {
sb.append(alias).append(DOT).append(columnStr.getSymbolName());
String columnName = columnStr.getSymbolName();

// Column names may contain spaces and/or odd characters as long as they are double-quoted
// Need to check for d-quotes and triple d-quote the column alias.
String aliasColumnName = columnName;
boolean aliasColumn = false;
if( columnName.startsWith(D_QUOTE)) {
if(!columnName.startsWith(D_QUOTE + D_QUOTE + D_QUOTE) ) {
aliasColumnName = D_QUOTE + D_QUOTE + columnName + D_QUOTE + D_QUOTE;
} else {
int len = columnName.length();
columnName = columnName.substring(2, len-2);
}
aliasColumn = true;
}
sb.append(alias).append(DOT).append(columnName);
if( aliasColumn ) {
sb.append(SPACE).append(AS).append(SPACE).append(aliasColumnName);
}

if(i < (nColumns-1)) {
sb.append(COMMA).append(SPACE);
Expand All @@ -86,7 +104,12 @@ public String getSQLStatement(ITeiidMetadataFileInfo metadataFileInfo, String re
sb = new StringBuffer();
i=0;
for( ITeiidColumnInfo columnStr : columnInfoList) {
sb.append(columnStr.getSymbolName()).append(SPACE).append(columnStr.getDatatype());
String columnName = columnStr.getSymbolName();
if(columnName.startsWith(D_QUOTE + D_QUOTE + D_QUOTE) ) {
int len = columnName.length();
columnName = columnName.substring(2, len-2);
}
sb.append(columnName).append(SPACE).append(columnStr.getDatatype());
if( metadataFileInfo.isFixedWidthColumns()) {
sb.append(SPACE).append(WIDTH).append(SPACE).append(Integer.toString(columnStr.getWidth()));
if(columnStr.isNoTrim()) {
Expand All @@ -100,7 +123,12 @@ public String getSQLStatement(ITeiidMetadataFileInfo metadataFileInfo, String re
i++;
}

String proc = S_QUOTE + metadataFileInfo.getDataFile().getName() + S_QUOTE;
String fileName = metadataFileInfo.getDataFile().getName();
if( metadataFileInfo.getDataFileFilter() != null ) {
fileName = metadataFileInfo.getDataFileFilter();
}
String proc = S_QUOTE + fileName + S_QUOTE;

if( metadataFileInfo.isUrl() ) {
proc = S_QUOTE + GET + S_QUOTE
+ COMMA + SPACE + NULL.toLowerCase()
Expand Down Expand Up @@ -144,13 +172,13 @@ public String getSQLStatement(ITeiidMetadataFileInfo metadataFileInfo, String re
String quote = metadataFileInfo.getQuote();
if( ! DEFAULT_QUOTE.equals(quote)) {
sb.append(QUOTE_STR); //$NON-NLS-1$
sb.append(SPACE).append('\'').append(quote).append('\'');
sb.append(SPACE).append(S_QUOTE).append(quote).append(S_QUOTE);
}
} else if(metadataFileInfo.doIncludeEscape() ) {
String escape = metadataFileInfo.getEscape();
if( ! DEFAULT_ESCAPE.equals(escape)) {
sb.append(ESCAPE_STR); //$NON-NLS-1$
sb.append(SPACE).append('\'').append(escape).append('\'');
sb.append(SPACE).append(S_QUOTE).append(escape).append(S_QUOTE);
}
}

Expand Down

0 comments on commit e7fcd2a

Please sign in to comment.