/* * Copyright (C) 2015 Information Retrieval Group at Universidad Autónoma * de Madrid, http://ir.ii.uam.es * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ package es.uam.eps.ir.ranksys.fast.preference; import es.uam.eps.ir.ranksys.core.preference.IdPref; import es.uam.eps.ir.ranksys.fast.index.FastItemIndex; import es.uam.eps.ir.ranksys.fast.index.FastUserIndex; import java.io.Serializable; import java.util.function.Function; import java.util.stream.Stream; /** * Abstract FastFeatureData, implementing the interfaces of FastUserIndex and FastItemIndex by delegating to implementations of these. * * @author Saúl Vargas (saul.vargas@uam.es) * * @param <U> type of the users * @param <I> type of the items */ public abstract class AbstractFastPreferenceData<U, I> implements FastPreferenceData<U, I>, Serializable { /** * user index. */ protected final FastUserIndex<U> ui; /** * item index. */ protected final FastItemIndex<I> ii; /** * Converter from IdxPref to IdPref (preference for item). */ protected final Function<IdxPref, IdPref<I>> uPrefFun; /** * Converter from IdxPref to IdPref (preference from user). */ protected final Function<IdxPref, IdPref<U>> iPrefFun; /** * Constructor. * * @param users user index * @param items item index */ public AbstractFastPreferenceData(FastUserIndex<U> users, FastItemIndex<I> items) { this(users, items, (Function<IdxPref, IdPref<I>> & Serializable) p -> new IdPref<>(items.iidx2item(p)), (Function<IdxPref, IdPref<U>> & Serializable) p -> new IdPref<>(users.uidx2user(p))); } /** * Constructor. * * @param userIndex user index * @param itemIndex item index * @param uPrefFun converter from IdxPref to IdPref (preference for item). * @param iPrefFun converter from IdxPref to IdPref (preference from user). */ public AbstractFastPreferenceData(FastUserIndex<U> userIndex, FastItemIndex<I> itemIndex, Function<IdxPref, IdPref<I>> uPrefFun, Function<IdxPref, IdPref<U>> iPrefFun) { this.ui = userIndex; this.ii = itemIndex; this.uPrefFun = uPrefFun; this.iPrefFun = iPrefFun; } @Override public int user2uidx(U u) { return ui.user2uidx(u); } @Override public U uidx2user(int i) { return ui.uidx2user(i); } @Override public boolean containsUser(U u) { return ui.containsUser(u); } @Override public int numUsers() { return ui.numUsers(); } @Override public Stream<U> getAllUsers() { return ui.getAllUsers(); } @Override public int item2iidx(I i) { return ii.item2iidx(i); } @Override public I iidx2item(int i) { return ii.iidx2item(i); } @Override public boolean containsItem(I i) { return ii.containsItem(i); } @Override public int numItems() { return ii.numItems(); } @Override public Stream<I> getAllItems() { return ii.getAllItems(); } @Override public int numUsers(I i) { return numUsers(item2iidx(i)); } @Override public int numItems(U u) { return numItems(user2uidx(u)); } @Override public Stream<? extends IdPref<I>> getUserPreferences(final U u) { return getUidxPreferences(user2uidx(u)).map(uPrefFun); } @Override public Stream<? extends IdPref<U>> getItemPreferences(final I i) { return getIidxPreferences(item2iidx(i)).map(iPrefFun); } @Override public Stream<U> getUsersWithPreferences() { return getUidxWithPreferences().mapToObj(this::uidx2user); } @Override public Stream<I> getItemsWithPreferences() { return getIidxWithPreferences().mapToObj(this::iidx2item); } @Override public int numUsersWithPreferences() { return (int) getUidxWithPreferences().count(); } @Override public int numItemsWithPreferences() { return (int) getIidxWithPreferences().count(); } }