/* * Copyright 2011 Research Studios Austria Forschungsgesellschaft mBH * * This file is part of easyrec. * * easyrec is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * easyrec is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with easyrec. If not, see <http://www.gnu.org/licenses/>. */ package org.easyrec.mahout; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.mahout.cf.taste.common.TasteException; import org.apache.mahout.cf.taste.impl.common.FastIDSet; import org.apache.mahout.cf.taste.impl.common.LongPrimitiveIterator; import org.apache.mahout.cf.taste.model.DataModel; import org.apache.mahout.cf.taste.model.PreferenceArray; import org.easyrec.mahout.model.EasyrecDataModel; import org.easyrec.mahout.model.EasyrecInMemoryDataModel; import org.easyrec.mahout.store.MahoutDataModelMappingDAO; import org.junit.Test; import org.junit.runner.RunWith; import org.unitils.UnitilsJUnit4TestClassRunner; import org.unitils.dbunit.annotation.DataSet; import org.unitils.spring.annotation.SpringApplicationContext; import org.unitils.spring.annotation.SpringBeanByName; import static org.junit.Assert.assertEquals; /** * Unit test for simple App. */ @RunWith(UnitilsJUnit4TestClassRunner.class) @SpringApplicationContext({ "spring/easyrecDataSource.xml", "spring/easyrec-easyrecDataModel-test.xml"}) @DataSet("/dbunit/easyrecDataModelTest.xml") public class EasyrecInMemoryDataModelTest { @SpringBeanByName protected MahoutDataModelMappingDAO mahoutDataModelMappingDAO; private static int TENANT_ID = 1; private static int RATE_ACTION_TYPE_ID = 2; private static int BUY_ACTION_TYPE_ID = 3; private static boolean HAS_RATING_VALUES = true; private static boolean HAS_NO_RATING_VALUES = false; private final Log logger = LogFactory.getLog(this.getClass()); @Test public void testEasyrecDataModel_getItemIDs() throws TasteException { DataModel easyrecDataModel = new EasyrecDataModel(TENANT_ID, RATE_ACTION_TYPE_ID, HAS_RATING_VALUES, mahoutDataModelMappingDAO); easyrecDataModel = new EasyrecInMemoryDataModel(easyrecDataModel); LongPrimitiveIterator itemIds = easyrecDataModel.getItemIDs(); String ids = ""; while (itemIds.hasNext()) { ids += itemIds.next(); } assertEquals("123", ids); //Test peek function of the iterator itemIds = easyrecDataModel.getItemIDs(); ids = ""; ids += itemIds.peek(); while (itemIds.hasNext()) { ids += itemIds.peek() + "-" + itemIds.next(); if (itemIds.hasNext()) { ids += "-" + itemIds.peek() + "-" + itemIds.peek() + "#"; } else { ids += "#"; } } assertEquals("11-1-2-2#2-2-3-3#3-3#", ids); } @Test public void testEasyrecDataModel_getUserIDs() throws TasteException { DataModel easyrecDataModel = new EasyrecDataModel(TENANT_ID, RATE_ACTION_TYPE_ID, HAS_RATING_VALUES, mahoutDataModelMappingDAO); easyrecDataModel = new EasyrecInMemoryDataModel(easyrecDataModel); LongPrimitiveIterator userIds = easyrecDataModel.getUserIDs(); String ids = ""; while (userIds.hasNext()) { ids += userIds.next(); } assertEquals("12", ids); } @Test public void testEasyrecDataModel_getItemIDsFromUser() throws TasteException { DataModel easyrecDataModel = new EasyrecDataModel(TENANT_ID, RATE_ACTION_TYPE_ID, HAS_RATING_VALUES, mahoutDataModelMappingDAO); easyrecDataModel = new EasyrecInMemoryDataModel(easyrecDataModel); FastIDSet itemIds = easyrecDataModel.getItemIDsFromUser(1); long[] itemIdsArray = itemIds.toArray(); String ids = ""; for (long itemId : itemIdsArray) { ids += itemId; } assertEquals("123", ids); } @Test public void testEasyrecDataModel_getMinPreference() throws TasteException { DataModel easyrecDataModel = new EasyrecDataModel(TENANT_ID, RATE_ACTION_TYPE_ID, HAS_RATING_VALUES, mahoutDataModelMappingDAO); easyrecDataModel = new EasyrecInMemoryDataModel(easyrecDataModel); Float minPreference = easyrecDataModel.getMinPreference(); assertEquals(new Float(0), minPreference); } @Test public void testEasyrecDataModel_getMaxPreference() throws TasteException { DataModel easyrecDataModel = new EasyrecDataModel(TENANT_ID, RATE_ACTION_TYPE_ID, HAS_RATING_VALUES, mahoutDataModelMappingDAO); easyrecDataModel = new EasyrecInMemoryDataModel(easyrecDataModel); Float maxPreference = easyrecDataModel.getMaxPreference(); assertEquals(new Float(10), maxPreference); } @Test public void testEasyrecDataModel_getNumUsers() throws TasteException { DataModel easyrecDataModel = new EasyrecDataModel(TENANT_ID, RATE_ACTION_TYPE_ID, HAS_RATING_VALUES, mahoutDataModelMappingDAO); easyrecDataModel = new EasyrecInMemoryDataModel(easyrecDataModel); int numberOfUsers = easyrecDataModel.getNumUsers(); assertEquals(2, numberOfUsers); } @Test public void testEasyrecDataModel_getNumItems() throws TasteException { DataModel easyrecDataModel = new EasyrecDataModel(TENANT_ID, RATE_ACTION_TYPE_ID, HAS_RATING_VALUES, mahoutDataModelMappingDAO); easyrecDataModel = new EasyrecInMemoryDataModel(easyrecDataModel); int numberOfItems = easyrecDataModel.getNumItems(); assertEquals(3, numberOfItems); } @Test public void testEasyrecDataModel_getNumUsersWithPreferenceFor() throws TasteException { DataModel easyrecDataModel = new EasyrecDataModel(TENANT_ID, RATE_ACTION_TYPE_ID, HAS_RATING_VALUES, mahoutDataModelMappingDAO); easyrecDataModel = new EasyrecInMemoryDataModel(easyrecDataModel); int numberUsersWithPreference = easyrecDataModel.getNumUsersWithPreferenceFor(1); assertEquals(2, numberUsersWithPreference); } @Test public void testEasyrecDataModel_getNumUsersWithPreferenceForDual() throws TasteException { DataModel easyrecDataModel = new EasyrecDataModel(TENANT_ID, RATE_ACTION_TYPE_ID, HAS_RATING_VALUES, mahoutDataModelMappingDAO); easyrecDataModel = new EasyrecInMemoryDataModel(easyrecDataModel); int numberUsersWithPreference = easyrecDataModel.getNumUsersWithPreferenceFor(1, 2); assertEquals(2, numberUsersWithPreference); } @Test public void testEasyrecDataModel_getPreferencesForItem() throws TasteException { DataModel easyrecDataModel = new EasyrecDataModel(TENANT_ID, RATE_ACTION_TYPE_ID, HAS_RATING_VALUES, mahoutDataModelMappingDAO); easyrecDataModel = new EasyrecInMemoryDataModel(easyrecDataModel); PreferenceArray preferences = easyrecDataModel.getPreferencesForItem(1); String ids = ""; for (long id : preferences.getIDs()) { ids += id; } assertEquals("12", ids); } @Test public void testEasyrecDataModel_getPreferencesFromUser() throws TasteException { DataModel easyrecDataModel = new EasyrecDataModel(TENANT_ID, RATE_ACTION_TYPE_ID, HAS_RATING_VALUES, mahoutDataModelMappingDAO); easyrecDataModel = new EasyrecInMemoryDataModel(easyrecDataModel); PreferenceArray preferences = easyrecDataModel.getPreferencesFromUser(1); String ids = ""; for (long id : preferences.getIDs()) { ids += id; } assertEquals("123", ids); } @Test public void testEasyrecDataModel_getPreferenceTime() throws TasteException { DataModel easyrecDataModel = new EasyrecDataModel(TENANT_ID, RATE_ACTION_TYPE_ID, HAS_RATING_VALUES, mahoutDataModelMappingDAO); easyrecDataModel = new EasyrecInMemoryDataModel(easyrecDataModel); Long preferenceTime = easyrecDataModel.getPreferenceTime(1, 2); assertEquals(new Long(1176631920000L), preferenceTime); } @Test public void testEasyrecDataModel_getPreferenceValue() throws TasteException { DataModel easyrecDataModel = new EasyrecDataModel(TENANT_ID, RATE_ACTION_TYPE_ID, HAS_RATING_VALUES, mahoutDataModelMappingDAO); easyrecDataModel = new EasyrecInMemoryDataModel(easyrecDataModel); Float preferenceValue = easyrecDataModel.getPreferenceValue(1, 2); assertEquals(new Float(5), preferenceValue); } @Test public void testEasyrecDataModel_hasPreferenceValues() throws TasteException { DataModel easyrecDataModel = new EasyrecDataModel(TENANT_ID, RATE_ACTION_TYPE_ID, HAS_RATING_VALUES, mahoutDataModelMappingDAO); easyrecDataModel = new EasyrecInMemoryDataModel(easyrecDataModel); boolean hasPreferenceValues = easyrecDataModel.hasPreferenceValues(); assertEquals(true, hasPreferenceValues); } @Test public void testEasyrecDataModel_getBooleanPreferencesForItem() throws TasteException { DataModel easyrecDataModel = new EasyrecDataModel(TENANT_ID, BUY_ACTION_TYPE_ID, HAS_NO_RATING_VALUES, mahoutDataModelMappingDAO); easyrecDataModel = new EasyrecInMemoryDataModel(easyrecDataModel); PreferenceArray preferences = easyrecDataModel.getPreferencesForItem(10); String ids = ""; for (long id : preferences.getIDs()) { ids += id; } assertEquals("12", ids); } @Test public void testEasyrecDataModel_getBooleanPreferencesFromUser() throws TasteException { DataModel easyrecDataModel = new EasyrecDataModel(TENANT_ID, BUY_ACTION_TYPE_ID, HAS_NO_RATING_VALUES, mahoutDataModelMappingDAO); easyrecDataModel = new EasyrecInMemoryDataModel(easyrecDataModel); PreferenceArray preferences = easyrecDataModel.getPreferencesFromUser(1); String ids = ""; for (long id : preferences.getIDs()) { ids += id; } assertEquals("102030", ids); } @Test public void testEasyrecDataModel_getBooleanPreferenceValue() throws TasteException { DataModel easyrecDataModel = new EasyrecDataModel(TENANT_ID, BUY_ACTION_TYPE_ID, HAS_NO_RATING_VALUES, mahoutDataModelMappingDAO); easyrecDataModel = new EasyrecInMemoryDataModel(easyrecDataModel); Float preferenceValue = easyrecDataModel.getPreferenceValue(1, 20); assertEquals(new Float(1), preferenceValue); } }