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}