001 002package gudusoft.gsqlparser.util; 003 004import gudusoft.gsqlparser.EDbVendor; 005import gudusoft.gsqlparser.util.json.JSON; 006 007import java.util.*; 008 009public class functionChecker 010{ 011 private static HashSet<String> oraclePredefinedPackageFunctionSet = new HashSet<>(); 012 013 private static final String COMMA = ","; 014 private static final String MINUS = "-"; 015 016 private functionChecker( ) 017 { 018 } 019 020 public static boolean isOraclePredefinedPackageFunction(String inputString) { 021 if (SQLUtil.isEmpty(inputString)) { 022 return false; 023 } 024 if (oraclePredefinedPackageFunctionSet.isEmpty()) { 025 synchronized (functionChecker.class) { 026 Map<String, Object> jsonObject = (Map<String, Object>) JSON.parseObject(SQLUtil.getInputStreamContent(functionChecker.class.getResourceAsStream("/gudusoft/gsqlparser/oracle/package/predefined.json"), false)); 027 for (String key : jsonObject.keySet()) { 028 for (Object item : (List) jsonObject.get(key)) { 029 oraclePredefinedPackageFunctionSet.add((key + "." + item.toString()).toUpperCase()); 030 } 031 } 032 } 033 } 034 return oraclePredefinedPackageFunctionSet.contains(inputString.toUpperCase()); 035 } 036 037 public static boolean isBuiltInFunction( String inputString, 038 EDbVendor dbvendor, String dbVersion ) 039 { 040 if ( inputString == null || inputString.trim( ).equals( "" ) ) 041 return false; 042 043 String function = inputString.toUpperCase( ); 044 045 functionList functionList = functionListFactory.getInstance( ) 046 .getBuiltInFunctionList( dbvendor, dbVersion ); 047 if ( functionList == null ) 048 { 049 throw new IllegalArgumentException( "Can't get available built-in function list" ); 050 } 051 052 return functionList.getBuiltInFunctionList( ).contains( function ); 053 } 054 055 public static String getBuiltInFunctionList(EDbVendor dbvendor, 056 String dbVersion) { 057 functionList functionList = functionListFactory.getInstance() 058 .getBuiltInFunctionList(dbvendor, dbVersion); 059 if (functionList == null) { 060 throw new IllegalArgumentException("Can't get available built-in function list"); 061 } 062 063 Set<String> functions = functionList.getBuiltInFunctionList(); 064 065 if (functions != null) { 066 return String.join(COMMA, functions); 067 } 068 return null; 069 } 070 071 public static String compareBuiltInFunctionList( EDbVendor dbvendor1, 072 String dbVersion1, EDbVendor dbvendor2, String dbVersion2 ) 073 { 074 functionList functionList1 = functionListFactory.getInstance( ) 075 .getBuiltInFunctionList( dbvendor1, dbVersion1 ); 076 functionList functionList2 = functionListFactory.getInstance( ) 077 .getBuiltInFunctionList( dbvendor2, dbVersion2 ); 078 079 if ( functionList1 == null || functionList2 == null ) 080 { 081 throw new IllegalArgumentException( "Can't get available built-in function list" ); 082 } 083 084 List<String> list1 = new ArrayList<String>( ); 085 List<String> list2 = new ArrayList<String>( ); 086 List<String> retainList = new ArrayList<String>( ); 087 088 retainList.addAll( functionList1.getBuiltInFunctionList( ) ); 089 retainList.retainAll( functionList2.getBuiltInFunctionList( ) ); 090 list1.addAll( functionList1.getBuiltInFunctionList( ) ); 091 list2.addAll( functionList2.getBuiltInFunctionList( ) ); 092 093 list1.removeAll( retainList ); 094 list2.removeAll( retainList ); 095 096 for ( int i = 0; i < list2.size( ); i++ ) 097 { 098 list1.add( MINUS + list2.get( i ) ); 099 } 100 101 Collections.sort( list1, new Comparator<String>( ) { 102 103 public int compare( String str1, String str2 ) 104 { 105 if ( !str1.startsWith( MINUS ) ) 106 str1 = MINUS + str1; 107 if ( !str2.startsWith( MINUS ) ) 108 str2 = MINUS + str2; 109 return str1.compareToIgnoreCase( str2 ); 110 } 111 112 } ); 113 114 StringBuffer buffer = new StringBuffer( ); 115 for ( int i = 0; i < list1.size( ); i++ ) 116 { 117 buffer.append( list1.get( i ) ); 118 if ( i < list1.size( ) - 1 ) 119 buffer.append( COMMA ); 120 } 121 return buffer.toString( ); 122 } 123 124 public static List<String> getAvailableDbVersions( EDbVendor dbvendor ) 125 { 126 return functionListFactory.getInstance( ) 127 .getAvailableDbVersions( dbvendor ); 128 } 129 130 public static boolean containsDbVersion( EDbVendor dbvendor, 131 String dbVersion ) 132 { 133 return functionListFactory.getInstance( ).containsDbVersion( dbvendor, 134 dbVersion ); 135 } 136 137 public static void main(String[] args) { 138 System.out.println(functionChecker.getBuiltInFunctionList(EDbVendor.dbvoracle, "11.2")); 139 System.out.println(functionChecker.isBuiltInFunction("power", EDbVendor.dbvoracle, "11.2")); 140 long time = System.currentTimeMillis(); 141 for (int i = 0; i < 1000000; i++) { 142 functionChecker.isBuiltInFunction("power", EDbVendor.dbvoracle, "11.2"); 143 } 144 System.out.println(System.currentTimeMillis() - time); 145 } 146 147// public static void main( String[] args ){ 148// EDbVendor db = EDbVendor.dbvoracle; 149// int i = functionChecker.getAvailableDbVersions(db).size(); 150// for(int k=0;k<i;k++) { 151// System.out.println(functionChecker.getAvailableDbVersions(db).get(k)); 152// } 153// System.out.println(functionChecker.isOraclePredefinedPackageFunction("DBMS_RANDOM.RANDOM")); 154// } 155 156}