/*
* JBoss, Home of Professional Open Source.
* See the COPYRIGHT.txt file distributed with this work for information
* regarding copyright ownership. Some portions may be licensed
* to Red Hat, Inc. under one or more contributor license agreements.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301 USA.
*/
package org.teiid.query.sql.lang;
import java.util.ArrayList;
import java.util.List;
import org.teiid.core.types.DataTypeManager;
import org.teiid.core.util.EquivalenceUtil;
import org.teiid.query.sql.LanguageVisitor;
import org.teiid.query.sql.symbol.Expression;
/**
* Represents the TEXTTABLE table function.
*/
public class TextTable extends TableFunctionReference {
public static class TextColumn extends ProjectedColumn {
private Integer width;
private boolean noTrim;
private String selector;
private Integer position;
private boolean ordinal;
private String header;
public TextColumn(String name) {
super(name, DataTypeManager.DefaultDataTypes.INTEGER);
this.ordinal = true;
}
public TextColumn(String name, String type, Integer width, boolean noTrim) {
super(name, type);
this.width = width;
this.noTrim = noTrim;
}
protected TextColumn() {
}
public Integer getWidth() {
return width;
}
public void setWidth(Integer width) {
this.width = width;
}
public boolean isNoTrim() {
return noTrim;
}
public void setNoTrim(boolean noTrim) {
this.noTrim = noTrim;
}
public String getHeader() {
return header;
}
public void setHeader(String header) {
this.header = header;
}
@Override
public boolean equals(Object obj) {
if (obj == this) {
return true;
}
if (!super.equals(obj) || !(obj instanceof TextColumn)) {
return false;
}
TextColumn other = (TextColumn)obj;
return EquivalenceUtil.areEqual(width, other.width)
&& EquivalenceUtil.areEqual(selector, other.selector)
&& EquivalenceUtil.areEqual(position, other.position)
&& noTrim == other.noTrim
&& ordinal == other.ordinal
&& EquivalenceUtil.areEqual(header, other.header);
}
@Override
public TextColumn clone() {
TextColumn clone = new TextColumn();
clone.width = this.width;
clone.noTrim = this.noTrim;
clone.selector = this.selector;
clone.position = this.position;
clone.ordinal = this.ordinal;
clone.header = this.header;
this.copyTo(clone);
return clone;
}
public String getSelector() {
return selector;
}
public void setSelector(String selector) {
this.selector = selector;
}
public Integer getPosition() {
return position;
}
public void setPosition(Integer position) {
this.position = position;
}
public boolean isOrdinal() {
return ordinal;
}
}
private Expression file;
private List<TextColumn> columns = new ArrayList<TextColumn>();
private Character rowDelimiter;
private Character delimiter;
private Character quote;
private boolean escape;
private Integer header;
private Integer skip;
private boolean usingRowDelimiter = true;
private String selector;
private boolean fixedWidth;
public String getSelector() {
return selector;
}
public void setSelector(String selector) {
this.selector = selector;
}
public Character getQuote() {
return quote;
}
public void setQuote(Character quote) {
this.quote = quote;
}
public boolean isEscape() {
return escape;
}
public void setEscape(boolean escape) {
this.escape = escape;
}
public boolean isFixedWidth() {
return fixedWidth;
}
public void setFixedWidth(boolean fixedWidth) {
this.fixedWidth = fixedWidth;
}
public List<TextColumn> getColumns() {
return columns;
}
public void setColumns(List<TextColumn> columns) {
this.columns = columns;
}
public Character getRowDelimiter() {
return rowDelimiter;
}
public void setRowDelimiter(Character rowDelimiter) {
this.rowDelimiter = rowDelimiter;
}
public Character getDelimiter() {
return delimiter;
}
public void setDelimiter(Character delimiter) {
this.delimiter = delimiter;
}
public Integer getHeader() {
return header;
}
public void setHeader(Integer header) {
this.header = header;
}
public Integer getSkip() {
return skip;
}
public void setSkip(Integer skip) {
this.skip = skip;
}
public Expression getFile() {
return file;
}
public void setFile(Expression file) {
this.file = file;
}
public boolean isUsingRowDelimiter() {
return usingRowDelimiter;
}
public void setUsingRowDelimiter(boolean usingRowDelimiter) {
this.usingRowDelimiter = usingRowDelimiter;
}
public void setNoTrim() {
for (TextColumn col : columns) {
col.noTrim = true;
}
}
public boolean isNoTrim() {
for (TextColumn col : columns) {
if (!col.noTrim) {
return false;
}
}
return true;
}
@Override
public void acceptVisitor(LanguageVisitor visitor) {
visitor.visit(this);
}
@Override
protected TextTable cloneDirect() {
TextTable clone = new TextTable();
this.copy(clone);
clone.setDelimiter(this.delimiter);
clone.setFile((Expression)this.file.clone());
clone.setHeader(this.header);
clone.setSkip(this.skip);
clone.setQuote(this.quote);
clone.escape = this.escape;
for (TextColumn column : columns) {
clone.getColumns().add(column.clone());
}
clone.fixedWidth = this.fixedWidth;
clone.usingRowDelimiter = this.usingRowDelimiter;
clone.rowDelimiter = this.rowDelimiter;
clone.selector = this.selector;
return clone;
}
@Override
public boolean equals(Object obj) {
if (obj == this) {
return true;
}
if (!super.equals(obj) || !(obj instanceof TextTable)) {
return false;
}
TextTable other = (TextTable)obj;
return this.columns.equals(other.columns)
&& EquivalenceUtil.areEqual(file, other.file)
&& EquivalenceUtil.areEqual(delimiter, other.delimiter)
&& EquivalenceUtil.areEqual(escape, other.escape)
&& EquivalenceUtil.areEqual(quote, other.quote)
&& EquivalenceUtil.areEqual(header, other.header)
&& EquivalenceUtil.areEqual(skip, other.skip)
&& usingRowDelimiter == other.usingRowDelimiter
&& EquivalenceUtil.areEqual(selector, other.selector)
&& EquivalenceUtil.areEqual(rowDelimiter, other.rowDelimiter);
}
}