/*
* Copyright 2014, Stratio.
*
* 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 com.stratio.deep.aerospike;
import static junit.framework.Assert.fail;
import static junit.framework.TestCase.assertNotNull;
import static org.testng.Assert.assertEquals;
import static org.testng.AssertJUnit.assertNull;
import java.util.List;
import java.util.Map;
import com.stratio.deep.core.entity.SimpleBookEntity;
import org.apache.spark.rdd.RDD;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.testng.annotations.Test;
import com.aerospike.client.Record;
import com.aerospike.client.query.Filter;
import com.aerospike.client.query.RecordSet;
import com.aerospike.client.query.Statement;
import com.aerospike.hadoop.mapreduce.AerospikeRecord;
import com.stratio.deep.aerospike.extractor.AerospikeEntityExtractor;
import com.stratio.deep.commons.config.ExtractorConfig;
import com.stratio.deep.commons.extractor.utils.ExtractorConstants;
import com.stratio.deep.commons.filter.FilterType;
import com.stratio.deep.core.context.DeepSparkContext;
import com.stratio.deep.core.entity.BookEntity;
import com.stratio.deep.core.entity.MessageTestEntity;
import com.stratio.deep.core.extractor.ExtractorEntityTest;
/**
* Created by mariomgal on 07/11/14.
*/
@Test(groups = { "AerospikeEntityExtractorFT", "FunctionalTests" }, dependsOnGroups = { "AerospikeJavaRDDFT" })
public class AerospikeEntityExtractorFT extends ExtractorEntityTest {
private static final Logger LOG = LoggerFactory.getLogger(AerospikeEntityExtractorFT.class);
public AerospikeEntityExtractorFT() {
super(AerospikeEntityExtractor.class, AerospikeJavaRDDFT.HOST, AerospikeJavaRDDFT.PORT, false, SimpleBookEntity.class);
}
@Override
@Test
public void testInputColumns() {
DeepSparkContext context = new DeepSparkContext("local", "deepSparkContextTest");
try {
ExtractorConfig<MessageTestEntity> inputConfigEntity = new ExtractorConfig(MessageTestEntity.class);
inputConfigEntity.putValue(ExtractorConstants.HOST, AerospikeJavaRDDFT.HOST)
.putValue(ExtractorConstants.PORT, AerospikeJavaRDDFT.PORT)
.putValue(ExtractorConstants.NAMESPACE, AerospikeJavaRDDFT.NAMESPACE_ENTITY)
.putValue(ExtractorConstants.SET, "input")
.putValue(ExtractorConstants.INPUT_COLUMNS, new String[] { "id" });
inputConfigEntity.setExtractorImplClass(AerospikeEntityExtractor.class);
RDD<MessageTestEntity> inputRDDEntity = context.createRDD(inputConfigEntity);
MessageTestEntity messageEntity = inputRDDEntity.first();
assertNotNull("Message id should not be null.", messageEntity.getId());
assertNull("Message text should be null.", messageEntity.getMessage());
ExtractorConfig<MessageTestEntity> inputConfigEntity2 = new ExtractorConfig(MessageTestEntity.class);
inputConfigEntity2.putValue(ExtractorConstants.HOST, AerospikeJavaRDDFT.HOST)
.putValue(ExtractorConstants.PORT, AerospikeJavaRDDFT.PORT)
.putValue(ExtractorConstants.NAMESPACE, AerospikeJavaRDDFT.NAMESPACE_ENTITY)
.putValue(ExtractorConstants.SET, "input")
.putValue(ExtractorConstants.INPUT_COLUMNS, new String[] { "message" });
inputConfigEntity2.setExtractorImplClass(AerospikeEntityExtractor.class);
RDD<MessageTestEntity> inputRDDEntity2 = context.createRDD(inputConfigEntity2);
MessageTestEntity messageEntity2 = inputRDDEntity2.first();
assertNull("Message id should be null.", messageEntity2.getId());
assertNotNull("Message text should not be null.", messageEntity2.getMessage());
} finally {
context.stop();
}
}
@Test
public void testDataSet() {
DeepSparkContext context = new DeepSparkContext("local", "deepSparkContextTest");
try {
Statement stmnt = new Statement();
stmnt.setNamespace(AerospikeJavaRDDFT.NAMESPACE_ENTITY);
stmnt.setSetName("input");
stmnt.setFilters(Filter.equal("id", "messageTest"));
RecordSet recordSet = AerospikeJavaRDDFT.aerospike.query(null, stmnt);
Record record = null;
while (recordSet.next()) {
record = recordSet.getRecord();
}
AerospikeRecord aerospikeRecord = new AerospikeRecord(record);
Map<String, Object> bins = aerospikeRecord.bins;
ExtractorConfig<MessageTestEntity> inputConfigEntity = new ExtractorConfig(MessageTestEntity.class);
inputConfigEntity.putValue(ExtractorConstants.HOST, AerospikeJavaRDDFT.HOST)
.putValue(ExtractorConstants.PORT, AerospikeJavaRDDFT.PORT)
.putValue(ExtractorConstants.NAMESPACE, AerospikeJavaRDDFT.NAMESPACE_ENTITY)
.putValue(ExtractorConstants.SET, "input");
inputConfigEntity.setExtractorImplClass(AerospikeEntityExtractor.class);
RDD<MessageTestEntity> inputRDDEntity = context.createRDD(inputConfigEntity);
//Import dataSet was OK and we could read it
assertEquals(1, inputRDDEntity.count(), "There should be 1 read entity.");
List<MessageTestEntity> messages = inputRDDEntity.toJavaRDD().collect();
MessageTestEntity message = messages.get(0);
assertEquals((String) bins.get("id"), message.getId(), "Read message id should be the same as expected.");
assertEquals((String) bins.get("message"), message.getMessage(),
"Read message text should be the same as expected.");
} finally {
context.stop();
}
}
@Override
@Test(expectedExceptions = UnsupportedOperationException.class)
protected void testFilterNEQ() {
super.testFilterNEQ();
}
@Override
@Test
protected void testFilterEQ() {
DeepSparkContext context = new DeepSparkContext("local", "deepSparkContextTest");
try {
com.stratio.deep.commons.filter.Filter[] filters = null;
com.stratio.deep.commons.filter.Filter equalFilter = new com.stratio.deep.commons.filter.Filter("number",
FilterType.EQ, 3L);
com.stratio.deep.commons.filter.Filter ltFilter = new com.stratio.deep.commons.filter.Filter("number",
FilterType.LT, 4L);
com.stratio.deep.commons.filter.Filter gtFilter = new com.stratio.deep.commons.filter.Filter("number",
FilterType.GT, 5L);
com.stratio.deep.commons.filter.Filter lteFilter = new com.stratio.deep.commons.filter.Filter("number",
FilterType.LTE, 3L);
com.stratio.deep.commons.filter.Filter gteFilter = new com.stratio.deep.commons.filter.Filter("number",
FilterType.GTE, 4L);
com.stratio.deep.commons.filter.Filter equalFilter2 = new com.stratio.deep.commons.filter.Filter("number",
FilterType.EQ, 4L);
try {
filters = new com.stratio.deep.commons.filter.Filter[] { equalFilter, ltFilter };
ExtractorConfig inputConfigEntity = getFilterConfig(filters);
} catch (UnsupportedOperationException e) {
LOG.info("Expected exception thrown for more than one filter in aerospike");
}
try {
filters = new com.stratio.deep.commons.filter.Filter[] {
new com.stratio.deep.commons.filter.Filter("number", FilterType.NEQ, "invalid") };
ExtractorConfig inputConfigEntity = getFilterConfig(filters);
} catch (UnsupportedOperationException e) {
LOG.info("Expected exception thrown for a filter not supported by aerospike");
}
try {
com.stratio.deep.commons.filter.Filter invalidFilter = new com.stratio.deep.commons.filter.Filter(
"number", FilterType.LT, "invalid");
filters = new com.stratio.deep.commons.filter.Filter[] { invalidFilter };
ExtractorConfig inputConfigEntity = getFilterConfig(filters);
} catch (UnsupportedOperationException e) {
LOG.info("Expected exception thrown for using a range filter without Long mandatory value type");
}
ExtractorConfig<MessageTestEntity> inputConfigEntity = new ExtractorConfig(MessageTestEntity.class);
inputConfigEntity.putValue(ExtractorConstants.HOST, AerospikeJavaRDDFT.HOST)
.putValue(ExtractorConstants.PORT, AerospikeJavaRDDFT.PORT)
.putValue(ExtractorConstants.NAMESPACE, AerospikeJavaRDDFT.NAMESPACE_ENTITY)
.putValue(ExtractorConstants.SET, "input")
.putValue(ExtractorConstants.FILTER_QUERY,
new com.stratio.deep.commons.filter.Filter[] { equalFilter });
inputConfigEntity.setExtractorImplClass(AerospikeEntityExtractor.class);
RDD<MessageTestEntity> inputRDDEntity = context.createRDD(inputConfigEntity);
assertEquals(1, inputRDDEntity.count(), "Expected read entity count is 1");
ExtractorConfig<MessageTestEntity> inputConfigEntity2 = new ExtractorConfig(MessageTestEntity.class);
inputConfigEntity2.putValue(ExtractorConstants.HOST, AerospikeJavaRDDFT.HOST)
.putValue(ExtractorConstants.PORT, AerospikeJavaRDDFT.PORT)
.putValue(ExtractorConstants.NAMESPACE, AerospikeJavaRDDFT.NAMESPACE_ENTITY)
.putValue(ExtractorConstants.SET, "input")
.putValue(ExtractorConstants.FILTER_QUERY,
new com.stratio.deep.commons.filter.Filter[] { ltFilter });
inputConfigEntity2.setExtractorImplClass(AerospikeEntityExtractor.class);
RDD<MessageTestEntity> inputRDDEntity2 = context.createRDD(inputConfigEntity2);
assertEquals(1, inputRDDEntity2.count(), "Expected read entity count is 1");
ExtractorConfig<MessageTestEntity> inputConfigEntity3 = new ExtractorConfig(MessageTestEntity.class);
inputConfigEntity3.putValue(ExtractorConstants.HOST, AerospikeJavaRDDFT.HOST)
.putValue(ExtractorConstants.PORT, AerospikeJavaRDDFT.PORT)
.putValue(ExtractorConstants.NAMESPACE, AerospikeJavaRDDFT.NAMESPACE_ENTITY)
.putValue(ExtractorConstants.SET, "input")
.putValue(ExtractorConstants.FILTER_QUERY,
new com.stratio.deep.commons.filter.Filter[] { gtFilter });
inputConfigEntity3.setExtractorImplClass(AerospikeEntityExtractor.class);
RDD<MessageTestEntity> inputRDDEntity3 = context.createRDD(inputConfigEntity3);
assertEquals(0, inputRDDEntity3.count(), "Expected read entity count is 0");
ExtractorConfig<MessageTestEntity> inputConfigEntity4 = new ExtractorConfig(MessageTestEntity.class);
inputConfigEntity4.putValue(ExtractorConstants.HOST, AerospikeJavaRDDFT.HOST)
.putValue(ExtractorConstants.PORT, AerospikeJavaRDDFT.PORT)
.putValue(ExtractorConstants.NAMESPACE, AerospikeJavaRDDFT.NAMESPACE_ENTITY)
.putValue(ExtractorConstants.SET, "input")
.putValue(ExtractorConstants.FILTER_QUERY,
new com.stratio.deep.commons.filter.Filter[] { lteFilter });
inputConfigEntity4.setExtractorImplClass(AerospikeEntityExtractor.class);
RDD<MessageTestEntity> inputRDDEntity4 = context.createRDD(inputConfigEntity4);
assertEquals(1, inputRDDEntity4.count(), "Expected read entity count is 1");
ExtractorConfig<MessageTestEntity> inputConfigEntity5 = new ExtractorConfig(MessageTestEntity.class);
inputConfigEntity5.putValue(ExtractorConstants.HOST, AerospikeJavaRDDFT.HOST)
.putValue(ExtractorConstants.PORT, AerospikeJavaRDDFT.PORT)
.putValue(ExtractorConstants.NAMESPACE, AerospikeJavaRDDFT.NAMESPACE_ENTITY)
.putValue(ExtractorConstants.SET, "input")
.putValue(ExtractorConstants.FILTER_QUERY,
new com.stratio.deep.commons.filter.Filter[] { gteFilter });
inputConfigEntity5.setExtractorImplClass(AerospikeEntityExtractor.class);
RDD<MessageTestEntity> inputRDDEntity5 = context.createRDD(inputConfigEntity5);
assertEquals(0, inputRDDEntity5.count(), "Expected read entity count is 0");
ExtractorConfig<MessageTestEntity> inputConfigEntity6 = new ExtractorConfig(MessageTestEntity.class);
inputConfigEntity6.putValue(ExtractorConstants.HOST, AerospikeJavaRDDFT.HOST)
.putValue(ExtractorConstants.PORT, AerospikeJavaRDDFT.PORT)
.putValue(ExtractorConstants.NAMESPACE, AerospikeJavaRDDFT.NAMESPACE_ENTITY)
.putValue(ExtractorConstants.SET, "input")
.putValue(ExtractorConstants.FILTER_QUERY,
new com.stratio.deep.commons.filter.Filter[] { gteFilter });
inputConfigEntity6.setExtractorImplClass(AerospikeEntityExtractor.class);
RDD<MessageTestEntity> inputRDDEntity6 = context.createRDD(inputConfigEntity5);
assertEquals(0, inputRDDEntity6.count(), "Expected read entity count is 0");
//TODO: Equality filter not working properly
// ExtractorConfig<MessageTestEntity> inputConfigEntity7 = new ExtractorConfig(MessageTestEntity.class);
// inputConfigEntity7.putValue(ExtractorConstants.HOST, AerospikeJavaRDDTest.HOST).putValue(ExtractorConstants.PORT, AerospikeJavaRDDTest.PORT)
// .putValue(ExtractorConstants.NAMESPACE, "test")
// .putValue(ExtractorConstants.SET, "input")
// .putValue(ExtractorConstants.FILTER_QUERY, new com.stratio.deep.commons.filter.Filter[] {equalFilter2});
// inputConfigEntity7.setExtractorImplClass(AerospikeEntityExtractor.class);
//
// RDD<MessageTestEntity> inputRDDEntity7 = context.createRDD(inputConfigEntity7);
// assertEquals(0, inputRDDEntity7.count());
} finally {
context.stop();
}
}
@Test
public void testInvalidDataType() {
DeepSparkContext context = new DeepSparkContext("local", "deepSparkContextTest");
try {
ExtractorConfig<BookEntity> inputConfigEntity = new ExtractorConfig(BookEntity.class);
inputConfigEntity.putValue(ExtractorConstants.HOST, AerospikeJavaRDDFT.HOST)
.putValue(ExtractorConstants.PORT, AerospikeJavaRDDFT.PORT)
.putValue(ExtractorConstants.NAMESPACE, "bookinput")
.putValue(ExtractorConstants.SET, "input");
inputConfigEntity.setExtractorImplClass(AerospikeEntityExtractor.class);
RDD<BookEntity> inputRDDEntity = context.createRDD(inputConfigEntity);
BookEntity bookEntity = inputRDDEntity.first();
fail();
} catch (Exception e) {
} finally {
context.stop();
}
}
}