Skip to content

Commit

Permalink
TEIIDDES-2411: Fixes another issue with comments
Browse files Browse the repository at this point in the history
* The teiid parser can get used more than once if a model contains more
  than one transformation. Consequently, comments cannot remain cached on
  the parser.

* The teiid parser must remain stateless in the same manner as a factory
  or visitor

* Since the parser can produce multiple different language object trees
  from different sql, it is absurd to reference the parser in the language
  objects. Therefore, decouple the parser from the language objects.

* Analysis indicated that the 3 items required from the parser are the teiid
  version, data manager service and the ability to create new AST nodes.
  The latter 2 can be alternatively accessed while the teiid version can
  replace the parser as the single item being referenceable from the
  language objects.

* Lots of classes modified to remove reference call to the teiid parser
  and replace them with code for the thing they do actually require.

* Address the difficulty with comments by:
 * Parser maintains a comment cache which it fills with any comments
 * On creation of a new Language Object by the parser, assign it to the
   parser's current node field.
 * On assigning of the current node, also assign to the language object
   the comment cache. Thus, each node in the parsed tree shares the same
   comment collection.
 * On reset of the parser, the latter sets its reference to the comment
   cache to null, severing the connection to it.
 * Any language object in the hierarchy will return the same collection of
   comments.
  • Loading branch information
Paul Richardson committed Oct 21, 2016
1 parent 6350835 commit d239c80
Show file tree
Hide file tree
Showing 323 changed files with 2,736 additions and 2,675 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@

import java.io.Serializable;
import java.util.Set;

import org.teiid.core.util.EquivalenceUtil;
import org.teiid.core.util.HashCodeUtil;
import org.teiid.designer.runtime.version.spi.ITeiidServerVersion;
Expand Down Expand Up @@ -56,7 +57,7 @@ public enum Invalidation {

private static final long serialVersionUID = -4119606289701982511L;

private final TeiidParser teiidParser;
private final ITeiidServerVersion teiidVersion;

private Boolean prefersMemory;
private Boolean updatable;
Expand All @@ -65,35 +66,21 @@ public enum Invalidation {
private Scope scope;
private Invalidation invalidation = Invalidation.NONE;

public CacheDirective(TeiidParser teiidParser) {
this.teiidParser = teiidParser;
public CacheDirective(ITeiidServerVersion teiidVersion) {
this.teiidVersion = teiidVersion;
}

public CacheDirective(TeiidParser teiidParser, Boolean prefersMemory, Long ttl) {
this(teiidParser);
public CacheDirective(ITeiidServerVersion teiidVersion, Boolean prefersMemory, Long ttl) {
this(teiidVersion);
this.prefersMemory = prefersMemory;
this.ttl = ttl;
}

/**
* @return the teiidParser
*/
public TeiidParser getTeiidParser() {
return this.teiidParser;
}

/**
* @return version
*/
public ITeiidServerVersion getTeiidVersion() {
return this.getTeiidParser().getVersion();
}

/**
* @return comments from parser
*/
public Set<Comment> getComments() {
return getTeiidParser().getComments();
return this.teiidVersion;
}

public Boolean getPrefersMemory() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1539,7 +1539,7 @@ CommandStatement sqlStatement(ParseInfo info) #CommandStatement :
{
storedProcedure = newStoredProcedure();
elementID = elementSymbol(var);
SPParameter parameter = new SPParameter(this, 1, SPParameter.RETURN_VALUE, "return"); //$NON-NLS-1$
SPParameter parameter = new SPParameter(getVersion(), 1, SPParameter.RETURN_VALUE, "return"); //$NON-NLS-1$
parameter.setExpression(elementID);
storedProcedure.setParameter(parameter);
storedProcedure.setCalledWithReturn(true);
Expand Down Expand Up @@ -1813,7 +1813,7 @@ StoredProcedure callableStatement(ParseInfo info) :
<LBRACE>
[<QMARK> <EQ>
{
parameter = new SPParameter(this, parameterIndex++, SPParameter.RETURN_VALUE, "return"); //$NON-NLS-1$
parameter = new SPParameter(getVersion(), parameterIndex++, SPParameter.RETURN_VALUE, "return"); //$NON-NLS-1$
storedProcedure.setParameter(parameter);
storedProcedure.setCalledWithReturn(true);
}
Expand Down Expand Up @@ -1906,14 +1906,14 @@ StoredProcedure executeUnnamedParams(ParseInfo info, StoredProcedure storedProce

(value = expression(info)
{
parameter = new SPParameter(this, parameterIndex++, value);
parameter = new SPParameter(getVersion(), parameterIndex++, value);
parameter.setParameterType(SPParameter.IN);
storedProcedure.setParameter(parameter);
}
( <COMMA>
value = expression(info)
{
parameter = new SPParameter(this, parameterIndex++, value);
parameter = new SPParameter(getVersion(), parameterIndex++, value);
parameter.setParameterType(SPParameter.IN);
storedProcedure.setParameter(parameter);
}
Expand Down Expand Up @@ -1943,7 +1943,7 @@ StoredProcedure executeNamedParams(ParseInfo info, StoredProcedure storedProcedu
<EQ> [<GT>]
value = expression(info)
{
parameter = new SPParameter(this, parameterIndex++, value);
parameter = new SPParameter(getVersion(), parameterIndex++, value);
parameter.setName(name);
parameter.setParameterType(SPParameter.IN);
storedProcedure.setParameter(parameter);
Expand All @@ -1954,7 +1954,7 @@ StoredProcedure executeNamedParams(ParseInfo info, StoredProcedure storedProcedu
<EQ> [<GT>]
value = expression(info)
{
parameter = new SPParameter(this, parameterIndex++, value);
parameter = new SPParameter(getVersion(), parameterIndex++, value);
parameter.setName(name);
parameter.setParameterType(SPParameter.IN);
storedProcedure.setParameter(parameter);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1832,7 +1832,7 @@ Statement assignStatement(ParseInfo info) :
(value = assignStatementOperand(info) |
(value = storedProcedure(info, 2) [(<WITH>|<WITHOUT> {returnable = false;}) <RETURN>]) {
StoredProcedure storedProcedure = (StoredProcedure)value;
SPParameter parameter = new SPParameter(this, 1, SPParameter.RETURN_VALUE, "return"); //$NON-NLS-1$
SPParameter parameter = new SPParameter(getVersion(), 1, SPParameter.RETURN_VALUE, "return"); //$NON-NLS-1$
parameter.setExpression(elementID);
storedProcedure.setParameter(parameter);
storedProcedure.setCalledWithReturn(true);
Expand Down Expand Up @@ -2096,7 +2096,7 @@ StoredProcedure callableStatement(ParseInfo info) :
<LBRACE>
[<QMARK> <EQ>
{
parameter = new SPParameter(this, parameterIndex++, SPParameter.RETURN_VALUE, "return"); //$NON-NLS-1$
parameter = new SPParameter(getVersion(), parameterIndex++, SPParameter.RETURN_VALUE, "return"); //$NON-NLS-1$
storedProcedure.setParameter(parameter);
storedProcedure.setCalledWithReturn(true);
}
Expand Down Expand Up @@ -2203,7 +2203,7 @@ void executeNamedParams(ParseInfo info, StoredProcedure storedProcedure, int par
<EQ> [<GT>]
value = expression(info)
{
parameter = new SPParameter(this, parameterIndex++, value);
parameter = new SPParameter(getVersion(), parameterIndex++, value);
parameter.setName(name);
parameter.setParameterType(SPParameter.IN);
storedProcedure.setParameter(parameter);
Expand All @@ -2214,7 +2214,7 @@ void executeNamedParams(ParseInfo info, StoredProcedure storedProcedure, int par
<EQ> [<GT>]
value = expression(info)
{
parameter = new SPParameter(this, parameterIndex++, value);
parameter = new SPParameter(getVersion(), parameterIndex++, value);
parameter.setName(name);
parameter.setParameterType(SPParameter.IN);
storedProcedure.setParameter(parameter);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@
import org.teiid.query.metadata.TempMetadataID;
import org.teiid.query.parser.TeiidNodeFactory;
import org.teiid.query.parser.TeiidNodeFactory.ASTNodes;
import org.teiid.query.parser.TeiidParser;
import org.teiid.designer.runtime.version.spi.ITeiidServerVersion;
import org.teiid.query.processor.relational.XMLTableNode;
import org.teiid.query.sql.lang.AbstractSetCriteria;
import org.teiid.query.sql.lang.CollectionValueIterator;
Expand All @@ -84,6 +84,7 @@
import org.teiid.query.sql.lang.ExpressionCriteria;
import org.teiid.query.sql.lang.IsDistinctCriteria;
import org.teiid.query.sql.lang.IsNullCriteria;
import org.teiid.query.sql.lang.LanguageObject;
import org.teiid.query.sql.lang.MatchCriteria;
import org.teiid.query.sql.lang.NamespaceItem;
import org.teiid.query.sql.lang.NotCriteria;
Expand Down Expand Up @@ -344,7 +345,7 @@ private Boolean internalEvaluateTVL(Criteria criteria)
if (cols.size() != colsOther.size()) {
return !idc.isNegated();
}
SyntaxFactory factory = new SyntaxFactory(criteria.getTeiidParser());
SyntaxFactory factory = new SyntaxFactory(criteria.getTeiidVersion());
for (int i = 0; i < cols.size(); i++) {
IElementSymbol symbol1 = factory.createElementSymbol(cols.get(i).getName());
symbol1.setGroupSymbol(idc.getLeftRowValue());
Expand Down Expand Up @@ -536,7 +537,7 @@ private boolean match(String pattern, char escape, CharSequence search, MatchMod
private Boolean evaluate(AbstractSetCriteria criteria)
throws Exception {

TeiidParser teiidParser = criteria.getTeiidParser();
ITeiidServerVersion teiidVersion = criteria.getTeiidVersion();

// Evaluate expression
Object leftValue = null;
Expand All @@ -559,12 +560,12 @@ private Boolean evaluate(AbstractSetCriteria criteria)
return criteria.isNegated();
}
if (set.isAllConstants()) {
Constant c = teiidParser.createASTNode(ASTNodes.CONSTANT);
Constant c = TeiidNodeFactory.createASTNode(teiidVersion, ASTNodes.CONSTANT);
c.setValue(leftValue);
c.setType(criteria.getExpression().getType());
boolean exists = set.getValues().contains(c);
if (!exists) {
if (set.getValues().contains(Constant.getNullConstant(teiidParser))) {
if (set.getValues().contains(Constant.getNullConstant(teiidVersion))) {
return null;
}
return criteria.isNegated();
Expand Down Expand Up @@ -869,7 +870,7 @@ private Object evaluate(XMLCast expression) throws Exception {
Object val = internalEvaluate(expression.getExpression());
if (val == null) {
TeiidNodeFactory factory = new TeiidNodeFactory();
Constant constant = factory.create(expression.getTeiidParser(), ASTNodes.CONSTANT);
Constant constant = factory.create(expression.getTeiidVersion(), ASTNodes.CONSTANT);
constant.setValue(null);
constant.setType(expression.getType());
return constant;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,17 +22,17 @@

package org.teiid.query.mapping.xml;

import org.teiid.designer.runtime.version.spi.ITeiidServerVersion;
import org.teiid.designer.xml.IMappingAllNode;
import org.teiid.query.parser.TeiidParser;


/**
* This defines a "All" node in the XML Schema Mapping document
*/
public class MappingAllNode extends MappingBaseNode implements IMappingAllNode<MappingNode> {

public MappingAllNode(TeiidParser teiidParser) {
super(teiidParser);
public MappingAllNode(ITeiidServerVersion teiidVersion) {
super(teiidVersion);
setProperty(MappingNodeConstants.Properties.NODE_TYPE, MappingNodeConstants.ALL);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,9 @@

import org.teiid.designer.annotation.Removed;
import org.teiid.designer.annotation.Since;
import org.teiid.designer.runtime.version.spi.ITeiidServerVersion;
import org.teiid.designer.runtime.version.spi.TeiidServerVersion.Version;
import org.teiid.designer.xml.IMappingAttribute;
import org.teiid.query.parser.TeiidParser;
import org.teiid.query.sql.symbol.ElementSymbol;


Expand All @@ -40,17 +40,17 @@ public class MappingAttribute extends MappingNode implements IMappingAttribute {
// namespace of the attribute
Namespace namespace;

public MappingAttribute(TeiidParser teiidParser, String name) {
this(teiidParser, name, MappingNodeConstants.NO_NAMESPACE);
public MappingAttribute(ITeiidServerVersion teiidVersion, String name) {
this(teiidVersion, name, MappingNodeConstants.NO_NAMESPACE);
}

public MappingAttribute(TeiidParser teiidParser, String name, String nameInSource) {
this(teiidParser, name, MappingNodeConstants.NO_NAMESPACE);
public MappingAttribute(ITeiidServerVersion teiidVersion, String name, String nameInSource) {
this(teiidVersion, name, MappingNodeConstants.NO_NAMESPACE);
setNameInSource(nameInSource);
}

public MappingAttribute(TeiidParser teiidParser, String name, Namespace namespace) {
super(teiidParser);
public MappingAttribute(ITeiidServerVersion teiidVersion, String name, Namespace namespace) {
super(teiidVersion);
setProperty(MappingNodeConstants.Properties.NAME, name);
setProperty(MappingNodeConstants.Properties.NODE_TYPE, MappingNodeConstants.ATTRIBUTE);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,8 @@
import java.util.List;
import org.teiid.designer.annotation.Removed;
import org.teiid.designer.runtime.version.spi.ITeiidServerVersion;
import org.teiid.designer.runtime.version.spi.TeiidServerVersion;
import org.teiid.designer.runtime.version.spi.TeiidServerVersion.Version;
import org.teiid.designer.xml.IMappingBaseNode;
import org.teiid.query.parser.TeiidParser;
import org.teiid.runtime.client.Messages;


Expand All @@ -43,8 +41,8 @@ public abstract class MappingBaseNode extends MappingNode implements IMappingBas
// An ID on the recursive parent as to who the recursive child node is?
String recursionId;

protected MappingBaseNode(TeiidParser teiidParser) {
super(teiidParser);
protected MappingBaseNode(ITeiidServerVersion teiidVersion) {
super(teiidVersion);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,8 @@

import java.util.Iterator;
import java.util.List;
import org.teiid.designer.runtime.version.spi.ITeiidServerVersion;
import org.teiid.designer.xml.IMappingChoiceNode;
import org.teiid.query.parser.TeiidParser;
import org.teiid.runtime.client.Messages;


Expand All @@ -39,12 +39,12 @@
public class MappingChoiceNode extends MappingBaseNode
implements IMappingChoiceNode<MappingCriteriaNode, MappingNode> {

public MappingChoiceNode(TeiidParser teiidParser) {
this(teiidParser, false);
public MappingChoiceNode(ITeiidServerVersion teiidVersion) {
this(teiidVersion, false);
}

public MappingChoiceNode(TeiidParser teiidParser, boolean exceptionOnDefault) {
super(teiidParser);
public MappingChoiceNode(ITeiidServerVersion teiidVersion, boolean exceptionOnDefault) {
super(teiidVersion);
//setProperty(MappingNodeConstants.Properties.NAME, "{ChoiceNode}"); //$NON-NLS-1$
setProperty(MappingNodeConstants.Properties.NODE_TYPE, MappingNodeConstants.CHOICE);
setProperty(MappingNodeConstants.Properties.EXCEPTION_ON_DEFAULT, Boolean.valueOf(exceptionOnDefault));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,17 +22,17 @@

package org.teiid.query.mapping.xml;

import org.teiid.designer.runtime.version.spi.ITeiidServerVersion;
import org.teiid.designer.xml.IMappingCommentNode;
import org.teiid.query.parser.TeiidParser;


/**
* This node describes a <b>comment</b> in XML Mapping document
*/
public class MappingCommentNode extends MappingNode implements IMappingCommentNode {

public MappingCommentNode(TeiidParser teiidParser, String comment) {
super(teiidParser);
public MappingCommentNode(ITeiidServerVersion teiidVersion, String comment) {
super(teiidVersion);
setProperty(MappingNodeConstants.Properties.NODE_TYPE, MappingNodeConstants.COMMENT);
if (comment != null) {
setProperty(MappingNodeConstants.Properties.COMMENT_TEXT, comment);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@

package org.teiid.query.mapping.xml;

import org.teiid.designer.runtime.version.spi.ITeiidServerVersion;
import org.teiid.designer.xml.IMappingCriteriaNode;
import org.teiid.query.parser.TeiidParser;
import org.teiid.query.sql.lang.Criteria;


Expand All @@ -36,15 +36,15 @@ public class MappingCriteriaNode extends MappingBaseNode implements IMappingCrit
boolean defalt;
Criteria criteriaNode;

public MappingCriteriaNode(TeiidParser teiidParser, String criteria, boolean defalt) {
super(teiidParser);
public MappingCriteriaNode(ITeiidServerVersion teiidVersion, String criteria, boolean defalt) {
super(teiidVersion);
setCriteria(criteria);
setAsDefault(defalt);
setProperty(MappingNodeConstants.Properties.NODE_TYPE, MappingNodeConstants.CRITERIA);
}

public MappingCriteriaNode(TeiidParser teiidParser) {
super(teiidParser);
public MappingCriteriaNode(ITeiidServerVersion teiidVersion) {
super(teiidVersion);
setAsDefault(true);
setProperty(MappingNodeConstants.Properties.NODE_TYPE, MappingNodeConstants.CRITERIA);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,9 @@
import java.io.PrintWriter;
import org.teiid.core.util.ArgCheck;
import org.teiid.designer.annotation.Removed;
import org.teiid.designer.runtime.version.spi.ITeiidServerVersion;
import org.teiid.designer.runtime.version.spi.TeiidServerVersion.Version;
import org.teiid.designer.xml.IMappingDocument;
import org.teiid.query.parser.TeiidParser;
import org.teiid.runtime.client.Messages;


Expand All @@ -45,12 +45,12 @@ public class MappingDocument extends MappingBaseNode implements IMappingDocument
String encoding;
String name;

public MappingDocument(TeiidParser teiidParser, boolean formatted) {
this(teiidParser, MappingNodeConstants.Defaults.DEFAULT_DOCUMENT_ENCODING, formatted);
public MappingDocument(ITeiidServerVersion teiidVersion, boolean formatted) {
this(teiidVersion, MappingNodeConstants.Defaults.DEFAULT_DOCUMENT_ENCODING, formatted);
}

public MappingDocument(TeiidParser teiidParser, String encoding, boolean formatted) {
super(teiidParser);
public MappingDocument(ITeiidServerVersion teiidVersion, String encoding, boolean formatted) {
super(teiidVersion);
if (encoding == null) {
encoding = MappingNodeConstants.Defaults.DEFAULT_DOCUMENT_ENCODING;
}
Expand Down

0 comments on commit d239c80

Please sign in to comment.