/* * Seldon -- open source prediction engine * ======================================= * * Copyright 2011-2015 Seldon Technologies Ltd and Rummble Ltd (http://www.seldon.io/) * * ******************************************************************************************** * * 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 io.seldon.recommendation.explanation; import java.util.ArrayList; import java.util.Collection; import java.util.List; import javax.jdo.PersistenceManager; import javax.jdo.Query; import org.apache.log4j.Logger; import io.seldon.api.APIException; import io.seldon.db.jdo.JDOFactory; public class SqlExplanationProvider implements ExplanationProvider { private static Logger logger = Logger.getLogger(SqlExplanationProvider.class.getName()); final private String clientName; private PersistenceManager pm; public SqlExplanationProvider(String clientName) { this.clientName = clientName; this.pm = null; } public PersistenceManager getPM() { if (pm == null) { pm = JDOFactory.get().getPersistenceManager(clientName); if (pm == null) { throw new APIException(APIException.INTERNAL_DB_ERROR); } } return pm; } @Override public String getExplanation(String recommender, String locale) { logger.debug(String.format("Gettting explanation from db for recommender[%s] locale[%s]", recommender, locale)); String retVal = null; { String sql = "select re1.explanation as default_explanation,re2.explanation as explanation from recommendation_explanation re1 LEFT join recommendation_explanation re2 on re1.locale=re2.locale and re2.recommender=? where re1.locale=? and re1.recommender ='_DEFAULT_'"; Query query = getPM().newQuery("javax.jdo.query.SQL", sql); List<Object> args = new ArrayList<>(); args.add(recommender); args.add(locale); Collection<Object[]> results = (Collection<Object[]>) query.executeWithArray(args.toArray()); if (results.size() != 1) { // Will return null logger.debug(String.format("Failed explanation from db for recommender[%s] locale[%s]", recommender, locale)); } else { for (Object[] r : results) { // we just want the first item (there should be only 1) String default_explanation = (String) r[0]; String explanation = (String) r[1]; if (explanation != null) { retVal = explanation; logger.debug(String.format("Retrieved explanation from db for recommender[%s] locale[%s] as[%s]", recommender, locale, retVal)); } else { retVal = default_explanation; logger.debug(String.format("Retrieved default_explanation from db for recommender[%s] locale[%s] as[%s]", recommender, locale, retVal)); } break; } } } return retVal; } public void setPersistenceManager(PersistenceManager pm) { this.pm = pm; } }