package com.ringtone.server;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.logging.Logger;
import javax.jdo.PersistenceManager;
import javax.jdo.Query;
import org.apache.lucene.LucenePackage;
import com.google.appengine.api.datastore.DatastoreNeedIndexException;
import com.google.appengine.api.datastore.DatastoreTimeoutException;
public class SearchJanitor {
private static final Logger log = Logger.getLogger(SearchJanitor.class.getName());
public static final int MAXIMUM_NUMBER_OF_WORDS_TO_SEARCH = 10;
public static final int MAX_NUMBER_OF_WORDS_TO_PUT_IN_INDEX = 200;
public static final int RESULTS_PER_PAGE = 10;
public static List<SongEntry> searchSongEntries(
String queryString,
PersistenceManager pm,
int start) {
StringBuffer queryBuffer = new StringBuffer();
queryBuffer.append("SELECT FROM " + SongEntry.class.getName() + " WHERE ");
Set<String> queryTokens = SearchJanitorUtils
.getTokensForIndexingOrQuery(queryString,
MAXIMUM_NUMBER_OF_WORDS_TO_SEARCH);
List<String> parametersForSearch = new ArrayList<String>(queryTokens);
StringBuffer declareParametersBuffer = new StringBuffer();
int parameterCounter = 0;
while (parameterCounter < queryTokens.size()) {
queryBuffer.append("fts == param" + parameterCounter);
declareParametersBuffer.append("String param" + parameterCounter);
if (parameterCounter + 1 < queryTokens.size()) {
queryBuffer.append(" && ");
declareParametersBuffer.append(", ");
}
parameterCounter++;
}
System.out.println("QueryBuffer: "+queryBuffer.toString());
Query query = pm.newQuery(queryBuffer.toString());
query.setRange(start, start+RESULTS_PER_PAGE);
if (parameterCounter <=3) {
query.setOrdering("download_count desc");
}
// query.setOrdering("download_count desc");
query.declareParameters(declareParametersBuffer.toString());
List<SongEntry> result = null;
try {
result = (List<SongEntry>) query.executeWithArray(parametersForSearch
.toArray());
} catch (DatastoreTimeoutException e) {
log.severe(e.getMessage());
log.severe("datastore timeout at: " + queryString);// + " - timestamp: " + discreteTimestamp);
} catch(DatastoreNeedIndexException e) {
log.severe(e.getMessage());
log.severe("datastore need index exception at: " + queryString);// + " - timestamp: " + discreteTimestamp);
}
return result;
}
public static void updateFTSStuffForSongEntry(
SongEntry songEntry) {
StringBuffer sb = new StringBuffer();
sb.append(songEntry.getContent());
Set<String> new_ftsTokens = SearchJanitorUtils.getTokensForIndexingOrQuery(
sb.toString(),
MAX_NUMBER_OF_WORDS_TO_PUT_IN_INDEX);
Set<String> ftsTokens = songEntry.getFts();
ftsTokens.clear();
for (String token : new_ftsTokens) {
ftsTokens.add(token);
}
}
}