blob: 7a0b604629c551c1e53c0df99a496b3cf04643e9 [file] [log] [blame]
/*
* 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.ignite.internal.storage.index;
import static java.util.stream.Collectors.toList;
import static org.apache.ignite.internal.catalog.descriptors.CatalogIndexStatus.AVAILABLE;
import static org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willCompleteSuccessfully;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.empty;
import static org.hamcrest.Matchers.nullValue;
import static org.hamcrest.Matchers.sameInstance;
import java.util.concurrent.CompletableFuture;
import java.util.stream.Stream;
import org.apache.ignite.internal.catalog.descriptors.CatalogHashIndexDescriptor;
import org.apache.ignite.internal.catalog.descriptors.CatalogTableDescriptor;
import org.apache.ignite.internal.storage.RowId;
import org.apache.ignite.internal.storage.index.impl.BinaryTupleRowSerializer;
import org.apache.ignite.sql.ColumnType;
import org.junit.jupiter.api.Test;
/**
* Base class for Hash Index storage tests.
*/
public abstract class AbstractHashIndexStorageTest extends AbstractIndexStorageTest<HashIndexStorage, StorageHashIndexDescriptor> {
@Override
protected HashIndexStorage createIndexStorage(String name, boolean built, ColumnType... columnTypes) {
CatalogTableDescriptor tableDescriptor = catalogService.table(TABLE_NAME, clock.nowLong());
int tableId = tableDescriptor.id();
int indexId = catalogId.getAndIncrement();
CatalogHashIndexDescriptor indexDescriptor = createCatalogIndexDescriptor(tableId, indexId, name, columnTypes);
HashIndexStorage indexStorage = tableStorage.getOrCreateHashIndex(
TEST_PARTITION,
new StorageHashIndexDescriptor(tableDescriptor, indexDescriptor)
);
if (built) {
completeBuildIndex(indexStorage);
}
return indexStorage;
}
@Override
protected StorageHashIndexDescriptor indexDescriptor(HashIndexStorage index) {
return index.indexDescriptor();
}
@Override
CatalogHashIndexDescriptor createCatalogIndexDescriptor(int tableId, int indexId, String indexName, ColumnType... columnTypes) {
var indexDescriptor = new CatalogHashIndexDescriptor(
indexId,
indexName,
tableId,
false,
AVAILABLE,
catalogService.latestCatalogVersion(),
Stream.of(columnTypes).map(AbstractIndexStorageTest::columnName).collect(toList())
);
addToCatalog(indexDescriptor);
return indexDescriptor;
}
@Test
public void testDestroy() {
HashIndexStorage index = createIndexStorage(INDEX_NAME, ColumnType.INT32, ColumnType.STRING);
int indexId = index.indexDescriptor().id();
assertThat(tableStorage.getIndex(TEST_PARTITION, indexId), is(sameInstance(index)));
var serializer = new BinaryTupleRowSerializer(index.indexDescriptor());
IndexRow row1 = serializer.serializeRow(new Object[]{ 1, "foo" }, new RowId(TEST_PARTITION));
IndexRow row2 = serializer.serializeRow(new Object[]{ 1, "foo" }, new RowId(TEST_PARTITION));
IndexRow row3 = serializer.serializeRow(new Object[]{ 2, "bar" }, new RowId(TEST_PARTITION));
put(index, row1);
put(index, row2);
put(index, row3);
CompletableFuture<Void> destroyFuture = tableStorage.destroyIndex(index.indexDescriptor().id());
assertThat(destroyFuture, willCompleteSuccessfully());
assertThat(tableStorage.getIndex(TEST_PARTITION, indexId), is(nullValue()));
index = createIndexStorage(INDEX_NAME, ColumnType.INT32, ColumnType.STRING);
assertThat(getAll(index, row1), is(empty()));
assertThat(getAll(index, row2), is(empty()));
assertThat(getAll(index, row3), is(empty()));
}
protected IndexRow createIndexRow(BinaryTupleRowSerializer serializer, RowId rowId, Object... values) {
return serializer.serializeRow(values, rowId);
}
}