/* * Copyright 2007 - 2017 the original author or authors. * * 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. */ package net.sf.jailer.datamodel; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import net.sf.jailer.ExecutionContext; import net.sf.jailer.configuration.DBMS; import net.sf.jailer.database.Session; /** * Support for rowids. * * @author Ralf Wisser */ public class RowIdSupport { private final boolean useRowIds; private boolean useRowIdsOnlyForTablesWithoutPK = false; private final DataModel dataModel; private PrimaryKey tablePK; private PrimaryKey uPK; /** * Constructor. * * @param dataModel the data model * @param configuration DBMS configuration * @param rowIdType type of rowid-columns * @param useRowIds <code>true</code> iff rowid column is used instead of primary keys */ public RowIdSupport(DataModel dataModel, DBMS configuration, String rowIdType, boolean useRowIds) { this.dataModel = dataModel; this.useRowIds = useRowIds; if (useRowIds) { tablePK = new PrimaryKey(Arrays.asList(new Column(configuration.getRowidName(), rowIdType, 0, -1))); uPK = new PrimaryKey(Arrays.asList(new Column("PK", rowIdType, 0, -1))); } } /** * Constructor. * * @param dataModel the data model * @param configuration DBMS configuration * @param useRowIds <code>true</code> iff rowid column is used instead of primary keys */ public RowIdSupport(DataModel dataModel, DBMS configuration, boolean useRowIds) { this(dataModel, configuration, configuration.getRowidType(), useRowIds && configuration.getRowidName() != null); } /** * Constructor. * * @param dataModel the data model * @param rowIdType type of rowid-columns * @param configuration DBMS configuration */ public RowIdSupport(DataModel dataModel, DBMS configuration, String rowIdType, ExecutionContext executionContext) { this(dataModel, configuration, rowIdType, initialUseRowId(configuration, executionContext)); } /** * Constructor. * * @param dataModel the data model * @param configuration DBMS configuration */ public RowIdSupport(DataModel dataModel, DBMS configuration, ExecutionContext executionContext) { this(dataModel, configuration, initialUseRowId(configuration, executionContext)); } private static boolean initialUseRowId(DBMS configuration, ExecutionContext executionContext) { return configuration.getRowidName() != null && !executionContext.getNoRowid(); } /** * Gets the primary key of a table. * * @param table the table * @return the primary key of the table */ public PrimaryKey getPrimaryKey(Table table) { if (table.primaryKey != null) { if (useRowIds && (!useRowIdsOnlyForTablesWithoutPK || table.primaryKey.getColumns().isEmpty())) { return tablePK; } } return table.primaryKey; } /** * Gets the universal primary key. * * @param session for null value guessing * @return the universal primary key */ public PrimaryKey getUniversalPrimaryKey(Session session) { if (useRowIds) { return uPK; } return dataModel.getUniversalPrimaryKey(session); } /** * Gets the universal primary key. * * @return the universal primary key */ public PrimaryKey getUniversalPrimaryKey() { if (useRowIds) { return uPK; } return dataModel.getUniversalPrimaryKey(); } /** * @param useRowIdsOnlyForTablesWithoutPK the useRowIdsOnlyForTablesWithoutPK to set */ public void setUseRowIdsOnlyForTablesWithoutPK( boolean useRowIdsOnlyForTablesWithoutPK) { this.useRowIdsOnlyForTablesWithoutPK = useRowIdsOnlyForTablesWithoutPK; } /** * Gets the columns with additional rowid-column of a table * * @param table the table * @return the columns of the table */ public List<Column> getColumns(Table table) { List<Column> columns = table.getColumns(); if (table.primaryKey != null) { if (useRowIds && (!useRowIdsOnlyForTablesWithoutPK || table.primaryKey.getColumns().isEmpty())) { columns = new ArrayList<Column>(columns); columns.addAll(tablePK.getColumns()); return columns; } } return columns; } }