/*
* Copyright 2014 Red Hat, Inc. and/or its affiliates.
*
* 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 org.dashbuilder.dataprovider.backend.elasticsearch;
import org.dashbuilder.dataset.*;
import org.dashbuilder.dataset.sort.SortOrder;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
/**
* <p>Data test for ElasticSearchDataSet column definitions.</p>
*
* <p>Test dataset: <code>org/dashbuilder/dataprovider/backend/elasticsearch/expensereports.dset</code></p>
* <ul>
* <li>Uses column provided from EL index mapping (allColumns flag is set to true)</li>
* </ul>
*
* <p>Test dataset: <code>org/dashbuilder/dataprovider/backend/elasticsearch/expensereports-custom-columns.dset</code></p>
* <ul>
* <li>Modify column type for city column as TEXT (not as LABEL, by default, allColumns flag is set to true)</li>
* </ul>
*
* <p>Test dataset: <code>org/dashbuilder/dataprovider/backend/elasticsearch/expensereports-custom-columns2.dset</code></p>
* <ul>
* <li>Defined custom columns: id (NUMBER), employee (TEXT), city (TEXT), amount (NUMBER)</li>
* </ul>
*
* <p>Test dataset: <code>org/dashbuilder/dataprovider/backend/elasticsearch/expensereports-custom-columns-error.dset</code></p>
* <ul>
* <li>Try to override employee column type to label and it's not allowed (as employee field is type analyzed string)</li>
* </ul>
*
* @since 0.3.0
*/
public class ElasticSearchDataSetCustomColumnsTest extends ElasticSearchDataSetTestBase {
protected static final String EL_EXAMPLE_ALL_COLUMNS_DATASET_DEF = "org/dashbuilder/dataprovider/backend/elasticsearch/expensereports-allcolumns.dset";
protected static final String EL_DATASET_ALL_COLUMNS_UUID = "expense_reports_allcolumns";
protected static final String EL_EXAMPLE_CUSTOM_COLUMNS_DATASET_DEF = "org/dashbuilder/dataprovider/backend/elasticsearch/expensereports-custom-columns.dset";
protected static final String EL_DATASET_CUSTOM_COLUMNS_UUID = "expense_reports_custom_columns";
protected static final String EL_EXAMPLE_CUSTOM_COLUMNS2_DATASET_DEF = "org/dashbuilder/dataprovider/backend/elasticsearch/expensereports-custom-columns2.dset";
protected static final String EL_DATASET_CUSTOM_COLUMNS2_UUID = "expense_reports_custom_columns2";
protected static final String EL_EXAMPLE_BAD_COLUMNS_DATASET_DEF = "org/dashbuilder/dataprovider/backend/elasticsearch/expensereports-custom-columns-error.dset";
protected static final String EL_DATASET_BAD_COLUMNS_UUID = "expense_reports_custom_columns_error";
/**
* Register the dataset used for this test case.
*/
@Before
public void registerDataSet() throws Exception {
super.setUp();
// Register the data sets.
_registerDataSet(EL_EXAMPLE_ALL_COLUMNS_DATASET_DEF);
_registerDataSet(EL_EXAMPLE_CUSTOM_COLUMNS_DATASET_DEF);
_registerDataSet(EL_EXAMPLE_CUSTOM_COLUMNS2_DATASET_DEF);
_registerDataSet(EL_EXAMPLE_BAD_COLUMNS_DATASET_DEF);
}
/**
* **********************************************************************************************************************************************************************************************
* COLUMNS TESING.
* **********************************************************************************************************************************************************************************************
*/
/**
* Test retrieving all columns from index mapping (no columns defined in def and allColumns flag is set to true)
*/
@Test
public void testAllColumns() throws Exception {
DataSet result = dataSetManager.lookupDataSet(
DataSetFactory.newDataSetLookupBuilder()
.dataset(EL_DATASET_ALL_COLUMNS_UUID)
.buildLookup());
// Columns size assertion.
Assert.assertNotNull(result.getColumns());
Assert.assertTrue(result.getColumns().size() == 6);
// Columns id & type assertion.
assertColumnIdAndType(result, ExpenseReportsData.COLUMN_AMOUNT, ColumnType.NUMBER);
assertColumnIdAndType(result, ExpenseReportsData.COLUMN_CITY, ColumnType.LABEL);
assertColumnIdAndType(result, ExpenseReportsData.COLUMN_DATE, ColumnType.DATE);
assertColumnIdAndType(result, ExpenseReportsData.COLUMN_DEPARTMENT, ColumnType.LABEL);
assertColumnIdAndType(result, ExpenseReportsData.COLUMN_EMPLOYEE, ColumnType.TEXT);
assertColumnIdAndType(result, ExpenseReportsData.COLUMN_ID, ColumnType.NUMBER);
}
/**
* Test retrieving all columns from index mapping and overriding one (a column is defined in def and allColumns flag is set to true)
*/
@Test
public void testCustomColumns() throws Exception {
DataSet result = dataSetManager.lookupDataSet(
DataSetFactory.newDataSetLookupBuilder()
.dataset(EL_DATASET_CUSTOM_COLUMNS_UUID)
.sort(ExpenseReportsData.COLUMN_ID, SortOrder.ASCENDING)
.buildLookup());
// Columns size assertion.
Assert.assertNotNull(result.getColumns());
Assert.assertTrue(result.getColumns().size() == 6);
// Columns id & type assertion.
assertColumnIdAndType(result, ExpenseReportsData.COLUMN_AMOUNT, ColumnType.NUMBER);
assertColumnIdAndType(result, ExpenseReportsData.COLUMN_CITY, ColumnType.TEXT);
assertColumnIdAndType(result, ExpenseReportsData.COLUMN_DATE, ColumnType.DATE);
assertColumnIdAndType(result, ExpenseReportsData.COLUMN_DEPARTMENT, ColumnType.LABEL);
assertColumnIdAndType(result, ExpenseReportsData.COLUMN_EMPLOYEE, ColumnType.TEXT);
assertColumnIdAndType(result, ExpenseReportsData.COLUMN_ID, ColumnType.NUMBER);
}
/**
* Test using column defined in def (allColumns flag is set to false)
*/
@Test
public void testGivenColumns() throws Exception {
DataSet result = dataSetManager.lookupDataSet(
DataSetFactory.newDataSetLookupBuilder()
.dataset(EL_DATASET_CUSTOM_COLUMNS2_UUID)
.sort(ExpenseReportsData.COLUMN_ID, SortOrder.ASCENDING)
.buildLookup());
// Columns size assertion.
Assert.assertNotNull(result.getColumns());
Assert.assertTrue(result.getColumns().size() == 4);
// Columns id & type assertion.
assertColumnIdAndType(result, ExpenseReportsData.COLUMN_ID, ColumnType.NUMBER);
assertColumnIdAndType(result, ExpenseReportsData.COLUMN_EMPLOYEE, ColumnType.TEXT);
assertColumnIdAndType(result, ExpenseReportsData.COLUMN_CITY, ColumnType.TEXT);
assertColumnIdAndType(result, ExpenseReportsData.COLUMN_AMOUNT, ColumnType.NUMBER);
}
private void assertColumnIdAndType(DataSet result, String columnId, ColumnType columnType) {
DataColumn amountCol = result.getColumnById(columnId);
Assert.assertNotNull(amountCol);
Assert.assertEquals(amountCol.getColumnType(), columnType);
}
/**
* **********************************************************************************************************************************************************************************************
* LOOKUP TESTING.
* **********************************************************************************************************************************************************************************************
*/
@Test(expected = RuntimeException.class)
public void testSortingWithNonExstingColumn() throws Exception {
DataSet result = dataSetManager.lookupDataSet(
DataSetFactory.newDataSetLookupBuilder()
.dataset(EL_DATASET_CUSTOM_COLUMNS_UUID)
.sort("mycolumn", SortOrder.DESCENDING)
.buildLookup());
}
@Test(expected = RuntimeException.class)
public void testSortingWithNonDefinedColumn() throws Exception {
DataSet result = dataSetManager.lookupDataSet(
DataSetFactory.newDataSetLookupBuilder()
.dataset(EL_DATASET_CUSTOM_COLUMNS2_UUID)
.sort(ExpenseReportsData.COLUMN_DEPARTMENT, SortOrder.DESCENDING)
.buildLookup());
}
/**
* Test columns as this dataset defintion contains custom definitions.
* An exception must be thrown due to cannot change employee column type to label, as it's an anaylzed string in the EL index mapping.
*/
@Test(expected = RuntimeException.class)
public void testColumnsBadDefined() throws Exception {
dataSetManager.lookupDataSet(
DataSetFactory.newDataSetLookupBuilder()
.dataset(EL_DATASET_BAD_COLUMNS_UUID)
.sort(ExpenseReportsData.COLUMN_ID, SortOrder.ASCENDING)
.buildLookup());
}
}