001
002package gudusoft.gsqlparser.dlineage.dataflow.model;
003
004import gudusoft.gsqlparser.EDbVendor;
005import gudusoft.gsqlparser.TSourceToken;
006import gudusoft.gsqlparser.dlineage.util.Pair3;
007import gudusoft.gsqlparser.nodes.TCaseExpression;
008import gudusoft.gsqlparser.nodes.TFunctionCall;
009import gudusoft.gsqlparser.nodes.TObjectName;
010import gudusoft.gsqlparser.nodes.TParseTreeNode;
011import gudusoft.gsqlparser.util.KeywordUtil;
012import gudusoft.gsqlparser.util.SQLUtil;
013import gudusoft.gsqlparser.util.functionChecker;
014
015import java.util.List;
016
017public class Function extends ResultSet {
018
019        private String functionName;
020        private Pair3<Long, Long, String> startPosition;
021        private Pair3<Long, Long, String> endPosition;
022
023        private TParseTreeNode functionObject;
024
025        public Function(TFunctionCall functionObject) {
026                super(functionObject, isShowFunction() && isSimpleShowUdfFunctionOnly(functionObject));
027
028                this.functionObject = functionObject;
029
030                TSourceToken startToken = functionObject.getStartToken();
031                if (startToken == null && functionObject.getFunctionName() != null) {
032                        startToken = functionObject.getFunctionName().getStartToken();
033                }
034                TSourceToken endToken = functionObject.getEndToken();
035                if (endToken == null && functionObject.getFunctionName() != null) {
036                        endToken = functionObject.getFunctionName().getEndToken();
037                }
038
039                this.startPosition = new Pair3<Long, Long, String>(startToken.lineNo, startToken.columnNo, ModelBindingManager.getGlobalHash());
040                this.endPosition = new Pair3<Long, Long, String>(endToken.lineNo, endToken.columnNo + SQLUtil.endTrim(endToken.astext).length(), ModelBindingManager.getGlobalHash());
041
042                if (functionObject.getFunctionName() != null) {
043                        this.functionName = functionObject.getFunctionName().toString();
044                }
045        }
046
047        public Function(TObjectName functionName) {
048                super(functionName, isShowFunction() && isSimpleShowUdfFunctionOnly(functionName));
049
050                this.functionObject = functionName;
051
052                TSourceToken startToken = functionObject.getStartToken();
053                TSourceToken endToken = functionObject.getEndToken();
054
055                this.startPosition = new Pair3<Long, Long, String>(startToken.lineNo, startToken.columnNo, ModelBindingManager.getGlobalHash());
056                this.endPosition = new Pair3<Long, Long, String>(endToken.lineNo, endToken.columnNo + SQLUtil.endTrim(endToken.astext).length(), ModelBindingManager.getGlobalHash());
057
058                this.functionName = functionObject.toString();
059        }
060
061        private static boolean isShowFunction() {
062                Option option = ModelBindingManager.getGlobalOption();
063                if (option.isSimpleOutput() || option.isIgnoreRecordSet()) {
064                        if (option.isSimpleShowFunction()) {
065                                return true;
066                        }
067                        return false;
068                }
069                return true;
070        }
071
072        private static boolean isSimpleShowUdfFunctionOnly(TParseTreeNode function) {
073                Option option = ModelBindingManager.getGlobalOption();
074                if (option.isSimpleOutput() || option.isIgnoreRecordSet()) {
075                        if(!isShowFunction()) {
076                                return false;
077                        }
078                        if (option.isSimpleShowUdfFunctionOnly()) {
079                                if(function instanceof TCaseExpression){
080                                        return false;
081                                }
082                                if(function instanceof TFunctionCall){
083                                        EDbVendor vendor = ModelBindingManager.getGlobalVendor();
084                                        String functionName = ((TFunctionCall)function).getFunctionName().toString();
085                                        List<String> versions = functionChecker.getAvailableDbVersions(vendor);
086                                        if (versions != null && versions.size() > 0) {
087                                                for (int i = 0; i < versions.size(); i++) {
088                                                        boolean result = functionChecker.isBuiltInFunction(functionName,
089                                                                        vendor, versions.get(i));
090                                                        if (result) {
091                                                                return false;
092                                                        }
093                                                }
094                                        }
095                                        if(KeywordUtil.isKeyword(((TFunctionCall)function).getFunctionName())){
096                                                return false;
097                                        }
098                                }
099                                if(function instanceof TObjectName){
100                                        EDbVendor vendor = ModelBindingManager.getGlobalVendor();
101                                        String functionName = function.toString();
102                                        List<String> versions = functionChecker.getAvailableDbVersions(vendor);
103                                        if (versions != null && versions.size() > 0) {
104                                                for (int i = 0; i < versions.size(); i++) {
105                                                        boolean result = functionChecker.isBuiltInFunction(functionName,
106                                                                        vendor, versions.get(i));
107                                                        if (result) {
108                                                                return false;
109                                                        }
110                                                }
111                                        }
112                                        if(KeywordUtil.isKeyword((TObjectName)function)){
113                                                return false;
114                                        }
115                                }
116                        }
117                        return true;
118                }
119                return true;
120        }
121
122        public Function(TCaseExpression caseExpression) {
123                super(caseExpression, isShowFunction() && isSimpleShowUdfFunctionOnly(caseExpression));
124
125                this.functionObject = caseExpression;
126
127                TSourceToken startToken = functionObject.getStartToken();
128                TSourceToken endToken = functionObject.getEndToken();
129
130                this.startPosition = new Pair3<Long, Long, String>(startToken.lineNo, startToken.columnNo, ModelBindingManager.getGlobalHash());
131                this.endPosition = new Pair3<Long, Long, String>(endToken.lineNo, endToken.columnNo + SQLUtil.endTrim(endToken.astext).length(), ModelBindingManager.getGlobalHash());
132
133                
134                this.functionName = "case-when";
135                
136        }
137
138        public Pair3<Long, Long, String> getStartPosition() {
139                return startPosition;
140        }
141
142        public Pair3<Long, Long, String> getEndPosition() {
143                return endPosition;
144        }
145
146        public String getFunctionName() {
147                return functionName;
148        }
149
150        public TParseTreeNode getFunctionObject() {
151                return functionObject;
152        }
153
154}