use of com.pratilipi.data.type.Page in project pratilipi by Pratilipi.
the class DataAccessorGaeImpl method getPratilipiList.
@SuppressWarnings("unchecked")
private <T> DataListCursorTuple<T> getPratilipiList(PratilipiFilter pratilipiFilter, String cursorStr, Integer offset, Integer resultCount, boolean idOnly) {
if (pratilipiFilter.getListName() == null) {
Query<PratilipiEntity> query = ObjectifyService.ofy().load().type(PratilipiEntity.class);
if (pratilipiFilter.getAuthorId() != null)
query = query.filter("AUTHOR_ID", pratilipiFilter.getAuthorId());
if (pratilipiFilter.getLanguage() != null)
query = query.filter("LANGUAGE", pratilipiFilter.getLanguage());
if (pratilipiFilter.getType() != null)
query = query.filter("PRATILIPI_TYPE", pratilipiFilter.getType());
if (pratilipiFilter.getState() != null)
query = query.filter("STATE", pratilipiFilter.getState());
if (pratilipiFilter.getMinLastUpdated() != null) {
query = query.filter(pratilipiFilter.isMinLastUpdatedInclusive() ? "LAST_UPDATED >=" : "LAST_UPDATED >", pratilipiFilter.getMinLastUpdated());
query = query.order("LAST_UPDATED");
}
if (pratilipiFilter.getOrderByReadCount() != null)
query = query.order(pratilipiFilter.getOrderByReadCount() ? "READ_COUNT" : "-READ_COUNT");
if (pratilipiFilter.getOrderByLastUpdate() != null)
query = query.order(pratilipiFilter.getOrderByLastUpdate() ? "LAST_UPDATED" : "-LAST_UPDATED");
if (cursorStr != null)
query = query.startAt(Cursor.fromWebSafeString(cursorStr));
if (offset != null && offset > 0)
query = query.offset(offset);
if (resultCount != null && resultCount > 0)
query = query.limit(resultCount);
List<T> responseList = resultCount == null ? new ArrayList<T>() : new ArrayList<T>(resultCount);
Cursor cursor = null;
if (idOnly) {
QueryResultIterator<Key<PratilipiEntity>> iterator = query.keys().iterator();
while (iterator.hasNext()) responseList.add((T) (Long) iterator.next().getId());
cursor = iterator.getCursor();
} else {
QueryResultIterator<PratilipiEntity> iterator = query.iterator();
while (iterator.hasNext()) responseList.add((T) iterator.next());
cursor = iterator.getCursor();
}
return new DataListCursorTuple<T>(responseList, cursor == null ? null : cursor.toWebSafeString());
} else {
// Getting PratilipiList
String pratilipiIdListMemcacheId = "DataStore.Pratilipi-list." + pratilipiFilter.getLanguage().getCode() + "." + pratilipiFilter.getListName() + "?" + SystemProperty.STAGE;
ArrayList<Long> pratilipiIdList = memcache.get(pratilipiIdListMemcacheId);
if (pratilipiIdList == null) {
List<String> uriList = null;
String listName = "list." + pratilipiFilter.getLanguage().getCode() + "." + pratilipiFilter.getListName();
logger.log(Level.INFO, "List Name : " + listName);
try {
String fileName = CURATED_DATA_FOLDER + "/" + listName;
InputStream inputStream = DataAccessor.class.getResource(fileName).openStream();
uriList = IOUtils.readLines(inputStream, "UTF-8");
inputStream.close();
} catch (NullPointerException | IOException e) {
logger.log(Level.SEVERE, "Failed to fetch " + pratilipiFilter.getListName() + " list for " + pratilipiFilter.getLanguage() + ".", e);
return new DataListCursorTuple<T>(new ArrayList<T>(0), "0", 0L);
}
// Removing the first line having title.
uriList.remove(0);
// Removing empty lines.
for (int i = 0; i < uriList.size(); i++) {
String uri = uriList.get(i).trim();
if (uri.isEmpty()) {
uriList.remove(i);
i--;
continue;
} else {
uriList.set(i, uri);
}
}
// Fetching Pratilipi pages.
Map<String, Page> pratilipiPages = getPages(uriList);
// PratilipiIdList
pratilipiIdList = new ArrayList<>(uriList.size());
for (int i = 0; i < uriList.size(); i++) {
Page page = pratilipiPages.get(uriList.get(i));
if (page != null && page.getType() == PageType.PRATILIPI && !pratilipiIdList.contains(page.getPrimaryContentId()))
pratilipiIdList.add(page.getPrimaryContentId());
}
if (!WHITELIST_LISTNAME.contains(listName)) {
logger.log(Level.INFO, "Reshuffling List");
Collections.shuffle(pratilipiIdList, new Random());
}
memcache.put(pratilipiIdListMemcacheId, (ArrayList<Long>) pratilipiIdList, SystemProperty.STAGE == SystemProperty.STAGE_PROD ? 60 : 360);
}
// Getting UserPratilipiList
Long userId = AccessTokenFilter.getAccessToken().getUserId();
if (userId != 0L) {
String userContentsReadListMemcacheId = "DataStore.User-ContentsRead-list." + userId;
ArrayList<Long> userContentsReadList = memcache.get(userContentsReadListMemcacheId);
if (userContentsReadList == null) {
userContentsReadList = new ArrayList<>();
List<UserPratilipi> userPratilipiList = getUserPratilipiList(userId, null, null, null).getDataList();
// For better performance, new index is required with userId and lastOpenedDate filters.
for (UserPratilipi userPratilipi : userPratilipiList) {
if (userPratilipi.getLastOpenedDate() != null)
userContentsReadList.add(userPratilipi.getPratilipiId());
}
memcache.put(userContentsReadListMemcacheId, (ArrayList<Long>) userContentsReadList, SystemProperty.STAGE == SystemProperty.STAGE_PROD ? 60 : 360);
}
// move all read contents to bottom of the list.
// Find all read contents in the list
userContentsReadList.retainAll(pratilipiIdList);
// Remove already read content from the list
pratilipiIdList.removeAll(userContentsReadList);
// Append read content at end of the list
pratilipiIdList.addAll(userContentsReadList);
}
offset = (cursorStr == null ? 0 : Integer.parseInt(cursorStr)) + (offset == null || offset < 0 ? 0 : offset);
offset = Math.min(offset, pratilipiIdList.size());
resultCount = resultCount == null || resultCount > pratilipiIdList.size() - offset ? pratilipiIdList.size() - offset : resultCount;
List<T> responseList = idOnly ? (List<T>) pratilipiIdList.subList(offset, offset + resultCount) : (List<T>) getPratilipiList(pratilipiIdList.subList(offset, offset + resultCount));
return new DataListCursorTuple<T>(responseList, offset + resultCount + "", (long) pratilipiIdList.size());
}
}
use of com.pratilipi.data.type.Page in project pratilipi by Pratilipi.
the class AuthorDataUtil method createAuthorDataList.
public static List<AuthorData> createAuthorDataList(List<Long> authorIdList, boolean includeUserData) {
DataAccessor dataAccessor = DataAccessorFactory.getDataAccessor();
List<Author> authorList = dataAccessor.getAuthorList(authorIdList);
Map<Long, Page> authorPages = dataAccessor.getPages(PageType.AUTHOR, authorIdList);
List<AuthorData> authorDataList = new ArrayList<>(authorIdList.size());
if (includeUserData) {
List<Long> userIdList = new ArrayList<>(authorIdList.size());
for (Author author : authorList) if (author.getUserId() != null)
userIdList.add(author.getUserId());
List<User> userList = dataAccessor.getUserList(userIdList);
Map<Long, User> users = new HashMap<>(userIdList.size());
for (User user : userList) users.put(user.getId(), user);
for (Author author : authorList) authorDataList.add(createAuthorData(author, authorPages.get(author.getId()), users.get(author.getUserId())));
} else {
for (Author author : authorList) authorDataList.add(createAuthorData(author, authorPages.get(author.getId())));
}
return authorDataList;
}
use of com.pratilipi.data.type.Page in project pratilipi by Pratilipi.
the class AuthorDataUtil method getRecommendedAuthorList.
public static DataListCursorTuple<AuthorData> getRecommendedAuthorList(Long userId, Language language, String cursorStr, Integer resultCount) throws UnexpectedServerException {
DataAccessor dataAccessor = DataAccessorFactory.getDataAccessor();
DocAccessor docAccessor = DataAccessorFactory.getDocAccessor();
UserFollowsDoc followsDoc = docAccessor.getUserFollowsDoc(userId);
// Authors to ignore = Authors Following + Authors Ignored
List<Long> authorIdsToIgnore = new ArrayList<Long>();
if (followsDoc != null) {
for (UserAuthorDoc userAuthorDoc : followsDoc.getFollows(UserFollowState.FOLLOWING)) authorIdsToIgnore.add(userAuthorDoc.getAuthorId());
for (UserAuthorDoc userAuthorDoc : followsDoc.getFollows(UserFollowState.IGNORED)) if (new Date().getTime() - userAuthorDoc.getFollowDate().getTime() >= TimeUnit.DAYS.toMillis(30))
authorIdsToIgnore.add(userAuthorDoc.getAuthorId());
}
// Get global list of recommended authors
List<Long> recommendedList = _getRecommendAuthorGlobalList(language);
// If cursor is passed, drop all items up till cursor
Long cursor = cursorStr == null ? null : Long.parseLong(cursorStr);
if (cursor != null && recommendedList.contains(cursor))
while (!recommendedList.remove(0).equals(cursor)) continue;
// Remove Author ids to be ignored
recommendedList.removeAll(authorIdsToIgnore);
// Drop items if recommendedList size is requested count
if (resultCount != null)
recommendedList = recommendedList.subList(0, Math.min(resultCount, recommendedList.size()));
Map<Long, Author> authors = dataAccessor.getAuthors(recommendedList);
Map<Long, Page> authorPages = dataAccessor.getPages(PageType.AUTHOR, recommendedList);
List<AuthorData> recommendAuthorData = new ArrayList<>(recommendedList.size());
for (Long authorId : recommendedList) recommendAuthorData.add(createAuthorData(authors.get(authorId), authorPages.get(authorId)));
Collections.shuffle(recommendAuthorData);
return new DataListCursorTuple<AuthorData>(recommendAuthorData, recommendedList.isEmpty() ? null : recommendedList.get(recommendedList.size() - 1).toString());
}
use of com.pratilipi.data.type.Page in project pratilipi by Pratilipi.
the class AuthorDataUtil method createOrUpdateAuthorDashboardPageUrl.
public static boolean createOrUpdateAuthorDashboardPageUrl(Long authorId) {
DataAccessor dataAccessor = DataAccessorFactory.getDataAccessor();
Page page = dataAccessor.getPage(PageType.AUTHOR, authorId);
Page dashboardPage = dataAccessor.getPage(PageType.AUTHOR_DASHBOARD, authorId);
if (dashboardPage == null) {
dashboardPage = dataAccessor.newPage();
dashboardPage.setType(PageType.AUTHOR_DASHBOARD);
dashboardPage.setUri(page.getUri() + "/dashboard");
dashboardPage.setPrimaryContentId(authorId);
dashboardPage.setCreationDate(new Date());
if (page.getUriAlias() == null)
dashboardPage = dataAccessor.createOrUpdatePage(dashboardPage);
}
if (page.getUriAlias() == null) {
if (dashboardPage.getUriAlias() == null)
return false;
dashboardPage.setUriAlias(null);
} else {
String uriAlias = page.getUriAlias() + "/dashboard";
if (uriAlias.equals(dashboardPage.getUriAlias()))
return false;
dashboardPage.setUriAlias(uriAlias);
}
dashboardPage = dataAccessor.createOrUpdatePage(dashboardPage);
return true;
}
use of com.pratilipi.data.type.Page in project pratilipi by Pratilipi.
the class AuthorDataUtil method createOrUpdateAuthorPageUrl.
public static boolean createOrUpdateAuthorPageUrl(Long authorId) {
DataAccessor dataAccessor = DataAccessorFactory.getDataAccessor();
Author author = dataAccessor.getAuthor(authorId);
Page page = dataAccessor.getPage(PageType.AUTHOR, authorId);
boolean isNew = page == null;
boolean isChanged = false;
if (isNew) {
page = dataAccessor.newPage();
page.setType(PageType.AUTHOR);
page.setUri(PageType.AUTHOR.getUrlPrefix() + authorId);
page.setPrimaryContentId(authorId);
page.setCreationDate(new Date());
}
if (author.getState() == AuthorState.DELETED) {
if (page.getUriAlias() == null) {
if (!isNew)
return false;
} else {
page.setUriAlias(null);
isChanged = true;
}
} else if (page.getUriAlias() == null) {
// Static Author page urls
String uriAlias = UriAliasUtil.generateUriAlias(page.getUriAlias(), "/", author.getFirstNameEn(), author.getLastNameEn(), author.getPenNameEn());
// if( ! isNew ) {
// if( uriAlias == page.getUriAlias()
// || ( uriAlias != null && uriAlias.equals( page.getUriAlias() ) )
// || ( page.getUriAlias() != null && page.getUriAlias().equals( uriAlias ) ) )
// return false;
// }
logger.log(Level.INFO, "Updating Author Page Url: '" + page.getUriAlias() + "' -> '" + uriAlias + "'");
page.setUriAlias(uriAlias);
isChanged = true;
}
if (isNew || isChanged)
page = dataAccessor.createOrUpdatePage(page);
return true;
}
Aggregations