/**
* Copyright 2012 Anjuke Inc.
*
* 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 com.anjuke.romar.mahout;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
import org.apache.mahout.cf.taste.common.Refreshable;
import org.apache.mahout.cf.taste.common.TasteException;
import org.apache.mahout.cf.taste.impl.common.FastByIDMap;
import org.apache.mahout.cf.taste.impl.common.FastIDSet;
import org.apache.mahout.cf.taste.impl.common.LongPrimitiveIterator;
import org.apache.mahout.cf.taste.impl.model.GenericDataModel;
import org.apache.mahout.cf.taste.model.Preference;
import org.apache.mahout.cf.taste.model.PreferenceArray;
import com.anjuke.romar.mahout.util.Util;
public class GenericReloadDataModel implements PreferenceDataModel {
private static final long serialVersionUID = -4393051837705770391L;
private volatile GenericDataModel _currentModel;
private final List<PreferenceValue> _data;
private static class PreferenceValue implements Preference {
public PreferenceValue(long userID, long itemID) {
super();
_add = false;
_userID = userID;
_itemID = itemID;
}
public PreferenceValue(long userID, long itemID, float value) {
super();
_add = true;
_userID = userID;
_itemID = itemID;
_value = value;
}
private boolean _add;
private long _userID;
private long _itemID;
private float _value;
public boolean isAdd() {
return _add;
}
public void setAdd(boolean add) {
_add = add;
}
public long getUserID() {
return _userID;
}
public void setUserID(long userID) {
_userID = userID;
}
public long getItemID() {
return _itemID;
}
public void setItemID(long itemID) {
_itemID = itemID;
}
public float getValue() {
return _value;
}
public void setValue(float value) {
_value = value;
}
}
public GenericReloadDataModel() {
super();
_currentModel = new GenericDataModel(new FastByIDMap<PreferenceArray>());
_data = new LinkedList<PreferenceValue>();
}
/**
* until refresh called , these data will not be used
*/
@Override
public synchronized void setPreference(long userID, long itemID, float preferenceValue)
throws TasteException {
_data.add(new PreferenceValue(userID, itemID, preferenceValue));
}
/** See the warning at {@link #setPreference(long, long, float)}. */
@Override
public synchronized void removePreference(long userID, long itemID) throws TasteException {
_data.add(new PreferenceValue(userID, itemID));
}
@Override
public synchronized void refresh(Collection<Refreshable> alreadyRefreshed) {
FastByIDMap<PreferenceArray> data = _currentModel.getRawUserData().clone();
for (PreferenceValue value : _data) {
if (value.isAdd()) {
Util.applyAdd(data, value);
} else {
Util.applyRemove(data, value);
}
}
_currentModel = new GenericDataModel(data);
}
@Override
public FastByIDMap<PreferenceArray> getRawUserData() {
return _currentModel.getRawUserData();
}
@Override
public FastByIDMap<PreferenceArray> getRawItemData() {
return _currentModel.getRawItemData();
}
@Override
public PreferenceArray getPreferencesFromUser(long userID) throws TasteException {
return _currentModel.getPreferencesFromUser(userID);
}
@Override
public FastIDSet getItemIDsFromUser(long userID) throws TasteException {
return _currentModel.getItemIDsFromUser(userID);
}
@Override
public LongPrimitiveIterator getItemIDs() throws TasteException {
return _currentModel.getItemIDs();
}
@Override
public PreferenceArray getPreferencesForItem(long itemID) throws TasteException {
return _currentModel.getPreferencesForItem(itemID);
}
@Override
public Float getPreferenceValue(long userID, long itemID) throws TasteException {
return _currentModel.getPreferenceValue(userID, itemID);
}
@Override
public Long getPreferenceTime(long userID, long itemID) throws TasteException {
return _currentModel.getPreferenceTime(userID, itemID);
}
@Override
public int getNumItems() throws TasteException {
return _currentModel.getNumItems();
}
@Override
public int getNumUsers() throws TasteException {
return _currentModel.getNumUsers();
}
@Override
public int getNumUsersWithPreferenceFor(long itemID) throws TasteException {
return _currentModel.getNumUsersWithPreferenceFor(itemID);
}
@Override
public int getNumUsersWithPreferenceFor(long itemID1, long itemID2)
throws TasteException {
return _currentModel.getNumUsersWithPreferenceFor(itemID1, itemID2);
}
@Override
public boolean hasPreferenceValues() {
return _currentModel.hasPreferenceValues();
}
@Override
public float getMaxPreference() {
return _currentModel.getMaxPreference();
}
@Override
public float getMinPreference() {
return _currentModel.getMinPreference();
}
@Override
public LongPrimitiveIterator getUserIDs() throws TasteException {
return _currentModel.getUserIDs();
}
@Override
public void reload(FastByIDMap<PreferenceArray> data) {
_currentModel = new GenericDataModel(data);
}
@Override
public void compact() {
throw new UnsupportedOperationException("operation not support");
}
}