| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You 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 org.apache.spark.sql.index; |
| |
| import java.util.ArrayList; |
| import java.util.Arrays; |
| import java.util.List; |
| |
| import org.apache.spark.sql.secondaryindex.exception.IndexTableExistException; |
| |
| import org.apache.carbondata.core.constants.CarbonCommonConstants; |
| import org.apache.carbondata.core.metadata.index.IndexType; |
| import org.apache.carbondata.core.metadata.schema.indextable.IndexTableInfo; |
| |
| public class IndexTableUtil { |
| /** |
| * adds index table info into parent table properties |
| * |
| */ |
| public static String checkAndAddIndexTable(String gsonData, IndexTableInfo newIndexTable, |
| boolean isSecondaryIndex) throws IndexTableExistException { |
| IndexTableInfo[] indexTableInfos = IndexTableInfo.fromGson(gsonData); |
| if (null == indexTableInfos) { |
| indexTableInfos = new IndexTableInfo[0]; |
| } |
| List<IndexTableInfo> indexTables = new ArrayList<>(Arrays.asList(indexTableInfos)); |
| if (isSecondaryIndex) { |
| for (IndexTableInfo indexTable : indexTableInfos) { |
| if (indexTable.getIndexProperties().get(CarbonCommonConstants.INDEX_PROVIDER) |
| .equalsIgnoreCase(IndexType.SI.getIndexProviderName())) { |
| if (indexTable.getIndexCols().size() == newIndexTable.getIndexCols().size()) { |
| //If column order is not same, then also index table creation should be successful |
| //eg., index1 is a,b,d and index2 is a,d,b. Both table creation should be successful |
| boolean isColumnOrderSame = true; |
| for (int i = 0; i < indexTable.getIndexCols().size(); i++) { |
| if (!indexTable.getIndexCols().get(i) |
| .equalsIgnoreCase(newIndexTable.getIndexCols().get(i))) { |
| isColumnOrderSame = false; |
| break; |
| } |
| } |
| if (isColumnOrderSame) { |
| throw new IndexTableExistException("Index Table with selected columns already exist"); |
| } |
| } |
| } |
| } |
| } |
| indexTables.add(newIndexTable); |
| return IndexTableInfo.toGson(indexTables.toArray(new IndexTableInfo[0])); |
| } |
| } |