001/**
002 * Copyright (c) 2022-2023, Mybatis-Flex (fuhai999@gmail.com).
003 * <p>
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 * <p>
008 * http://www.apache.org/licenses/LICENSE-2.0
009 * <p>
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016package com.mybatisflex.core.dialect.impl;
017
018import com.mybatisflex.core.dialect.KeywordWrap;
019import com.mybatisflex.core.dialect.LimitOffsetProcesser;
020import com.mybatisflex.core.util.CollectionUtil;
021import com.mybatisflex.core.util.StringUtil;
022
023import java.util.*;
024
025public class OracleDialect extends CommonsDialectImpl {
026
027    private boolean caseSensitive;
028    private final Set<String> keywords = CollectionUtil.newHashSet(
029            "ACCESS", "ADD", "ALL", "ALTER",
030            "AND", "ANY", "ARRAYLEN", "AS",
031            "ASC", "AUDIT", "BETWEEN", "BY",
032            "CHAR", "CHECK", "CLUSTER", "COLUMN",
033            "COMMENT", "COMPRESS", "CONNECT", "CREATE",
034            "CURRENT", "DATE", "DECIMAL", "DEFAULT",
035            "DELETE", "DESC", "DISTINCT", "DROP",
036            "ELSE", "EXCLUSIVE", "EXISTS", "FILE",
037            "FLOAT", "FOR", "FROM", "GRANT",
038            "GROUP", "HAVING", "IDENTIFIED", "IMMEDIATE",
039            "IN", "INCREMENT", "INDEX", "INITIAL",
040            "INSERT", "INTEGER", "INTERSECT", "INTO",
041            "IS", "LEVEL", "LIKE", "LOCK",
042            "LONG", "MAXEXTENTS", "MINUS", "MODE",
043            "MODIFY", "NOAUDIT", "NOCOMPRESS", "NOT",
044            "NOTFOUND", "NOWAIT", "NULL", "NUMBER",
045            "OF", "OFFLINE", "ON", "ONLINE",
046            "OPTION", "OR", "ORDER", "PCTFREE",
047            "PRIOR", "PRIVILEGES", "PUBLIC", "RAW",
048            "RENAME", "RESOURCE", "REVOKE", "ROW",
049            "ROWID", "ROWLABEL", "ROWNUM", "ROWS",
050            "START", "SELECT", "SESSION", "SET",
051            "SHARE", "SIZE", "SMALLINT", "SQLBUF",
052            "SUCCESSFUL", "SYNONYM", "SYSDATE", "TABLE",
053            "THEN", "TO", "TRIGGER", "UID",
054            "UNION", "UNIQUE", "UPDATE", "USER",
055            "VALIDATE", "VALUES", "VARCHAR", "VARCHAR2"
056    );
057
058    public OracleDialect(LimitOffsetProcesser limitOffsetProcesser) {
059        super(KeywordWrap.NONE, limitOffsetProcesser);
060    }
061
062    public boolean isCaseSensitive() {
063        return caseSensitive;
064    }
065
066    public void setCaseSensitive(boolean caseSensitive) {
067        this.caseSensitive = caseSensitive;
068    }
069
070    @Override
071    public String wrap(String keyword) {
072        if (StringUtil.isBlank(keyword)) {
073            return "";
074        }
075        if (caseSensitive || keywords.contains(keyword.toUpperCase(Locale.ENGLISH))) {
076            return "\"" + keyword + "\"";
077        }
078        return keyword;
079    }
080}