Search in sources :

Example 11 with Page

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());
    }
}
Also used : ArrayList(java.util.ArrayList) Page(com.pratilipi.data.type.Page) Cursor(com.google.appengine.api.datastore.Cursor) UserPratilipi(com.pratilipi.data.type.UserPratilipi) Random(java.util.Random) PratilipiEntity(com.pratilipi.data.type.gae.PratilipiEntity) UserPratilipiEntity(com.pratilipi.data.type.gae.UserPratilipiEntity) InputStream(java.io.InputStream) IOException(java.io.IOException) Key(com.googlecode.objectify.Key)

Example 12 with Page

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;
}
Also used : User(com.pratilipi.data.type.User) HashMap(java.util.HashMap) DataAccessor(com.pratilipi.data.DataAccessor) ArrayList(java.util.ArrayList) Page(com.pratilipi.data.type.Page) AuthorData(com.pratilipi.data.client.AuthorData) Author(com.pratilipi.data.type.Author)

Example 13 with Page

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());
}
Also used : UserAuthorDoc(com.pratilipi.data.type.UserAuthorDoc) DataAccessor(com.pratilipi.data.DataAccessor) DocAccessor(com.pratilipi.data.DocAccessor) ArrayList(java.util.ArrayList) Page(com.pratilipi.data.type.Page) Date(java.util.Date) DataListCursorTuple(com.pratilipi.data.DataListCursorTuple) AuthorData(com.pratilipi.data.client.AuthorData) Author(com.pratilipi.data.type.Author) UserFollowsDoc(com.pratilipi.data.type.UserFollowsDoc)

Example 14 with Page

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;
}
Also used : DataAccessor(com.pratilipi.data.DataAccessor) Page(com.pratilipi.data.type.Page) Date(java.util.Date)

Example 15 with Page

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;
}
Also used : DataAccessor(com.pratilipi.data.DataAccessor) Author(com.pratilipi.data.type.Author) Page(com.pratilipi.data.type.Page) Date(java.util.Date)

Aggregations

Page (com.pratilipi.data.type.Page)37 DataAccessor (com.pratilipi.data.DataAccessor)28 ArrayList (java.util.ArrayList)12 Pratilipi (com.pratilipi.data.type.Pratilipi)10 Author (com.pratilipi.data.type.Author)8 Date (java.util.Date)8 HashMap (java.util.HashMap)7 UserPratilipi (com.pratilipi.data.type.UserPratilipi)6 JsonObject (com.google.gson.JsonObject)5 InvalidArgumentException (com.pratilipi.common.exception.InvalidArgumentException)5 GenericResponse (com.pratilipi.api.shared.GenericResponse)4 UnexpectedServerException (com.pratilipi.common.exception.UnexpectedServerException)4 Event (com.pratilipi.data.type.Event)4 LinkedList (java.util.LinkedList)4 Gson (com.google.gson.Gson)3 Post (com.pratilipi.api.annotation.Post)3 DocAccessor (com.pratilipi.data.DocAccessor)3 AuthorData (com.pratilipi.data.client.AuthorData)3 BlogPost (com.pratilipi.data.type.BlogPost)3 PratilipiV2Api (com.pratilipi.api.impl.pratilipi.PratilipiV2Api)2