/**
*
* Copyright (C) 2013 Vanderbilt University <csaba.toth, b.malin @vanderbilt.edu>
*
* 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.openhie.openempi.matching.fellegisunter;
import java.util.ArrayList;
import java.util.List;
import org.openhie.openempi.Constants;
import org.openhie.openempi.configuration.FunctionField;
import org.openhie.openempi.context.Context;
import org.openhie.openempi.matching.fellegisunter.MatchConfiguration.FieldQuerySelector;
import org.openhie.openempi.service.BaseServiceTestCase;
import org.openhie.openempi.util.PersonUtils;
public class MatchConfigurationTest extends BaseServiceTestCase
{
// All
public void testGetMatchFields_Mixed_WhenCalledWithAllFields_ReturnsAllMatchFields() {
MatchConfiguration matchConfig = createTestMatchConfiguration(FieldQuerySelector.AllFields);
List<MatchField> matchFields = matchConfig.getMatchFields(FieldQuerySelector.AllFields);
assertEquals(6, matchFields.size());
assertEquals(PersonUtils.GIVEN_NAME, matchFields.get(0).getLeftFieldName());
assertEquals(PersonUtils.GIVEN_NAME, matchFields.get(0).getRightFieldName());
assertEquals(PersonUtils.FAMILY_NAME, matchFields.get(1).getLeftFieldName());
assertEquals(PersonUtils.FAMILY_NAME, matchFields.get(1).getRightFieldName());
assertEquals(PersonUtils.CITY_NAME, matchFields.get(2).getLeftFieldName());
assertEquals(PersonUtils.CITY_NAME, matchFields.get(2).getRightFieldName());
assertEquals(PersonUtils.ORIGINAL_ID, matchFields.get(3).getLeftFieldName());
assertEquals(PersonUtils.ORIGINAL_ID, matchFields.get(3).getRightFieldName());
assertEquals(PersonUtils.ADDRESS1_NAME, matchFields.get(4).getLeftFieldName());
assertEquals(PersonUtils.ADDRESS1_NAME, matchFields.get(4).getRightFieldName());
assertEquals(PersonUtils.ADDRESS2_NAME, matchFields.get(5).getLeftFieldName());
assertEquals(PersonUtils.ADDRESS2_NAME, matchFields.get(5).getRightFieldName());
}
public void testGetMatchFields_Mixed_WhenCalledWithMatchOnlyFields_ReturnsOnlyMatchFields() {
MatchConfiguration matchConfig = createTestMatchConfiguration(FieldQuerySelector.AllFields);
List<MatchField> matchFields = matchConfig.getMatchFields(FieldQuerySelector.MatchOnlyFields);
assertEquals(3, matchFields.size());
assertEquals(PersonUtils.GIVEN_NAME, matchFields.get(0).getLeftFieldName());
assertEquals(PersonUtils.GIVEN_NAME, matchFields.get(0).getRightFieldName());
assertEquals(PersonUtils.FAMILY_NAME, matchFields.get(1).getLeftFieldName());
assertEquals(PersonUtils.FAMILY_NAME, matchFields.get(1).getRightFieldName());
assertEquals(PersonUtils.CITY_NAME, matchFields.get(2).getLeftFieldName());
assertEquals(PersonUtils.CITY_NAME, matchFields.get(2).getRightFieldName());
}
public void testGetMatchFields_Mixed_WhenCalledWithNonMatchFields_ReturnsOnlyNonMatchFields() {
MatchConfiguration matchConfig = createTestMatchConfiguration(FieldQuerySelector.AllFields);
List<MatchField> matchFields = matchConfig.getMatchFields(FieldQuerySelector.NoMatchFields);
assertEquals(3, matchFields.size());
assertEquals(PersonUtils.ORIGINAL_ID, matchFields.get(0).getLeftFieldName());
assertEquals(PersonUtils.ORIGINAL_ID, matchFields.get(0).getRightFieldName());
assertEquals(PersonUtils.ADDRESS1_NAME, matchFields.get(1).getLeftFieldName());
assertEquals(PersonUtils.ADDRESS1_NAME, matchFields.get(1).getRightFieldName());
assertEquals(PersonUtils.ADDRESS2_NAME, matchFields.get(2).getLeftFieldName());
assertEquals(PersonUtils.ADDRESS2_NAME, matchFields.get(2).getRightFieldName());
}
public void testGetLeftFieldNames_Mixed_WhenCalledWithNoMatchFields_ReturnsAllFieldNames() {
MatchConfiguration matchConfig = createTestMatchConfiguration(FieldQuerySelector.AllFields);
List<String> fieldNames = matchConfig.getLeftFieldNames(FieldQuerySelector.AllFields);
assertEquals(6, fieldNames.size());
assertEquals(PersonUtils.GIVEN_NAME, fieldNames.get(0));
assertEquals(PersonUtils.FAMILY_NAME, fieldNames.get(1));
assertEquals(PersonUtils.CITY_NAME, fieldNames.get(2));
assertEquals(PersonUtils.ORIGINAL_ID, fieldNames.get(3));
assertEquals(PersonUtils.ADDRESS1_NAME, fieldNames.get(4));
assertEquals(PersonUtils.ADDRESS2_NAME, fieldNames.get(5));
}
public void testGetLeftFieldNames_Mixed_WhenCalledWithMatchOnlyFields_ReturnsOnlyMatchFields() {
MatchConfiguration matchConfig = createTestMatchConfiguration(FieldQuerySelector.AllFields);
List<String> fieldNames = matchConfig.getLeftFieldNames(FieldQuerySelector.MatchOnlyFields);
assertEquals(3, fieldNames.size());
assertEquals(PersonUtils.GIVEN_NAME, fieldNames.get(0));
assertEquals(PersonUtils.FAMILY_NAME, fieldNames.get(1));
assertEquals(PersonUtils.CITY_NAME, fieldNames.get(2));
}
public void testGetLeftFieldNames_Mixed_WhenCalledWithNonMatchFields_ReturnsOnlyNonMatchFields() {
MatchConfiguration matchConfig = createTestMatchConfiguration(FieldQuerySelector.AllFields);
List<String> fieldNames = matchConfig.getLeftFieldNames(FieldQuerySelector.NoMatchFields);
assertEquals(3, fieldNames.size());
assertEquals(PersonUtils.ORIGINAL_ID, fieldNames.get(0));
assertEquals(PersonUtils.ADDRESS1_NAME, fieldNames.get(1));
assertEquals(PersonUtils.ADDRESS2_NAME, fieldNames.get(2));
}
public void testGetRightFieldNames_Mixed_WhenCalledWithNoMatchFields_ReturnsAllFieldNames() {
MatchConfiguration matchConfig = createTestMatchConfiguration(FieldQuerySelector.AllFields);
List<String> fieldNames = matchConfig.getRightFieldNames(FieldQuerySelector.AllFields);
assertEquals(6, fieldNames.size());
assertEquals(PersonUtils.GIVEN_NAME, fieldNames.get(0));
assertEquals(PersonUtils.FAMILY_NAME, fieldNames.get(1));
assertEquals(PersonUtils.CITY_NAME, fieldNames.get(2));
assertEquals(PersonUtils.ORIGINAL_ID, fieldNames.get(3));
assertEquals(PersonUtils.ADDRESS1_NAME, fieldNames.get(4));
assertEquals(PersonUtils.ADDRESS2_NAME, fieldNames.get(5));
}
public void testGetRightFieldNames_Mixed_WhenCalledWithMatchOnlyFields_ReturnsOnlyMatchFields() {
MatchConfiguration matchConfig = createTestMatchConfiguration(FieldQuerySelector.AllFields);
List<String> fieldNames = matchConfig.getRightFieldNames(FieldQuerySelector.MatchOnlyFields);
assertEquals(3, fieldNames.size());
assertEquals(PersonUtils.GIVEN_NAME, fieldNames.get(0));
assertEquals(PersonUtils.FAMILY_NAME, fieldNames.get(1));
assertEquals(PersonUtils.CITY_NAME, fieldNames.get(2));
}
public void testGetRightFieldNames_Mixed_WhenCalledWithNonMatchFields_ReturnsOnlyNonMatchFields() {
MatchConfiguration matchConfig = createTestMatchConfiguration(FieldQuerySelector.AllFields);
List<String> fieldNames = matchConfig.getRightFieldNames(FieldQuerySelector.NoMatchFields);
assertEquals(3, fieldNames.size());
assertEquals(PersonUtils.ORIGINAL_ID, fieldNames.get(0));
assertEquals(PersonUtils.ADDRESS1_NAME, fieldNames.get(1));
assertEquals(PersonUtils.ADDRESS2_NAME, fieldNames.get(2));
}
// Match Only
public void testGetMatchFields_MatchOnly_WhenCalledWithAllFields_ReturnsAllMatchFields() {
MatchConfiguration matchConfig = createTestMatchConfiguration(FieldQuerySelector.MatchOnlyFields);
List<MatchField> matchFields = matchConfig.getMatchFields(FieldQuerySelector.AllFields);
assertEquals(3, matchFields.size());
assertEquals(PersonUtils.GIVEN_NAME, matchFields.get(0).getLeftFieldName());
assertEquals(PersonUtils.GIVEN_NAME, matchFields.get(0).getRightFieldName());
assertEquals(PersonUtils.FAMILY_NAME, matchFields.get(1).getLeftFieldName());
assertEquals(PersonUtils.FAMILY_NAME, matchFields.get(1).getRightFieldName());
assertEquals(PersonUtils.CITY_NAME, matchFields.get(2).getLeftFieldName());
assertEquals(PersonUtils.CITY_NAME, matchFields.get(2).getRightFieldName());
}
public void testGetMatchFields_MatchOnly_WhenCalledWithMatchOnlyFields_ReturnsOnlyMatchFields() {
MatchConfiguration matchConfig = createTestMatchConfiguration(FieldQuerySelector.MatchOnlyFields);
List<MatchField> matchFields = matchConfig.getMatchFields(FieldQuerySelector.MatchOnlyFields);
assertEquals(3, matchFields.size());
assertEquals(PersonUtils.GIVEN_NAME, matchFields.get(0).getLeftFieldName());
assertEquals(PersonUtils.GIVEN_NAME, matchFields.get(0).getRightFieldName());
assertEquals(PersonUtils.FAMILY_NAME, matchFields.get(1).getLeftFieldName());
assertEquals(PersonUtils.FAMILY_NAME, matchFields.get(1).getRightFieldName());
assertEquals(PersonUtils.CITY_NAME, matchFields.get(2).getLeftFieldName());
assertEquals(PersonUtils.CITY_NAME, matchFields.get(2).getRightFieldName());
}
public void testGetMatchFields_MatchOnly_WhenCalledWithNonMatchFields_ReturnsOnlyNonMatchFields() {
MatchConfiguration matchConfig = createTestMatchConfiguration(FieldQuerySelector.MatchOnlyFields);
List<MatchField> matchFields = matchConfig.getMatchFields(FieldQuerySelector.NoMatchFields);
assertEquals(0, matchFields.size());
}
public void testGetLeftFieldNames_MatchOnly_WhenCalledWithNoMatchFields_ReturnsAllFieldNames() {
MatchConfiguration matchConfig = createTestMatchConfiguration(FieldQuerySelector.MatchOnlyFields);
List<String> fieldNames = matchConfig.getLeftFieldNames(FieldQuerySelector.AllFields);
assertEquals(3, fieldNames.size());
assertEquals(PersonUtils.GIVEN_NAME, fieldNames.get(0));
assertEquals(PersonUtils.FAMILY_NAME, fieldNames.get(1));
assertEquals(PersonUtils.CITY_NAME, fieldNames.get(2));
}
public void testGetLeftFieldNames_MatchOnly_WhenCalledWithMatchOnlyFields_ReturnsOnlyMatchFields() {
MatchConfiguration matchConfig = createTestMatchConfiguration(FieldQuerySelector.MatchOnlyFields);
List<String> fieldNames = matchConfig.getLeftFieldNames(FieldQuerySelector.MatchOnlyFields);
assertEquals(3, fieldNames.size());
assertEquals(PersonUtils.GIVEN_NAME, fieldNames.get(0));
assertEquals(PersonUtils.FAMILY_NAME, fieldNames.get(1));
assertEquals(PersonUtils.CITY_NAME, fieldNames.get(2));
}
public void testGetLeftFieldNames_MatchOnly_WhenCalledWithNonMatchFields_ReturnsOnlyNonMatchFields() {
MatchConfiguration matchConfig = createTestMatchConfiguration(FieldQuerySelector.MatchOnlyFields);
List<String> fieldNames = matchConfig.getLeftFieldNames(FieldQuerySelector.NoMatchFields);
assertEquals(0, fieldNames.size());
}
public void testGetRightFieldNames_MatchOnly_WhenCalledWithNoMatchFields_ReturnsAllFieldNames() {
MatchConfiguration matchConfig = createTestMatchConfiguration(FieldQuerySelector.MatchOnlyFields);
List<String> fieldNames = matchConfig.getRightFieldNames(FieldQuerySelector.AllFields);
assertEquals(3, fieldNames.size());
assertEquals(PersonUtils.GIVEN_NAME, fieldNames.get(0));
assertEquals(PersonUtils.FAMILY_NAME, fieldNames.get(1));
assertEquals(PersonUtils.CITY_NAME, fieldNames.get(2));
}
public void testGetRightFieldNames_MatchOnly_WhenCalledWithMatchOnlyFields_ReturnsOnlyMatchFields() {
MatchConfiguration matchConfig = createTestMatchConfiguration(FieldQuerySelector.MatchOnlyFields);
List<String> fieldNames = matchConfig.getRightFieldNames(FieldQuerySelector.MatchOnlyFields);
assertEquals(3, fieldNames.size());
assertEquals(PersonUtils.GIVEN_NAME, fieldNames.get(0));
assertEquals(PersonUtils.FAMILY_NAME, fieldNames.get(1));
assertEquals(PersonUtils.CITY_NAME, fieldNames.get(2));
}
public void testGetRightFieldNames_MatchOnly_WhenCalledWithNonMatchFields_ReturnsOnlyNonMatchFields() {
MatchConfiguration matchConfig = createTestMatchConfiguration(FieldQuerySelector.MatchOnlyFields);
List<String> fieldNames = matchConfig.getRightFieldNames(FieldQuerySelector.NoMatchFields);
assertEquals(0, fieldNames.size());
}
// Non Match Only
public void testGetMatchFields_NonMatchOnly_WhenCalledWithAllFields_ReturnsAllMatchFields() {
MatchConfiguration matchConfig = createTestMatchConfiguration(FieldQuerySelector.NoMatchFields);
List<MatchField> matchFields = matchConfig.getMatchFields(FieldQuerySelector.AllFields);
assertEquals(3, matchFields.size());
assertEquals(PersonUtils.ORIGINAL_ID, matchFields.get(0).getLeftFieldName());
assertEquals(PersonUtils.ORIGINAL_ID, matchFields.get(0).getRightFieldName());
assertEquals(PersonUtils.ADDRESS1_NAME, matchFields.get(1).getLeftFieldName());
assertEquals(PersonUtils.ADDRESS1_NAME, matchFields.get(1).getRightFieldName());
assertEquals(PersonUtils.ADDRESS2_NAME, matchFields.get(2).getLeftFieldName());
assertEquals(PersonUtils.ADDRESS2_NAME, matchFields.get(2).getRightFieldName());
}
public void testGetMatchFields_NonMatchOnly_WhenCalledWithMatchOnlyFields_ReturnsOnlyMatchFields() {
MatchConfiguration matchConfig = createTestMatchConfiguration(FieldQuerySelector.NoMatchFields);
List<MatchField> matchFields = matchConfig.getMatchFields(FieldQuerySelector.MatchOnlyFields);
assertEquals(0, matchFields.size());
}
public void testGetMatchFields_NonMatchOnly_WhenCalledWithNonMatchFields_ReturnsOnlyNonMatchFields() {
MatchConfiguration matchConfig = createTestMatchConfiguration(FieldQuerySelector.NoMatchFields);
List<MatchField> matchFields = matchConfig.getMatchFields(FieldQuerySelector.NoMatchFields);
assertEquals(3, matchFields.size());
assertEquals(PersonUtils.ORIGINAL_ID, matchFields.get(0).getLeftFieldName());
assertEquals(PersonUtils.ORIGINAL_ID, matchFields.get(0).getRightFieldName());
assertEquals(PersonUtils.ADDRESS1_NAME, matchFields.get(1).getLeftFieldName());
assertEquals(PersonUtils.ADDRESS1_NAME, matchFields.get(1).getRightFieldName());
assertEquals(PersonUtils.ADDRESS2_NAME, matchFields.get(2).getLeftFieldName());
assertEquals(PersonUtils.ADDRESS2_NAME, matchFields.get(2).getRightFieldName());
}
public void testGetLeftFieldNames_NonMatchOnly_WhenCalledWithNoMatchFields_ReturnsAllFieldNames() {
MatchConfiguration matchConfig = createTestMatchConfiguration(FieldQuerySelector.NoMatchFields);
List<String> fieldNames = matchConfig.getLeftFieldNames(FieldQuerySelector.AllFields);
assertEquals(3, fieldNames.size());
assertEquals(PersonUtils.ORIGINAL_ID, fieldNames.get(0));
assertEquals(PersonUtils.ADDRESS1_NAME, fieldNames.get(1));
assertEquals(PersonUtils.ADDRESS2_NAME, fieldNames.get(2));
}
public void testGetLeftFieldNames_NonMatchOnly_WhenCalledWithMatchOnlyFields_ReturnsOnlyMatchFields() {
MatchConfiguration matchConfig = createTestMatchConfiguration(FieldQuerySelector.NoMatchFields);
List<String> fieldNames = matchConfig.getLeftFieldNames(FieldQuerySelector.MatchOnlyFields);
assertEquals(0, fieldNames.size());
}
public void testGetLeftFieldNames_NonMatchOnly_WhenCalledWithNonMatchFields_ReturnsOnlyNonMatchFields() {
MatchConfiguration matchConfig = createTestMatchConfiguration(FieldQuerySelector.NoMatchFields);
List<String> fieldNames = matchConfig.getLeftFieldNames(FieldQuerySelector.NoMatchFields);
assertEquals(3, fieldNames.size());
assertEquals(PersonUtils.ORIGINAL_ID, fieldNames.get(0));
assertEquals(PersonUtils.ADDRESS1_NAME, fieldNames.get(1));
assertEquals(PersonUtils.ADDRESS2_NAME, fieldNames.get(2));
}
public void testGetRightFieldNames_NonMatchOnly_WhenCalledWithNoMatchFields_ReturnsAllFieldNames() {
MatchConfiguration matchConfig = createTestMatchConfiguration(FieldQuerySelector.NoMatchFields);
List<String> fieldNames = matchConfig.getRightFieldNames(FieldQuerySelector.AllFields);
assertEquals(3, fieldNames.size());
assertEquals(PersonUtils.ORIGINAL_ID, fieldNames.get(0));
assertEquals(PersonUtils.ADDRESS1_NAME, fieldNames.get(1));
assertEquals(PersonUtils.ADDRESS2_NAME, fieldNames.get(2));
}
public void testGetRightFieldNames_NonMatchOnly_WhenCalledWithMatchOnlyFields_ReturnsOnlyMatchFields() {
MatchConfiguration matchConfig = createTestMatchConfiguration(FieldQuerySelector.NoMatchFields);
List<String> fieldNames = matchConfig.getRightFieldNames(FieldQuerySelector.MatchOnlyFields);
assertEquals(0, fieldNames.size());
}
public void testGetRightFieldNames_NonMatchOnly_WhenCalledWithNonMatchFields_ReturnsOnlyNonMatchFields() {
MatchConfiguration matchConfig = createTestMatchConfiguration(FieldQuerySelector.NoMatchFields);
List<String> fieldNames = matchConfig.getRightFieldNames(FieldQuerySelector.NoMatchFields);
assertEquals(3, fieldNames.size());
assertEquals(PersonUtils.ORIGINAL_ID, fieldNames.get(0));
assertEquals(PersonUtils.ADDRESS1_NAME, fieldNames.get(1));
assertEquals(PersonUtils.ADDRESS2_NAME, fieldNames.get(2));
}
private MatchConfiguration createTestMatchConfiguration(FieldQuerySelector fieldQuerySelector) {
// Assemble a MatchConfiguration with 3 match and 3 non-match fields for test purposes
MatchConfiguration matchConfigurationBackup =
(MatchConfiguration)Context.getConfiguration().lookupConfigurationEntry(ProbabilisticMatchingConstants.PROBABILISTIC_MATCHING_CONFIGURATION_REGISTRY_KEY);
MatchField firstOriginalMatchField = matchConfigurationBackup.getMatchFields(FieldQuerySelector.MatchOnlyFields).get(0);
MatchConfiguration matchConfig = new MatchConfiguration();
// Right now we inherit the values from Parameter Manager's config
List<MatchField> matchFields = new ArrayList<MatchField>();
if (fieldQuerySelector == FieldQuerySelector.AllFields || fieldQuerySelector == FieldQuerySelector.MatchOnlyFields)
matchFields.add(createMatchField(PersonUtils.GIVEN_NAME, PersonUtils.GIVEN_NAME, firstOriginalMatchField, false));
if (fieldQuerySelector == FieldQuerySelector.AllFields || fieldQuerySelector == FieldQuerySelector.NoMatchFields)
matchFields.add(createMatchField(PersonUtils.ORIGINAL_ID, PersonUtils.ORIGINAL_ID, firstOriginalMatchField, true));
if (fieldQuerySelector == FieldQuerySelector.AllFields || fieldQuerySelector == FieldQuerySelector.MatchOnlyFields)
matchFields.add(createMatchField(PersonUtils.FAMILY_NAME, PersonUtils.FAMILY_NAME, firstOriginalMatchField, false));
if (fieldQuerySelector == FieldQuerySelector.AllFields || fieldQuerySelector == FieldQuerySelector.NoMatchFields)
matchFields.add(createMatchField(PersonUtils.ADDRESS1_NAME, PersonUtils.ADDRESS1_NAME, firstOriginalMatchField, true));
if (fieldQuerySelector == FieldQuerySelector.AllFields || fieldQuerySelector == FieldQuerySelector.MatchOnlyFields)
matchFields.add(createMatchField(PersonUtils.CITY_NAME, PersonUtils.CITY_NAME, firstOriginalMatchField, false));
if (fieldQuerySelector == FieldQuerySelector.AllFields || fieldQuerySelector == FieldQuerySelector.NoMatchFields)
matchFields.add(createMatchField(PersonUtils.ADDRESS2_NAME, PersonUtils.ADDRESS2_NAME, firstOriginalMatchField, true));
matchConfig.setMatchFields(matchFields);
return matchConfig;
}
private MatchField createMatchField(String leftFieldName, String rightFieldName, MatchField matchFieldReference, boolean noMatchField) {
MatchField mf = new MatchField();
mf.setLeftFieldName(leftFieldName);
mf.setRightFieldName(rightFieldName);
// Right now we inherit the values from Parameter Manager's config
mf.setAgreementProbability(matchFieldReference.getAgreementProbability());
mf.setDisagreementProbability(matchFieldReference.getDisagreementProbability());
mf.setMatchThreshold(matchFieldReference.getMatchThreshold());
// How to decide which comparator function?
FunctionField functionField = new FunctionField(noMatchField ? Constants.NO_COMPARISON_JUST_TRANSFER_FUNCTION_NAME : "JaroWinkler");
mf.setComparatorFunction(functionField);
return mf;
}
}