Please wait. This can take some minutes ...
Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance.
Project price only 1 $
You can buy this project and download/modify it how often you want.
org.jooq.impl.MergeImpl Maven / Gradle / Ivy
/*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* Other licenses:
* -----------------------------------------------------------------------------
* Commercial licenses for this work are available. These replace the above
* Apache-2.0 license and offer limited warranties, support, maintenance, and
* commercial database integrations.
*
* For more information, please visit: http://www.jooq.org/licenses
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*/
package org.jooq.impl;
import static java.lang.Boolean.FALSE;
import static java.util.Collections.emptyList;
import static org.jooq.Clause.MERGE;
import static org.jooq.Clause.MERGE_MERGE_INTO;
import static org.jooq.Clause.MERGE_ON;
import static org.jooq.Clause.MERGE_SET;
import static org.jooq.Clause.MERGE_SET_ASSIGNMENT;
import static org.jooq.Clause.MERGE_USING;
import static org.jooq.Clause.MERGE_VALUES;
import static org.jooq.Clause.MERGE_WHEN_MATCHED_THEN_UPDATE;
import static org.jooq.Clause.MERGE_WHEN_NOT_MATCHED_THEN_INSERT;
// ...
import static org.jooq.SQLDialect.FIREBIRD;
import static org.jooq.SQLDialect.H2;
// ...
import static org.jooq.SQLDialect.HSQLDB;
// ...
// ...
// ...
// ...
// ...
import static org.jooq.conf.WriteIfReadonly.IGNORE;
import static org.jooq.conf.WriteIfReadonly.THROW;
import static org.jooq.impl.DSL.condition;
import static org.jooq.impl.DSL.exists;
import static org.jooq.impl.DSL.insertInto;
import static org.jooq.impl.DSL.noCondition;
import static org.jooq.impl.DSL.notExists;
import static org.jooq.impl.DSL.trueCondition;
import static org.jooq.impl.DSL.when;
import static org.jooq.impl.Keywords.K_AND;
import static org.jooq.impl.Keywords.K_AS;
import static org.jooq.impl.Keywords.K_DELETE;
import static org.jooq.impl.Keywords.K_INSERT;
import static org.jooq.impl.Keywords.K_KEY;
import static org.jooq.impl.Keywords.K_MATCHED;
import static org.jooq.impl.Keywords.K_MERGE_INTO;
import static org.jooq.impl.Keywords.K_NOT;
import static org.jooq.impl.Keywords.K_ON;
import static org.jooq.impl.Keywords.K_SET;
import static org.jooq.impl.Keywords.K_THEN;
import static org.jooq.impl.Keywords.K_UPDATE;
import static org.jooq.impl.Keywords.K_UPSERT;
import static org.jooq.impl.Keywords.K_USING;
import static org.jooq.impl.Keywords.K_VALUES;
import static org.jooq.impl.Keywords.K_WHEN;
import static org.jooq.impl.Keywords.K_WHERE;
import static org.jooq.impl.Keywords.K_WITH_PRIMARY_KEY;
import static org.jooq.impl.QueryPartListView.wrap;
import static org.jooq.impl.Tools.EMPTY_FIELD;
import static org.jooq.impl.Tools.collect;
import static org.jooq.impl.Tools.filter;
import static org.jooq.impl.Tools.map;
import static org.jooq.impl.Tools.nullSafe;
import static org.jooq.impl.Tools.BooleanDataKey.DATA_WRAP_DERIVED_TABLES_IN_PARENTHESES;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import org.jooq.Clause;
import org.jooq.Condition;
import org.jooq.Configuration;
import org.jooq.Context;
import org.jooq.Field;
import org.jooq.FieldOrRow;
import org.jooq.FieldOrRowOrSelect;
import org.jooq.MergeKeyStep1;
import org.jooq.MergeKeyStep10;
import org.jooq.MergeKeyStep11;
import org.jooq.MergeKeyStep12;
import org.jooq.MergeKeyStep13;
import org.jooq.MergeKeyStep14;
import org.jooq.MergeKeyStep15;
import org.jooq.MergeKeyStep16;
import org.jooq.MergeKeyStep17;
import org.jooq.MergeKeyStep18;
import org.jooq.MergeKeyStep19;
import org.jooq.MergeKeyStep2;
import org.jooq.MergeKeyStep20;
import org.jooq.MergeKeyStep21;
import org.jooq.MergeKeyStep22;
import org.jooq.MergeKeyStep3;
import org.jooq.MergeKeyStep4;
import org.jooq.MergeKeyStep5;
import org.jooq.MergeKeyStep6;
import org.jooq.MergeKeyStep7;
import org.jooq.MergeKeyStep8;
import org.jooq.MergeKeyStep9;
import org.jooq.MergeMatchedDeleteStep;
import org.jooq.MergeMatchedSetMoreStep;
import org.jooq.MergeMatchedThenStep;
import org.jooq.MergeNotMatchedSetMoreStep;
import org.jooq.MergeNotMatchedValuesStep1;
import org.jooq.MergeNotMatchedValuesStep10;
import org.jooq.MergeNotMatchedValuesStep11;
import org.jooq.MergeNotMatchedValuesStep12;
import org.jooq.MergeNotMatchedValuesStep13;
import org.jooq.MergeNotMatchedValuesStep14;
import org.jooq.MergeNotMatchedValuesStep15;
import org.jooq.MergeNotMatchedValuesStep16;
import org.jooq.MergeNotMatchedValuesStep17;
import org.jooq.MergeNotMatchedValuesStep18;
import org.jooq.MergeNotMatchedValuesStep19;
import org.jooq.MergeNotMatchedValuesStep2;
import org.jooq.MergeNotMatchedValuesStep20;
import org.jooq.MergeNotMatchedValuesStep21;
import org.jooq.MergeNotMatchedValuesStep22;
import org.jooq.MergeNotMatchedValuesStep3;
import org.jooq.MergeNotMatchedValuesStep4;
import org.jooq.MergeNotMatchedValuesStep5;
import org.jooq.MergeNotMatchedValuesStep6;
import org.jooq.MergeNotMatchedValuesStep7;
import org.jooq.MergeNotMatchedValuesStep8;
import org.jooq.MergeNotMatchedValuesStep9;
import org.jooq.MergeNotMatchedValuesStepN;
import org.jooq.MergeOnConditionStep;
import org.jooq.MergeOnStep;
import org.jooq.MergeUsingStep;
import org.jooq.Operator;
// ...
import org.jooq.QueryPart;
import org.jooq.Record;
import org.jooq.Record1;
import org.jooq.SQL;
import org.jooq.SQLDialect;
import org.jooq.Select;
import org.jooq.Table;
import org.jooq.TableLike;
import org.jooq.UniqueKey;
import org.jooq.exception.DataTypeException;
import org.jooq.impl.FieldMapForUpdate.SetClause;
import org.jooq.impl.QOM.UNotYetImplemented;
import org.jooq.impl.Tools.ExtendedDataKey;
import org.jooq.tools.StringUtils;
/**
* The SQL standard MERGE statement
*
* @author Lukas Eder
*/
@SuppressWarnings({ "unchecked", "rawtypes" })
final class MergeImpl extends AbstractRowCountQuery
implements
// Cascading interface implementations for Merge behaviour
UNotYetImplemented,
MergeUsingStep,
MergeKeyStep1,
MergeKeyStep2,
MergeKeyStep3,
MergeKeyStep4,
MergeKeyStep5,
MergeKeyStep6,
MergeKeyStep7,
MergeKeyStep8,
MergeKeyStep9,
MergeKeyStep10,
MergeKeyStep11,
MergeKeyStep12,
MergeKeyStep13,
MergeKeyStep14,
MergeKeyStep15,
MergeKeyStep16,
MergeKeyStep17,
MergeKeyStep18,
MergeKeyStep19,
MergeKeyStep20,
MergeKeyStep21,
MergeKeyStep22,
MergeOnStep,
MergeOnConditionStep,
MergeMatchedSetMoreStep,
MergeMatchedThenStep,
MergeNotMatchedSetMoreStep,
MergeNotMatchedValuesStep1,
MergeNotMatchedValuesStep2,
MergeNotMatchedValuesStep3,
MergeNotMatchedValuesStep4,
MergeNotMatchedValuesStep5,
MergeNotMatchedValuesStep6,
MergeNotMatchedValuesStep7,
MergeNotMatchedValuesStep8,
MergeNotMatchedValuesStep9,
MergeNotMatchedValuesStep10,
MergeNotMatchedValuesStep11,
MergeNotMatchedValuesStep12,
MergeNotMatchedValuesStep13,
MergeNotMatchedValuesStep14,
MergeNotMatchedValuesStep15,
MergeNotMatchedValuesStep16,
MergeNotMatchedValuesStep17,
MergeNotMatchedValuesStep18,
MergeNotMatchedValuesStep19,
MergeNotMatchedValuesStep20,
MergeNotMatchedValuesStep21,
MergeNotMatchedValuesStep22,
MergeNotMatchedValuesStepN {
private static final Clause[] CLAUSES = { MERGE };
private static final Set NO_SUPPORT_MULTI = SQLDialect.supportedBy(HSQLDB);
private static final Set REQUIRE_NEGATION = SQLDialect.supportedBy(H2, HSQLDB);
private static final Set NO_SUPPORT_CONDITION_AFTER_NO_CONDITION = SQLDialect.supportedBy(FIREBIRD);
private final WithImpl with;
private final Table table;
private final ConditionProviderImpl on;
private TableLike> using;
private boolean usingDual;
// Flags to keep track of DSL object creation state
private boolean matchedClause;
private final List matched;
private boolean notMatchedClause;
private final List notMatched;
// Objects for the UPSERT syntax (including H2 MERGE, HANA UPSERT, etc.)
private boolean upsertStyle;
private QueryPartList> upsertFields;
private QueryPartList> upsertKeys;
private QueryPartList> upsertValues;
private Select> upsertSelect;
MergeImpl(Configuration configuration, WithImpl with, Table table) {
this(configuration, with, table, null);
}
MergeImpl(Configuration configuration, WithImpl with, Table table, Collection extends Field>> fields) {
super(configuration);
this.with = with;
this.table = table;
this.on = new ConditionProviderImpl();
this.matched = new ArrayList<>();
this.notMatched = new ArrayList<>();
if (fields != null)
columns(fields);
}
// -------------------------------------------------------------------------
// UPSERT API
// -------------------------------------------------------------------------
final Table table() {
return table;
}
final QueryPartList> getUpsertFields() {
if (upsertFields == null)
upsertFields = new QueryPartList<>(table.fields());
return upsertFields;
}
final QueryPartList> getUpsertKeys() {
if (upsertKeys == null)
upsertKeys = new QueryPartList<>();
return upsertKeys;
}
final QueryPartList> getUpsertValues() {
if (upsertValues == null)
upsertValues = new QueryPartList<>();
return upsertValues;
}
final MatchedClause getLastMatched() {
return matched.get(matched.size() - 1);
}
final NotMatchedClause getLastNotMatched() {
return notMatched.get(notMatched.size() - 1);
}
@Override
public final MergeImpl columns(Field>... fields) {
return columns(Arrays.asList(fields));
}
@Override
public final MergeImpl columns(Collection extends Field>> fields) {
upsertStyle = true;
upsertFields = new QueryPartList<>(fields);
return this;
}
@Override
@SuppressWarnings("hiding")
public final MergeImpl columns(Field field1) {
return columns(Arrays.asList(field1));
}
@Override
@SuppressWarnings("hiding")
public final MergeImpl columns(Field field1, Field field2) {
return columns(Arrays.asList(field1, field2));
}
@Override
@SuppressWarnings("hiding")
public final MergeImpl columns(Field field1, Field field2, Field field3) {
return columns(Arrays.asList(field1, field2, field3));
}
@Override
@SuppressWarnings("hiding")
public final MergeImpl columns(Field field1, Field field2, Field field3, Field field4) {
return columns(Arrays.asList(field1, field2, field3, field4));
}
@Override
@SuppressWarnings("hiding")
public final MergeImpl columns(Field field1, Field field2, Field field3, Field field4, Field field5) {
return columns(Arrays.asList(field1, field2, field3, field4, field5));
}
@Override
@SuppressWarnings("hiding")
public final MergeImpl columns(Field field1, Field field2, Field field3, Field field4, Field field5, Field field6) {
return columns(Arrays.asList(field1, field2, field3, field4, field5, field6));
}
@Override
@SuppressWarnings("hiding")
public final MergeImpl columns(Field field1, Field field2, Field field3, Field field4, Field field5, Field field6, Field field7) {
return columns(Arrays.asList(field1, field2, field3, field4, field5, field6, field7));
}
@Override
@SuppressWarnings("hiding")
public final MergeImpl columns(Field field1, Field field2, Field field3, Field field4, Field field5, Field field6, Field field7, Field field8) {
return columns(Arrays.asList(field1, field2, field3, field4, field5, field6, field7, field8));
}
@Override
@SuppressWarnings("hiding")
public final MergeImpl columns(Field field1, Field field2, Field field3, Field field4, Field field5, Field field6, Field field7, Field field8, Field field9) {
return columns(Arrays.asList(field1, field2, field3, field4, field5, field6, field7, field8, field9));
}
@Override
@SuppressWarnings("hiding")
public final MergeImpl columns(Field field1, Field field2, Field field3, Field field4, Field field5, Field field6, Field field7, Field field8, Field field9, Field field10) {
return columns(Arrays.asList(field1, field2, field3, field4, field5, field6, field7, field8, field9, field10));
}
@Override
@SuppressWarnings("hiding")
public final MergeImpl columns(Field field1, Field field2, Field field3, Field field4, Field field5, Field field6, Field field7, Field field8, Field field9, Field field10, Field field11) {
return columns(Arrays.asList(field1, field2, field3, field4, field5, field6, field7, field8, field9, field10, field11));
}
@Override
@SuppressWarnings("hiding")
public final MergeImpl columns(Field field1, Field field2, Field field3, Field field4, Field field5, Field field6, Field field7, Field field8, Field field9, Field field10, Field field11, Field field12) {
return columns(Arrays.asList(field1, field2, field3, field4, field5, field6, field7, field8, field9, field10, field11, field12));
}
@Override
@SuppressWarnings("hiding")
public final MergeImpl columns(Field field1, Field field2, Field field3, Field field4, Field field5, Field field6, Field field7, Field field8, Field field9, Field field10, Field field11, Field field12, Field field13) {
return columns(Arrays.asList(field1, field2, field3, field4, field5, field6, field7, field8, field9, field10, field11, field12, field13));
}
@Override
@SuppressWarnings("hiding")
public final MergeImpl columns(Field field1, Field field2, Field field3, Field field4, Field field5, Field field6, Field field7, Field field8, Field field9, Field field10, Field field11, Field field12, Field field13, Field field14) {
return columns(Arrays.asList(field1, field2, field3, field4, field5, field6, field7, field8, field9, field10, field11, field12, field13, field14));
}
@Override
@SuppressWarnings("hiding")
public final MergeImpl columns(Field field1, Field field2, Field field3, Field field4, Field field5, Field field6, Field field7, Field field8, Field field9, Field field10, Field field11, Field field12, Field field13, Field field14, Field field15) {
return columns(Arrays.asList(field1, field2, field3, field4, field5, field6, field7, field8, field9, field10, field11, field12, field13, field14, field15));
}
@Override
@SuppressWarnings("hiding")
public final MergeImpl columns(Field field1, Field field2, Field field3, Field field4, Field field5, Field field6, Field field7, Field field8, Field field9, Field field10, Field field11, Field field12, Field field13, Field field14, Field field15, Field field16) {
return columns(Arrays.asList(field1, field2, field3, field4, field5, field6, field7, field8, field9, field10, field11, field12, field13, field14, field15, field16));
}
@Override
@SuppressWarnings("hiding")
public final MergeImpl columns(Field field1, Field field2, Field field3, Field field4, Field field5, Field field6, Field field7, Field field8, Field field9, Field field10, Field field11, Field field12, Field field13, Field field14, Field field15, Field field16, Field field17) {
return columns(Arrays.asList(field1, field2, field3, field4, field5, field6, field7, field8, field9, field10, field11, field12, field13, field14, field15, field16, field17));
}
@Override
@SuppressWarnings("hiding")
public final MergeImpl columns(Field field1, Field field2, Field field3, Field field4, Field field5, Field field6, Field field7, Field field8, Field field9, Field field10, Field field11, Field field12, Field