/*
* Copyright 2015 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.
*
* 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.dataset;
import java.util.Arrays;
import java.util.List;
import org.dashbuilder.dataset.group.AggregateFunctionType;
import org.dashbuilder.dataset.group.ColumnGroup;
import org.dashbuilder.dataset.group.DataSetGroup;
import org.dashbuilder.dataset.group.DateIntervalType;
import org.dashbuilder.dataset.group.GroupFunction;
import org.dashbuilder.dataset.group.GroupStrategy;
import org.dashbuilder.dataset.impl.DataSetMetadataImpl;
import org.junit.Test;
import static org.dashbuilder.dataset.ColumnType.*;
import static org.junit.Assert.*;
public class DataSetLookupConstraintsTest {
public static final String OFFICE = "office";
public static final String DEPARTMENT = "department";
public static final String EMPLOYEE = "employee";
public static final String AMOUNT = "amount";
public static final String DATE = "date";
public static final DataSetMetadata METADATA = new DataSetMetadataImpl(null, "test", 100, 5,
Arrays.asList(OFFICE, DEPARTMENT, EMPLOYEE, AMOUNT, DATE),
Arrays.asList(LABEL, LABEL, LABEL, NUMBER, ColumnType.DATE), 0);
public static final DataSetLookupConstraints TWO_COLUMNS_GROUPED = new DataSetLookupConstraints()
.setGroupRequired(true)
.setGroupColumn(true)
.setMaxColumns(2)
.setMinColumns(2)
.setExtraColumnsAllowed(false)
.setGroupsTitle("Categories")
.setColumnsTitle("Values")
.setColumnTypes(new ColumnType[]{
LABEL,
NUMBER});
public static final DataSetLookupConstraints MULTIPLE_COLUMNS = new DataSetLookupConstraints()
.setGroupAllowed(true)
.setGroupRequired(false)
.setMaxColumns(-1)
.setMinColumns(1)
.setExtraColumnsAllowed(true)
.setGroupsTitle("Rows")
.setColumnsTitle("Columns");
@Test
public void testTwoColumns() {
DataSetLookup lookup = TWO_COLUMNS_GROUPED.newDataSetLookup(METADATA);
assertEquals(lookup.getDataSetUUID(), "test");
List<DataSetOp> opList = lookup.getOperationList();
assertEquals(opList.size(), 1);
List<DataSetGroup> groupList = lookup.getOperationList(DataSetGroup.class);
assertEquals(groupList.size(), 1);
DataSetGroup groupOp = groupList.get(0);
assertNotNull(groupOp);
assertEquals(groupOp.getGroupFunctions().size(), 2);
ColumnGroup cg = groupOp.getColumnGroup();
assertNotNull(groupOp);
assertEquals(cg.getSourceId(), OFFICE);
assertEquals(cg.getColumnId(), OFFICE);
assertEquals(cg.getStrategy(), GroupStrategy.DYNAMIC);
GroupFunction gf1 = groupOp.getGroupFunction(OFFICE);
assertNotNull(gf1);
assertNull(gf1.getFunction());
assertEquals(gf1.getSourceId(), OFFICE);
assertEquals(gf1.getColumnId(), OFFICE);
GroupFunction gf2 = groupOp.getGroupFunction(AMOUNT);
assertNotNull(gf2);
assertNotNull(gf2.getFunction());
assertEquals(gf2.getSourceId(), AMOUNT);
assertEquals(gf2.getColumnId(), AMOUNT);
}
@Test
public void testMultipleColumns() {
DataSetLookup lookup = MULTIPLE_COLUMNS.newDataSetLookup(METADATA);
assertEquals(lookup.getDataSetUUID(), "test");
List<DataSetOp> opList = lookup.getOperationList();
assertEquals(opList.size(), 1);
List<DataSetGroup> groupList = lookup.getOperationList(DataSetGroup.class);
assertEquals(groupList.size(), 1);
DataSetGroup groupOp = groupList.get(0);
assertNotNull(groupOp);
ColumnGroup cg = groupOp.getColumnGroup();
assertNull(cg);
assertEquals(groupOp.getGroupFunctions().size(), METADATA.getNumberOfColumns());
for (int i = 0; i < METADATA.getNumberOfColumns(); i++) {
GroupFunction gf = groupOp.getGroupFunction(METADATA.getColumnId(i));
assertNotNull(gf);
assertEquals(gf.getSourceId(), METADATA.getColumnId(i));
assertEquals(gf.getColumnId(), METADATA.getColumnId(i));
assertNull(gf.getFunction());
}
}
@Test
public void testValidationOk() {
DataSetLookup lookup = DataSetFactory.newDataSetLookupBuilder()
.group(DATE).fixed(DateIntervalType.MONTH, true)
.column(DATE)
.column(AMOUNT, AggregateFunctionType.SUM)
.buildLookup();
ValidationError error = TWO_COLUMNS_GROUPED.check(lookup, METADATA);
assertNull(error);
}
@Test
public void testColumnExcess() {
DataSetLookup lookup = DataSetFactory.newDataSetLookupBuilder()
.group(DATE).fixed(DateIntervalType.MONTH, true)
.column(DATE)
.column(AMOUNT, AggregateFunctionType.SUM)
.column(AMOUNT, AggregateFunctionType.AVERAGE)
.buildLookup();
ValidationError error = TWO_COLUMNS_GROUPED.check(lookup, METADATA);
assertNotNull(error);
assertEquals(error.getCode(), DataSetLookupConstraints.ERROR_COLUMN_NUMBER);
}
@Test
public void testColumnMissing() {
DataSetLookup lookup = DataSetFactory.newDataSetLookupBuilder()
.group(DEPARTMENT)
.column(AMOUNT, AggregateFunctionType.SUM)
.buildLookup();
ValidationError error = TWO_COLUMNS_GROUPED.check(lookup, METADATA);
assertNotNull(error);
assertEquals(error.getCode(), DataSetLookupConstraints.ERROR_COLUMN_NUMBER);
}
@Test
public void testMissingGroup() {
DataSetLookup lookup = DataSetFactory.newDataSetLookupBuilder()
.column(DATE)
.column(AMOUNT, AggregateFunctionType.SUM)
.buildLookup();
ValidationError error = TWO_COLUMNS_GROUPED.check(lookup, METADATA);
assertNotNull(error);
assertEquals(error.getCode(), DataSetLookupConstraints.ERROR_GROUP_REQUIRED);
}
@Test
public void testWrongColumnType() {
DataSetLookup lookup = DataSetFactory.newDataSetLookupBuilder()
.group(DEPARTMENT)
.column(DEPARTMENT)
.column(EMPLOYEE)
.buildLookup();
ValidationError error = TWO_COLUMNS_GROUPED.check(lookup, METADATA);
assertNotNull(error);
assertEquals(error.getCode(), DataSetLookupConstraints.ERROR_COLUMN_TYPE);
lookup = DataSetFactory.newDataSetLookupBuilder()
.group(DATE)
.column(DATE)
.column(EMPLOYEE)
.buildLookup();
error = TWO_COLUMNS_GROUPED.check(lookup, METADATA);
assertNotNull(error);
assertEquals(error.getCode(), DataSetLookupConstraints.ERROR_COLUMN_TYPE);
}
@Test
public void testUniqueColumns() {
DataSetLookupConstraints UNIQUE_COLUMNS = new DataSetLookupConstraints()
.setUniqueColumnIds(true);
DataSetLookup lookup = DataSetFactory.newDataSetLookupBuilder()
.group(DEPARTMENT)
.column(DEPARTMENT, "dept")
.column(AMOUNT, AggregateFunctionType.AVERAGE, "amount")
.column(AMOUNT, AggregateFunctionType.SUM, "amount")
.buildLookup();
ValidationError error = UNIQUE_COLUMNS.check(lookup, METADATA);
assertNotNull(error);
assertEquals(error.getCode(), DataSetLookupConstraints.ERROR_DUPLICATED_COLUMN_ID);
UNIQUE_COLUMNS.setUniqueColumnIds(false);
error = UNIQUE_COLUMNS.check(lookup, METADATA);
assertNull(error);
}
}