package com.tesora.dve.sql.parser; /* * #%L * Tesora Inc. * Database Virtualization Engine * %% * Copyright (C) 2011 - 2014 Tesora Inc. * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License, version 3, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * #L% */ import java.util.Arrays; import com.tesora.dve.sql.schema.LockInfo; public final class ParserOptions { public static enum Option { TRACEPARSER, TRACELEXER, TRACETRANSLATOR, FAILEARLY, RESOLVE, DEBUGLOG, DIAGNOSING_EXCEPTIONS, ALLOW_DUPLICATES, ALLOW_TENANT_COLUMN, TSCHEMA, PREPARE, OMIT_METADATA_INJECTION, ACTUAL_LITERALS, RAW_PLAN_STEP, DISABLE_MT_LOOKUP_CHECKS, OMIT_TENANT_COLUMN_INJECTION, INHIBIT_SINGLE_SITE_OPTIMIZATION, IGNORE_MISSING_USER, DO_NOT_LOCK, LOCK_OVERRIDE, SESSION_REWRITE_FORCE_PUSHDOWN, INFOSCHEMA_VIEW, TRIGGER_PLANNING, NESTED_PLAN } public static final ParserOptions NONE = new ParserOptions(); public static final ParserOptions TEST = NONE.setFailEarly(); public static final ParserOptions DEBUGPARSER = TEST.setTraceParser(); public static final ParserOptions DEBUGLEXER = DEBUGPARSER.setTraceLexer(); public static final ParserOptions DEBUGTRANSLATOR = TEST.setTraceTranslator(); private final Object[] settings; // no public constructor, use the statics instead private ParserOptions() { settings = new Object[Option.values().length]; } private ParserOptions(ParserOptions other) { settings = Arrays.copyOf(other.settings, other.settings.length); } private ParserOptions addSetting(Option o, Object v) { ParserOptions ret = new ParserOptions(this); ret.settings[o.ordinal()] = v; return ret; } private ParserOptions removeSetting(Option o) { ParserOptions ret = new ParserOptions(this); ret.settings[o.ordinal()] = null; return ret; } public boolean hasSetting(Option o) { Object e = settings[o.ordinal()]; return (e == null ? false : ((Boolean)e).booleanValue()); } public Object getSetting(Option o) { return settings[o.ordinal()]; } // for temporary stuff public ParserOptions addSetting(Option o) { return addSetting(o, Boolean.TRUE); } public ParserOptions clearSetting(Option o) { return removeSetting(o); } public ParserOptions setTraceParser() { return addSetting(Option.TRACEPARSER, Boolean.TRUE); } public ParserOptions setTraceLexer() { return addSetting(Option.TRACELEXER, Boolean.TRUE); } public ParserOptions setFailEarly() { return addSetting(Option.FAILEARLY, Boolean.TRUE); } public ParserOptions setTraceTranslator() { return addSetting(Option.TRACETRANSLATOR, Boolean.TRUE); } public ParserOptions setResolve() { return addSetting(Option.RESOLVE, Boolean.TRUE); } public ParserOptions unsetResolve() { return removeSetting(Option.RESOLVE); } public ParserOptions setDebugLog(boolean v) { return addSetting(Option.DEBUGLOG, Boolean.valueOf(v)); } public ParserOptions setAllowDuplicates() { return addSetting(Option.ALLOW_DUPLICATES, Boolean.TRUE); } public ParserOptions setAllowTenantColumn() { return addSetting(Option.ALLOW_TENANT_COLUMN, Boolean.TRUE); } public ParserOptions setTSchema() { return addSetting(Option.TSCHEMA, Boolean.TRUE); } public ParserOptions setPrepare() { return addSetting(Option.PREPARE, Boolean.TRUE); } public ParserOptions setOmitMetadataInjection() { return addSetting(Option.OMIT_METADATA_INJECTION, Boolean.TRUE); } public ParserOptions setIgnoreMissingUser() { return addSetting(Option.IGNORE_MISSING_USER, Boolean.TRUE); } // when this is on - don't make delegating literals // used in pstmt and raw plan support public ParserOptions setActualLiterals() { return addSetting(Option.ACTUAL_LITERALS, Boolean.TRUE); } public ParserOptions setRawPlanStep() { return addSetting(Option.RAW_PLAN_STEP, Boolean.TRUE); } // used in mt support for fks public ParserOptions disableMTLookupChecks() { return addSetting(Option.DISABLE_MT_LOOKUP_CHECKS, Boolean.TRUE); } public ParserOptions setOmitTenantColumnInjection() { return addSetting(Option.OMIT_TENANT_COLUMN_INJECTION, Boolean.TRUE); } public ParserOptions setInhibitSingleSiteOptimization() { return addSetting(Option.INHIBIT_SINGLE_SITE_OPTIMIZATION, Boolean.TRUE); } public ParserOptions setIgnoreLocking() { return addSetting(Option.DO_NOT_LOCK, Boolean.TRUE); } public ParserOptions setLockOverride(LockInfo lockInfo) { return addSetting(Option.LOCK_OVERRIDE, lockInfo); } public ParserOptions setForceSessionPushdown() { return addSetting(Option.SESSION_REWRITE_FORCE_PUSHDOWN, Boolean.TRUE); } public ParserOptions setInfoSchemaView() { return addSetting(Option.INFOSCHEMA_VIEW, Boolean.TRUE); } public ParserOptions setTriggerPlanning() { return addSetting(Option.TRIGGER_PLANNING, Boolean.TRUE); } public ParserOptions setNestedPlan() { return addSetting(Option.NESTED_PLAN, Boolean.TRUE); } public boolean isTraceParser() { return hasSetting(Option.TRACEPARSER); } public boolean isTraceLexer() { return hasSetting(Option.TRACELEXER); } public boolean isFailEarly() { return hasSetting(Option.FAILEARLY); } public boolean isTraceTranslator() { return hasSetting(Option.TRACETRANSLATOR); } public boolean isResolve() { return hasSetting(Option.RESOLVE); } public boolean isDebugLog() { return hasSetting(Option.DEBUGLOG); } public boolean isAllowDuplicates() { return hasSetting(Option.ALLOW_DUPLICATES); } public boolean isAllowTenantColumn() { return hasSetting(Option.ALLOW_TENANT_COLUMN); } public boolean isOmitTenantColumnInjection() { return hasSetting(Option.OMIT_TENANT_COLUMN_INJECTION); } public boolean isTSchema() { return hasSetting(Option.TSCHEMA); } public boolean isPrepare() { return hasSetting(Option.PREPARE); } public boolean isOmitMetadataInjection() { return hasSetting(Option.OMIT_METADATA_INJECTION); } public boolean isActualLiterals() { return hasSetting(Option.ACTUAL_LITERALS); } public boolean isRawPlanStep() { return hasSetting(Option.RAW_PLAN_STEP); } public boolean isDisableMTLookupChecks() { return hasSetting(Option.DISABLE_MT_LOOKUP_CHECKS); } public boolean isInhibitSingleSiteOptimization() { return hasSetting(Option.INHIBIT_SINGLE_SITE_OPTIMIZATION); } public boolean isIgnoreMissingUser() { return hasSetting(Option.IGNORE_MISSING_USER); } public boolean isIgnoreLocking() { return hasSetting(Option.DO_NOT_LOCK); } public LockInfo getLockOverride() { return (LockInfo) getSetting(Option.LOCK_OVERRIDE); } public boolean isForceSessionPushdown() { return hasSetting(Option.SESSION_REWRITE_FORCE_PUSHDOWN); } public boolean isInfoSchemaView() { return hasSetting(Option.INFOSCHEMA_VIEW); } public boolean isTriggerPlanning() { return hasSetting(Option.TRIGGER_PLANNING); } public boolean isNestedPlan() { return hasSetting(Option.NESTED_PLAN); } public String toString() { StringBuilder buf = new StringBuilder(); buf.append("ParserOptions{"); boolean first = false; for(Option o : Option.values()) { Object v = settings[o.ordinal()]; if (v == null) continue; if (!first) first = true; else buf.append(", "); buf.append(o).append("='").append(v).append("'"); } buf.append("}"); return buf.toString(); } }