Package com.tubeonfire.search

Source Code of com.tubeonfire.search.TubeSearchModel

package com.tubeonfire.search;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;
import java.util.TreeMap;
import java.util.logging.Logger;

import javax.cache.Cache;
import javax.cache.CacheException;
import javax.cache.CacheManager;

import com.google.appengine.api.search.Index;
import com.google.appengine.api.search.IndexSpec;
import com.google.appengine.api.search.ListRequest;
import com.google.appengine.api.search.Query;
import com.google.appengine.api.search.QueryOptions;
import com.google.appengine.api.search.Results;
import com.google.appengine.api.search.ScoredDocument;
import com.google.appengine.api.search.SearchServiceFactory;
import com.google.appengine.api.search.SortExpression;
import com.google.appengine.api.search.SortOptions;
import com.tubeonfire.entity.SpecialTube;
import com.tubeonfire.entity.Tube;
import com.tubeonfire.model.SpecialTubeModel;
import com.tubeonfire.model.admin.SiteConfigModel;
import com.tubeonfire.search.admin.TubeSearchEngine;

public class TubeSearchModel {

  private static Index INDEX = SearchServiceFactory.getSearchService()
      .getIndex(IndexSpec.newBuilder().setName("tube"));
  private static final Logger log = Logger.getLogger(TubeSearchModel.class
      .getName());

  private static Cache cache = null;

  private static String cacheSide = "frontEndSearch_";

  private static String cachePrefix = "tubeModel_";

  private static boolean isRegisted = false;

  private static TreeMap<String, String> mapCacheKey = new TreeMap<String, String>();

  private int limit = 30;

  private int page = 1;

  private int totalResult = 0;

  private int totalReturn = 0;

  private int totalPage = 1;

  private List<Tube> listResult = new ArrayList<Tube>();

  public TubeSearchModel() {
    initCache();
  }

  public void setTotalResult(int totalResult) {
    this.totalResult = totalResult;
  }

  public int getTotalPage() {
    totalPage = totalResult / limit;
    if ((totalResult % limit) > 0) {
      totalPage += 1;
    }
    return totalPage;
  }

  public void setTotalPage(int totalPage) {
    this.totalPage = totalPage;
  }

  public int getLimit() {
    return limit;
  }

  public void setLimit(int limit) {
    this.limit = limit;
  }

  public boolean isHasNextPage() {
    if (totalResult != 0) {
      return totalResult > (page * limit);
    } else {
      return false;
    }
  }

  public boolean isHasPreviousPage() {
    return page > 1;
  }

  public int getTotalResult() {
    return totalResult;
  }

  public int getTotalReturn() {
    return totalReturn;
  }

  public int getPage() {
    return page;
  }

  public void setPage(int page) {
    this.page = page;
  }

  public List<Tube> getListResult() {
    return listResult;
  }

  public void setListResult(List<Tube> listResult) {
    this.listResult = listResult;
  }

  public static String getCacheSide() {
    return cacheSide;
  }

  public static String getCachePrefix() {
    return cachePrefix;
  }

  public static void initCache() {
    if (!isRegisted) {
      isRegisted = true;
      try {
        cache = CacheManager.getInstance().getCacheFactory()
            .createCache(Collections.emptyMap());
      } catch (CacheException e) {
        log.warning(e.toString());
        e.printStackTrace();
        isRegisted = false;
      }
    }
  }

  public void countTotal() {
    ListRequest request = ListRequest.newBuilder()
        .setReturningIdsOnly(true).setLimit(1000).build();
    totalResult = (int) INDEX.listDocuments(request).getResults().size();
  }

  @SuppressWarnings("unchecked")
  public static Tube getById(String id) {
    try {
      initCache();
      String prefix = cachePrefix + "id_" + id;
      Tube obj = new Tube();
      if (cache != null && cache.containsKey(prefix)) {
        obj = (Tube) cache.get(prefix);
      } else {
        QueryOptions options = QueryOptions.newBuilder().setLimit(1)
            .build();
        Query query = Query.newBuilder().setOptions(options)
            .build("id:\"" + id + "\"");
        Results<ScoredDocument> docResult = INDEX.search(query);
        if (docResult.getNumberFound() > 0) {
          for (ScoredDocument scoredDocument : docResult) {
            obj = TubeSearchEngine
                .documentToObjectByReflection(scoredDocument);
          }
        }
        if (obj != null && obj.getId().length() > 0) {
          cache.put(prefix, obj);
        } else {
          obj = null;
        }
      }
      return obj;
    } catch (Exception e) {
      log.warning(e.toString());
      e.printStackTrace();
      return null;
    }
  }

  @SuppressWarnings("unchecked")
  public void prepareList() {
    try {
      listResult = new ArrayList<Tube>();
      String prefix = cacheSide + cachePrefix + "list_" + page;
      mapCacheKey.put(prefix, prefix);
      String totalResultPrefix = cachePrefix + "list_" + "TotalResult";
      String limitPrefix = cachePrefix + "list_" + "Limit";
      if (cache != null && cache.containsKey(prefix)) {
        listResult = (ArrayList<Tube>) cache.get(prefix);
        totalResult = (Integer) cache.get(totalResultPrefix);
        limit = (Integer) cache.get(limitPrefix);
      } else {
        QueryOptions options;
        Query query;
        Results<ScoredDocument> docResult;

        options = QueryOptions
            .newBuilder()
            .setNumberFoundAccuracy(1000)
            .setLimit(limit)
            .setOffset(limit * (page - 1))
            .setFieldsToReturn("id", "alias", "title",
                "playlistId", "imageUrl", "totalTime", "view")
            .build();

        query = Query.newBuilder().setOptions(options).build("");

        docResult = INDEX.search(query);
        if (cache != null && cache.containsKey(limitPrefix)
            && cache.containsKey(totalResultPrefix)) {
          totalResult = (Integer) cache.get(totalResultPrefix);
          limit = (Integer) cache.get(limitPrefix);
        } else {
          countTotal();
        }
        if (docResult.getNumberFound() > 0) {
          for (ScoredDocument scoredDocument : docResult) {
            listResult.add(TubeSearchEngine
                .documentToObjectByReflection(scoredDocument));
          }
        }
        if (listResult.size() > 0) {
          cache.put(prefix, listResult);
          cache.put(totalResultPrefix, totalResult);
          cache.put(limitPrefix, limit);
        }
      }
    } catch (Exception e) {
      log.warning(e.toString());
      e.printStackTrace();
      listResult = new ArrayList<Tube>();
    }
  }

  @SuppressWarnings("unchecked")
  public void prepareRecentView() {
    try {
      listResult = new ArrayList<Tube>();
      String prefix = cacheSide + cachePrefix + "recentView_";
      mapCacheKey.put(prefix, prefix);
      if (cache != null && cache.containsKey(prefix)) {
        listResult = (ArrayList<Tube>) cache.get(prefix);
      } else {
        QueryOptions options;
        Query query;
        Results<ScoredDocument> docResult;

        options = QueryOptions
            .newBuilder()
            .setNumberFoundAccuracy(1000)
            .setLimit(limit)
            .setOffset(limit * (page - 1))
            .setFieldsToReturn("id", "alias", "title",
                "playlistId", "imageUrl", "totalTime", "view")
            .build();

        query = Query.newBuilder().setOptions(options).build("");

        docResult = INDEX.search(query);

        if (docResult.getNumberFound() > 0) {
          for (ScoredDocument scoredDocument : docResult) {
            listResult.add(TubeSearchEngine
                .documentToObjectByReflection(scoredDocument));
          }
        }
        if (listResult.size() > 0) {
          cache.put(prefix, listResult);
        }
      }
    } catch (Exception e) {
      log.warning(e.toString());
      e.printStackTrace();
      listResult = new ArrayList<Tube>();
    }
  }

  @SuppressWarnings("unchecked")
  public void prepareTubes() {
    try {
      listResult = new ArrayList<Tube>();
      String prefix = cacheSide + cachePrefix + "tubes_" + page;
      String totalResultPrefix = cachePrefix + "tubes_" + "TotalResult";
      String limitPrefix = cachePrefix + "tubes_" + "Limit";
      mapCacheKey.put(prefix, prefix);
      mapCacheKey.put(totalResultPrefix, totalResultPrefix);
      mapCacheKey.put(limitPrefix, limitPrefix);
      if (cache != null && cache.containsKey(prefix)) {
        listResult = (ArrayList<Tube>) cache.get(prefix);
        totalResult = (Integer) cache.get(totalResultPrefix);
        limit = (Integer) cache.get(limitPrefix);
      } else {
        QueryOptions options;
        Query query;
        Results<ScoredDocument> docResult;

        options = QueryOptions
            .newBuilder()
            .setNumberFoundAccuracy(1000)
            .setLimit(limit)
            .setOffset(limit * (page - 1))
            .setFieldsToReturn("id", "alias", "title",
                "playlistId", "imageUrl", "totalTime", "view")
            .build();

        query = Query.newBuilder().setOptions(options).build("");

        docResult = INDEX.search(query);
        if (cache != null && cache.containsKey(limitPrefix)
            && cache.containsKey(totalResultPrefix)) {
          totalResult = (Integer) cache.get(totalResultPrefix);
          limit = (Integer) cache.get(limitPrefix);
        } else {
          countTotal();
        }
        if (docResult.getNumberFound() > 0) {
          for (ScoredDocument scoredDocument : docResult) {
            listResult.add(TubeSearchEngine
                .documentToObjectByReflection(scoredDocument));
          }
        }
        if (listResult.size() > 0) {
          cache.put(prefix, listResult);
          cache.put(totalResultPrefix, totalResult);
          cache.put(limitPrefix, limit);
        }
      }
    } catch (Exception e) {
      log.warning(e.toString());
      e.printStackTrace();
      listResult = new ArrayList<Tube>();
    }
  }

  @SuppressWarnings("unchecked")
  public void prepareTubeByPlaylist(String playlistId) {
    try {
      listResult = new ArrayList<Tube>();
      String prefix = cacheSide + cachePrefix + "playlist_" + playlistId
          + "_page_" + page;
      mapCacheKey.put(prefix, prefix);
      String totalResultPrefix = cachePrefix + "playlist_" + playlistId
          + "TotalResult";
      String limitPrefix = cachePrefix + "playlist_" + playlistId
          + "Limit";
      if (cache != null && cache.containsKey(prefix)) {
        listResult = (ArrayList<Tube>) cache.get(prefix);
        totalResult = (Integer) cache.get(totalResultPrefix);
        limit = (Integer) cache.get(limitPrefix);
      } else {
        StringBuilder queryString = new StringBuilder();
        queryString.append("playlistId:" + playlistId);
        QueryOptions options;
        Query query;
        Results<ScoredDocument> docResult;
        if (cache != null && cache.containsKey(totalResultPrefix)
            && cache.containsKey(limitPrefix)) {
          totalResult = (Integer) cache.get(totalResultPrefix);
          limit = (Integer) cache.get(limitPrefix);
        } else {
          options = QueryOptions.newBuilder()
              .setNumberFoundAccuracy(1000).build();
          query = Query.newBuilder().setOptions(options)
              .build(queryString.toString());
          docResult = INDEX.search(query);
          totalResult = (int) docResult.getNumberFound();
        }

        SortOptions sortOptions = SortOptions
            .newBuilder()
            .addSortExpression(
                SortExpression
                    .newBuilder()
                    .setExpression("bumpPoint")
                    .setDirection(
                        SortExpression.SortDirection.DESCENDING)
                    .setDefaultValueNumeric(1)).build();

        options = QueryOptions
            .newBuilder()
            .setSortOptions(sortOptions)
            .setNumberFoundAccuracy(1000)
            .setLimit(limit)
            .setOffset(limit * (page - 1))
            .setFieldsToReturn("id", "alias", "title",
                "playlistId", "imageUrl", "totalTime", "view")
            .build();

        query = Query.newBuilder().setOptions(options)
            .build(queryString.toString());
        docResult = INDEX.search(query);
        totalReturn = (int) docResult.getNumberReturned();
        if (docResult.getNumberFound() > 0) {
          Tube obj = new Tube();
          for (ScoredDocument scoredDocument : docResult) {
            obj = TubeSearchEngine
                .documentToObjectByReflection(scoredDocument);
            listResult.add(obj);
          }
        }
        if (listResult.size() > 0) {
          cache.put(prefix, listResult);
          cache.put(totalResultPrefix, totalResult);
          cache.put(limitPrefix, limit);
        }
      }
    } catch (Exception e) {
      log.warning(e.toString());
      e.printStackTrace();
      listResult = new ArrayList<Tube>();
    }
  }

  @SuppressWarnings("unchecked")
  public void prepareTubeByChannel(String channelId) {
    try {
      listResult = new ArrayList<Tube>();
      String prefix = cacheSide + cachePrefix + "channelId_" + channelId
          + "_page_" + page;
      mapCacheKey.put(prefix, prefix);
      String totalResultPrefix = cachePrefix + "channelId_" + channelId
          + "TotalResult";
      String limitPrefix = cachePrefix + "channelId_" + channelId
          + "Limit";
      if (cache != null && cache.containsKey(prefix)) {
        listResult = (ArrayList<Tube>) cache.get(prefix);
        totalResult = (Integer) cache.get(totalResultPrefix);
        limit = (Integer) cache.get(limitPrefix);
      } else {
        StringBuilder queryString = new StringBuilder();
        queryString.append("channelId:" + channelId);
        QueryOptions options;
        Query query;
        Results<ScoredDocument> docResult;
        if (cache != null && cache.containsKey(totalResultPrefix)
            && cache.containsKey(limitPrefix)) {
          totalResult = (Integer) cache.get(totalResultPrefix);
          limit = (Integer) cache.get(limitPrefix);
        } else {
          options = QueryOptions.newBuilder()
              .setNumberFoundAccuracy(1000).build();
          query = Query.newBuilder().setOptions(options)
              .build(queryString.toString());
          docResult = INDEX.search(query);
          totalResult = (int) docResult.getNumberFound();
        }

        SortOptions sortOptions = SortOptions
            .newBuilder()
            .addSortExpression(
                SortExpression
                    .newBuilder()
                    .setExpression("bumpPoint")
                    .setDirection(
                        SortExpression.SortDirection.DESCENDING)
                    .setDefaultValueNumeric(1)).build();

        options = QueryOptions
            .newBuilder()
            .setSortOptions(sortOptions)
            .setNumberFoundAccuracy(1000)
            .setLimit(limit)
            .setOffset(limit * (page - 1))
            .setFieldsToReturn("id", "alias", "title",
                "playlistId", "imageUrl", "totalTime", "view")
            .build();

        query = Query.newBuilder().setOptions(options)
            .build(queryString.toString());
        docResult = INDEX.search(query);
        totalReturn = (int) docResult.getNumberReturned();
        if (docResult.getNumberFound() > 0) {
          Tube obj = new Tube();
          for (ScoredDocument scoredDocument : docResult) {
            obj = TubeSearchEngine
                .documentToObjectByReflection(scoredDocument);
            listResult.add(obj);
          }
        }
        if (listResult.size() > 0) {
          cache.put(prefix, listResult);
          cache.put(totalResultPrefix, totalResult);
          cache.put(limitPrefix, limit);
        }
      }
    } catch (Exception e) {
      log.warning(e.toString());
      e.printStackTrace();
      listResult = new ArrayList<Tube>();
    }
  }

  @SuppressWarnings("unchecked")
  public void prepareTubeByAuthor(String authorId) {
    try {
      listResult = new ArrayList<Tube>();
      String prefix = cacheSide + cachePrefix + "authorId_" + authorId
          + "_page_" + page;
      mapCacheKey.put(prefix, prefix);
      String totalResultPrefix = cachePrefix + "authorId_" + authorId
          + "TotalResult";
      String limitPrefix = cachePrefix + "authorId_" + authorId + "Limit";
      if (cache != null && cache.containsKey(prefix)) {
        listResult = (ArrayList<Tube>) cache.get(prefix);
        totalResult = (Integer) cache.get(totalResultPrefix);
        limit = (Integer) cache.get(limitPrefix);
      } else {
        StringBuilder queryString = new StringBuilder();
        queryString.append("authorUrl=\"" + authorId + "\"");
        QueryOptions options;
        Query query;
        Results<ScoredDocument> docResult;
        if (cache != null && cache.containsKey(totalResultPrefix)
            && cache.containsKey(limitPrefix)) {
          totalResult = (Integer) cache.get(totalResultPrefix);
          limit = (Integer) cache.get(limitPrefix);
        } else {
          options = QueryOptions.newBuilder()
              .setNumberFoundAccuracy(1000).build();
          query = Query.newBuilder().setOptions(options)
              .build(queryString.toString());
          docResult = INDEX.search(query);
          totalResult = (int) docResult.getNumberFound();
        }

        SortOptions sortOptions = SortOptions
            .newBuilder()
            .addSortExpression(
                SortExpression
                    .newBuilder()
                    .setExpression("bumpPoint")
                    .setDirection(
                        SortExpression.SortDirection.DESCENDING)
                    .setDefaultValueNumeric(1)).build();

        options = QueryOptions
            .newBuilder()
            .setSortOptions(sortOptions)
            .setNumberFoundAccuracy(1000)
            .setLimit(limit)
            .setOffset(limit * (page - 1))
            .setFieldsToReturn("id", "alias", "title",
                "playlistId", "imageUrl", "totalTime", "view")
            .build();

        query = Query.newBuilder().setOptions(options)
            .build(queryString.toString());
        System.out.println(queryString.toString());
        docResult = INDEX.search(query);
        totalReturn = (int) docResult.getNumberReturned();
        if (docResult.getNumberFound() > 0) {
          Tube obj = new Tube();
          for (ScoredDocument scoredDocument : docResult) {
            obj = TubeSearchEngine
                .documentToObjectByReflection(scoredDocument);
            listResult.add(obj);
          }
        }
        if (listResult.size() > 0) {
          cache.put(prefix, listResult);
          cache.put(totalResultPrefix, totalResult);
          cache.put(limitPrefix, limit);
        }
      }
    } catch (Exception e) {
      log.warning(e.toString());
      e.printStackTrace();
      listResult = new ArrayList<Tube>();
    }
  }

  @SuppressWarnings("unchecked")
  public void prepareByTag(String tag) {
    try {
      String prefix = cacheSide + cachePrefix + "tag_" + tag + "_page_"
          + page;
      mapCacheKey.put(prefix, prefix);
      String totalResultPrefix = cachePrefix + "tag_" + tag
          + "TotalResult";
      String limitPrefix = cachePrefix + "tag_" + tag + "Limit";
      if (cache != null && cache.containsKey(prefix)) {
        listResult = (ArrayList<Tube>) cache.get(prefix);
        totalResult = (Integer) cache.get(totalResultPrefix);
        limit = (Integer) cache.get(limitPrefix);
      } else {
        listResult = new ArrayList<Tube>();
        StringBuilder queryString = new StringBuilder();
        queryString.append("tags:" + tag + " OR title:" + tag);
        QueryOptions options;
        Query query;
        Results<ScoredDocument> docResult;
        if (cache != null && cache.containsKey(totalResultPrefix)
            && cache.containsKey(limitPrefix)) {
          totalResult = (Integer) cache.get(totalResultPrefix);
          limit = (Integer) cache.get(limitPrefix);
        } else {
          options = QueryOptions.newBuilder()
              .setNumberFoundAccuracy(1000).build();
          query = Query.newBuilder().setOptions(options)
              .build(queryString.toString());
          docResult = INDEX.search(query);
          totalResult = (int) docResult.getNumberFound();
        }
        SortOptions sortOptions = SortOptions
            .newBuilder()
            .addSortExpression(
                SortExpression
                    .newBuilder()
                    .setExpression("bumpPoint")
                    .setDirection(
                        SortExpression.SortDirection.DESCENDING)
                    .setDefaultValueNumeric(1)).build();

        options = QueryOptions
            .newBuilder()
            .setSortOptions(sortOptions)
            .setNumberFoundAccuracy(1000)
            .setLimit(limit)
            .setOffset(limit * (page - 1))
            .setFieldsToReturn("id", "alias", "title",
                "playlistId", "imageUrl", "totalTime", "view")
            .build();

        query = Query.newBuilder().setOptions(options)
            .build(queryString.toString());
        docResult = INDEX.search(query);
        totalReturn = (int) docResult.getNumberReturned();
        if (docResult.getNumberFound() > 0) {
          Tube obj = new Tube();
          for (ScoredDocument scoredDocument : docResult) {
            obj = TubeSearchEngine
                .documentToObjectByReflection(scoredDocument);
            listResult.add(obj);
          }
        }
        if (listResult.size() > 0) {
          cache.put(prefix, listResult);
          cache.put(totalResultPrefix, totalResult);
          cache.put(limitPrefix, limit);
        }
      }
    } catch (Exception e) {
      log.warning(e.toString());
      e.printStackTrace();
      listResult = new ArrayList<Tube>();
    }
  }

  @SuppressWarnings("unchecked")
  public void prepareBanner() {
    try {
      listResult = new ArrayList<Tube>();
      String prefix = cachePrefix + "slideshow";
      mapCacheKey.put(prefix, prefix);
      if (cache != null && cache.containsKey(prefix)) {
        listResult = (ArrayList<Tube>) cache.get(prefix);
      } else {
        SpecialTube spTube = SpecialTubeModel.getByType("slide", true);
        if (spTube != null) {
          for (String strId : spTube.getListTubeId()) {
            listResult.add(getById(strId));
          }
        }
        if (listResult.size() > 0) {
          cache.put(prefix, listResult);
        }
      }
    } catch (Exception e) {
      log.warning(e.toString());
      e.printStackTrace();
      listResult = new ArrayList<Tube>();
    }
  }

  @SuppressWarnings("unchecked")
  public void prepareHomePageTubeByPlaylist(String playlistId) {
    try {
      listResult = new ArrayList<Tube>();
      limit = SiteConfigModel.get().getHomePageTubePerBlockQuantity();
      String prefix = cacheSide + cachePrefix + "homepagePlaylist_"
          + playlistId + limit;
      mapCacheKey.put(prefix, prefix);
      if (cache != null && cache.containsKey(prefix)) {
        listResult = (ArrayList<Tube>) cache.get(prefix);
      } else {
        StringBuilder queryString = new StringBuilder();
        queryString.append("playlistId:" + playlistId);
        QueryOptions options;
        Query query;
        Results<ScoredDocument> docResult;
        SortOptions sortOptions = SortOptions
            .newBuilder()
            .addSortExpression(
                SortExpression
                    .newBuilder()
                    .setExpression("bumpPoint")
                    .setDirection(
                        SortExpression.SortDirection.DESCENDING)
                    .setDefaultValueNumeric(1)).build();

        options = QueryOptions
            .newBuilder()
            .setSortOptions(sortOptions)
            .setNumberFoundAccuracy(1000)
            .setLimit(limit)
            .setOffset(limit * (page - 1))
            .setFieldsToReturn("id", "alias", "title",
                "playlistId", "imageUrl", "totalTime", "view")
            .build();

        query = Query.newBuilder().setOptions(options)
            .build(queryString.toString());
        docResult = INDEX.search(query);
        if (docResult.getNumberFound() > 0) {
          Tube obj = new Tube();
          for (ScoredDocument scoredDocument : docResult) {
            obj = TubeSearchEngine
                .documentToObjectByReflection(scoredDocument);
            listResult.add(obj);
          }
        }
        if (listResult.size() > 0) {
          cache.put(prefix, listResult);
        }
      }
    } catch (Exception e) {
      log.warning(e.toString());
      e.printStackTrace();
      listResult = new ArrayList<Tube>();
    }
  }

  @SuppressWarnings("unchecked")
  public void prepareHomePageTubeByChannel(String channelId) {
    try {
      listResult = new ArrayList<Tube>();
      String prefix = cacheSide + cachePrefix + "homepageChannel_"
          + channelId + limit;
      mapCacheKey.put(prefix, prefix);
      if (cache != null && cache.containsKey(prefix)) {
        listResult = (ArrayList<Tube>) cache.get(prefix);
      } else {
        StringBuilder queryString = new StringBuilder();
        queryString.append("channelId:" + channelId);
        QueryOptions options;
        Query query;
        Results<ScoredDocument> docResult;
        SortOptions sortOptions = SortOptions
            .newBuilder()
            .addSortExpression(
                SortExpression
                    .newBuilder()
                    .setExpression("bumpPoint")
                    .setDirection(
                        SortExpression.SortDirection.DESCENDING)
                    .setDefaultValueNumeric(1)).build();

        options = QueryOptions
            .newBuilder()
            .setSortOptions(sortOptions)
            .setNumberFoundAccuracy(1000)
            .setLimit(limit)
            .setOffset(limit * (page - 1))
            .setFieldsToReturn("id", "alias", "title",
                "playlistId", "imageUrl", "totalTime", "view")
            .build();

        query = Query.newBuilder().setOptions(options)
            .build(queryString.toString());
        docResult = INDEX.search(query);
        if (docResult.getNumberFound() > 0) {
          Tube obj = new Tube();
          for (ScoredDocument scoredDocument : docResult) {
            obj = TubeSearchEngine
                .documentToObjectByReflection(scoredDocument);
            listResult.add(obj);
          }
        }
        if (listResult.size() > 0) {
          cache.put(prefix, listResult);
        }
      }
    } catch (Exception e) {
      log.warning(e.toString());
      e.printStackTrace();
      listResult = new ArrayList<Tube>();
    }
  }

  @SuppressWarnings("unchecked")
  public void prepareRelateTube(Tube obj) {
    try {
      listResult = new ArrayList<Tube>();
      String prefix = cacheSide + cachePrefix + "relate_with_id_"
          + obj.getId();
      mapCacheKey.put(prefix, prefix);
      String playlistKeyPoolPrefix = cachePrefix + "playlistIdPool_"
          + obj.getPlaylistId();
      if (cache != null && cache.containsKey(prefix)) {
        listResult = (ArrayList<Tube>) cache.get(prefix);
      } else {
        QueryOptions options;
        Query query;
        Results<ScoredDocument> docResult;
        // get pool id by playlist
        List<String> keyPool = new ArrayList<String>();
        if (cache != null && cache.containsKey(playlistKeyPoolPrefix)) {
          keyPool = (ArrayList<String>) cache
              .get(playlistKeyPoolPrefix);
        } else {
          StringBuilder queryString = new StringBuilder();
          queryString.append("playlistId:" + obj.getPlaylistId());

          options = QueryOptions.newBuilder().build();
          System.out.println(queryString.toString());
          query = Query.newBuilder().setOptions(options)
              .build(queryString.toString());
          docResult = INDEX.search(query);

          if (docResult.getNumberFound() > 0) {
            Tube tub = new Tube();
            for (ScoredDocument scoredDocument : docResult) {
              tub = TubeSearchEngine
                  .documentToObjectByReflection(scoredDocument);
              keyPool.add(tub.getId());
            }
          }
          cache.put(playlistKeyPoolPrefix, keyPool);
        }
        // get list id random from pool
        List<String> relateKey = new ArrayList<String>();
        if (keyPool.size() > 20) {
          System.out.println(">20");
          Random randomGenerator = new Random();
          int index = randomGenerator
              .nextInt((int) (keyPool.size() / 2));
          relateKey = keyPool.subList(index, (index + 10));
        } else if (keyPool.size() < 5) {
          System.out.println("<5");
          options = QueryOptions.newBuilder().setLimit(10).build();
          query = Query.newBuilder().setOptions(options).build("");
          docResult = INDEX.search(query);

          if (docResult.getNumberFound() > 0) {
            Tube tub = new Tube();
            for (ScoredDocument scoredDocument : docResult) {
              tub = TubeSearchEngine
                  .documentToObjectByReflection(scoredDocument);
              relateKey.add(tub.getId());
            }
          }
        } else {
          System.out.println(">5<20");
          relateKey = keyPool;
        }

        for (String string : relateKey) {
          Tube tub = getById(string);
          if (tub != null) {
            listResult.add(tub);
          }
        }
        if (listResult.size() > 0) {
          cache.put(prefix, listResult);
        }
      }
    } catch (Exception e) {
      log.warning(e.toString());
      e.printStackTrace();
      listResult = new ArrayList<Tube>();
    }
  }

  @SuppressWarnings("unchecked")
  public void prepareMostView() {
    try {
      listResult = new ArrayList<Tube>();
      String prefix = cacheSide + cachePrefix + "mostview_" + limit;
      mapCacheKey.put(prefix, prefix);
      if (cache != null && cache.containsKey(prefix)) {
        listResult = (ArrayList<Tube>) cache.get(prefix);
      } else {
        QueryOptions options;
        Query query;
        Results<ScoredDocument> docResult;
        SortOptions sortOptions = SortOptions
            .newBuilder()
            .addSortExpression(
                SortExpression
                    .newBuilder()
                    .setExpression("view")
                    .setDirection(
                        SortExpression.SortDirection.DESCENDING)
                    .setDefaultValueNumeric(1)).build();

        options = QueryOptions
            .newBuilder()
            .setSortOptions(sortOptions)
            .setLimit(limit)
            .setFieldsToReturn("id", "alias", "title",
                "playlistId", "imageUrl", "totalTime", "view")
            .build();

        query = Query.newBuilder().setOptions(options).build("");
        docResult = INDEX.search(query);
        if (docResult.getNumberFound() > 0) {
          for (ScoredDocument scoredDocument : docResult) {
            listResult.add(TubeSearchEngine
                .documentToObjectByReflection(scoredDocument));
          }
        }
        if (listResult.size() > 0) {
          cache.put(prefix, listResult);
        }
      }
    } catch (Exception e) {
      log.warning(e.toString());
      e.printStackTrace();
      listResult = new ArrayList<Tube>();
    }
  }

  @SuppressWarnings("unchecked")
  public void prepareSearch(String keyword) {
    try {
      listResult = new ArrayList<Tube>();
      String prefix = cacheSide + cachePrefix + "search_" + keyword
          + "_page_" + page;
      mapCacheKey.put(prefix, prefix);
      String totalResultPrefix = cachePrefix + "search_" + keyword
          + "TotalResult";
      String limitPrefix = cachePrefix + "search_" + keyword + "Limit";
      if (cache != null && cache.containsKey(prefix)) {
        listResult = (ArrayList<Tube>) cache.get(prefix);
        totalResult = (Integer) cache.get(totalResultPrefix);
        limit = (Integer) cache.get(limitPrefix);
        System.out.println("cache");
      } else {
        StringBuilder queryString = new StringBuilder();
        queryString.append("title:" + keyword + " OR description:"
            + keyword);
        listResult = new ArrayList<Tube>();
        QueryOptions options;
        Query query;
        Results<ScoredDocument> docResult;
        if (cache != null && cache.containsKey(totalResultPrefix)
            && cache.containsKey(limitPrefix)) {
          totalResult = (Integer) cache.get(totalResultPrefix);
          limit = (Integer) cache.get(limitPrefix);
          System.out.println("count cache");
        } else {
          options = QueryOptions.newBuilder()
              .setNumberFoundAccuracy(1000).build();
          query = Query.newBuilder().setOptions(options)
              .build(queryString.toString());
          docResult = INDEX.search(query);
          totalResult = (int) docResult.getNumberFound();
          System.out.println("count !cache");
        }

        SortOptions sortOptions = SortOptions
            .newBuilder()
            .addSortExpression(
                SortExpression
                    .newBuilder()
                    .setExpression("bumpPoint")
                    .setDirection(
                        SortExpression.SortDirection.DESCENDING)
                    .setDefaultValueNumeric(1)).build();

        options = QueryOptions
            .newBuilder()
            .setSortOptions(sortOptions)
            .setNumberFoundAccuracy(1000)
            .setLimit(limit)
            .setOffset(limit * (page - 1))
            .setFieldsToReturn("id", "alias", "title",
                "playlistId", "imageUrl", "totalTime", "view")
            .build();

        query = Query.newBuilder().setOptions(options)
            .build(queryString.toString());
        docResult = INDEX.search(query);
        totalReturn = (int) docResult.getNumberReturned();
        if (docResult.getNumberFound() > 0) {
          Tube obj = new Tube();
          for (ScoredDocument scoredDocument : docResult) {
            obj = TubeSearchEngine
                .documentToObjectByReflection(scoredDocument);
            listResult.add(obj);
          }
        }
        if (listResult.size() > 0) {
          cache.put(prefix, listResult);
          cache.put(totalResultPrefix, totalResult);
          cache.put(limitPrefix, limit);
        }
      }
    } catch (Exception e) {
      log.warning(e.toString());
      e.printStackTrace();
      listResult = new ArrayList<Tube>();
    }
  }

  public static void clearModelCache() {
    initCache();
    try {
      if (mapCacheKey != null && mapCacheKey.size() > 0) {
        for (String key : mapCacheKey.keySet()) {
          cache.remove(key);
        }
      }
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

}
TOP

Related Classes of com.tubeonfire.search.TubeSearchModel

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.