package org.gbif.occurrence.persistence;
import org.gbif.dwc.terms.GbifTerm;
import org.gbif.occurrence.common.config.OccHBaseConfiguration;
import org.gbif.occurrence.common.identifier.HolyTriplet;
import org.gbif.occurrence.common.identifier.PublisherProvidedUniqueIdentifier;
import org.gbif.occurrence.common.identifier.UniqueIdentifier;
import org.gbif.occurrence.persistence.api.DatasetDeletionService;
import org.gbif.occurrence.persistence.api.Fragment;
import org.gbif.occurrence.persistence.api.FragmentPersistenceService;
import org.gbif.occurrence.persistence.api.KeyLookupResult;
import org.gbif.occurrence.persistence.api.OccurrenceKeyPersistenceService;
import org.gbif.occurrence.persistence.api.OccurrencePersistenceService;
import org.gbif.occurrence.persistence.hbase.Columns;
import org.gbif.occurrence.persistence.keygen.HBaseLockingKeyService;
import org.gbif.occurrence.persistence.keygen.KeyPersistenceService;
import java.util.Iterator;
import java.util.Set;
import java.util.UUID;
import com.google.common.collect.Sets;
import org.apache.hadoop.hbase.HBaseTestingUtility;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import org.apache.hadoop.hbase.util.Bytes;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
public class DatasetDeletionServiceImplTest {
private static final OccHBaseConfiguration CFG = new OccHBaseConfiguration();
static {
CFG.setEnvironment("keygen_test");
}
private static final byte[] TABLE = Bytes.toBytes(CFG.occTable);
private static final String CF_NAME = "o";
private static final byte[] CF = Bytes.toBytes(CF_NAME);
private static final byte[] COUNTER_TABLE = Bytes.toBytes(CFG.counterTable);
private static final String COUNTER_CF_NAME = "o";
private static final byte[] COUNTER_CF = Bytes.toBytes(COUNTER_CF_NAME);
private static final byte[] LOOKUP_TABLE = Bytes.toBytes(CFG.lookupTable);
private static final String LOOKUP_CF_NAME = "o";
private static final byte[] LOOKUP_CF = Bytes.toBytes(LOOKUP_CF_NAME);
private static final UUID GOOD_DATASET_KEY = UUID.randomUUID();
private static Connection connection;
private OccurrenceKeyPersistenceService occurrenceKeyService;
private OccurrencePersistenceService occurrenceService;
private DatasetDeletionService deletionService;
private static final HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();
@BeforeClass
public static void beforeClass() throws Exception {
TEST_UTIL.startMiniCluster(1);
TEST_UTIL.createTable(TABLE, CF);
TEST_UTIL.createTable(LOOKUP_TABLE, LOOKUP_CF);
TEST_UTIL.createTable(COUNTER_TABLE, COUNTER_CF);
connection = ConnectionFactory.createConnection(TEST_UTIL.getConfiguration());
}
@AfterClass
public static void afterClass() throws Exception {
TEST_UTIL.shutdownMiniCluster();
connection.close();
}
@Before
public void setUp() throws Exception {
TEST_UTIL.truncateTable(TABLE);
TEST_UTIL.truncateTable(LOOKUP_TABLE);
TEST_UTIL.truncateTable(COUNTER_TABLE);
KeyPersistenceService<Integer> keyService = new HBaseLockingKeyService(CFG, connection);
occurrenceKeyService = new OccurrenceKeyPersistenceServiceImpl(keyService);
FragmentPersistenceService fragmentService =
new FragmentPersistenceServiceImpl(CFG, connection, occurrenceKeyService);
occurrenceService = new OccurrencePersistenceServiceImpl(CFG, connection);
deletionService = new DatasetDeletionServiceImpl(occurrenceService, occurrenceKeyService);
// add some occurrences
// for datasetKey
Set<UniqueIdentifier> uniqueIds = Sets.newHashSet();
uniqueIds.add(new HolyTriplet(GOOD_DATASET_KEY, "ic", "cc", "cn1", null));
uniqueIds.add(new PublisherProvidedUniqueIdentifier(GOOD_DATASET_KEY, "abc1"));
Fragment fragment = new Fragment(GOOD_DATASET_KEY, null, null, null, null, null, null, null, null, null);
fragmentService.insert(fragment, uniqueIds);
uniqueIds = Sets.newHashSet();
uniqueIds.add(new HolyTriplet(GOOD_DATASET_KEY, "ic", "cc", "cn2", null));
uniqueIds.add(new PublisherProvidedUniqueIdentifier(GOOD_DATASET_KEY, "abc2"));
fragment = new Fragment(GOOD_DATASET_KEY, null, null, null, null, null, null, null, null, null);
fragmentService.insert(fragment, uniqueIds);
uniqueIds = Sets.newHashSet();
uniqueIds.add(new HolyTriplet(GOOD_DATASET_KEY, "ic", "cc", "cn3", null));
uniqueIds.add(new PublisherProvidedUniqueIdentifier(GOOD_DATASET_KEY, "abc3"));
fragment = new Fragment(GOOD_DATASET_KEY, null, null, null, null, null, null, null, null, null);
fragmentService.insert(fragment, uniqueIds);
}
@Test
public void testDatasetKeyExists() {
Iterator<Integer> iterator =
occurrenceService.getKeysByColumn(Bytes.toBytes(GOOD_DATASET_KEY.toString()), Columns.column(GbifTerm.datasetKey));
int count = 0;
while (iterator.hasNext()) {
iterator.next();
count++;
}
assertEquals(3, count);
PublisherProvidedUniqueIdentifier uniqueId = new PublisherProvidedUniqueIdentifier(GOOD_DATASET_KEY, "abc3");
Set<UniqueIdentifier> uniqueIdentifiers = Sets.newHashSet();
uniqueIdentifiers.add(uniqueId);
KeyLookupResult result = occurrenceKeyService.findKey(uniqueIdentifiers);
assertEquals(3, result.getKey());
deletionService.deleteDataset(GOOD_DATASET_KEY);
iterator = occurrenceService.getKeysByColumn(Bytes.toBytes(GOOD_DATASET_KEY.toString()), Columns.column(GbifTerm.datasetKey));
assertFalse(iterator.hasNext());
result = occurrenceKeyService.findKey(uniqueIdentifiers);
assertNull(result);
}
@Test
public void testDatasetKeyDoesntExist() {
UUID datasetKey = UUID.randomUUID();
Iterator<Integer> iterator =
occurrenceService.getKeysByColumn(Bytes.toBytes(datasetKey.toString()), Columns.column(GbifTerm.datasetKey));
assertFalse(iterator.hasNext());
deletionService.deleteDataset(datasetKey);
iterator = occurrenceService.getKeysByColumn(Bytes.toBytes(datasetKey.toString()), Columns.column(GbifTerm.datasetKey));
assertFalse(iterator.hasNext());
}
}