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}