Search in sources :

Example 6 with Cursor

use of com.google.appengine.api.datastore.Cursor in project pratilipi by Pratilipi.

the class DataAccessorGaeImpl method _getAuthorList.

@SuppressWarnings("unchecked")
private <T> DataListCursorTuple<T> _getAuthorList(AuthorFilter authorFilter, String cursorStr, Integer resultCount, boolean idOnly) {
    Query<AuthorEntity> query = ObjectifyService.ofy().load().type(AuthorEntity.class);
    if (authorFilter.getLanguage() != null)
        query = query.filter("LANGUAGE", authorFilter.getLanguage());
    if (authorFilter.getState() != null)
        query = query.filter("STATE", authorFilter.getState());
    if (authorFilter.getMinLastUpdated() != null) {
        query = query.filter(authorFilter.isMinLastUpdatedInclusive() ? "LAST_UPDATED >=" : "LAST_UPDATED >", authorFilter.getMinLastUpdated());
        query = query.order("LAST_UPDATED");
    }
    if (authorFilter.getOrderByContentPublished() != null)
        query = query.order(authorFilter.getOrderByContentPublished() ? "CONTENT_PUBLISHED" : "-CONTENT_PUBLISHED");
    if (cursorStr != null)
        query = query.startAt(Cursor.fromWebSafeString(cursorStr));
    if (resultCount != null)
        query = query.limit(resultCount);
    List<T> responseList = resultCount == null ? new ArrayList<T>() : new ArrayList<T>(resultCount);
    Cursor cursor = null;
    if (idOnly) {
        QueryResultIterator<Key<AuthorEntity>> iterator = query.keys().iterator();
        while (iterator.hasNext()) responseList.add((T) (Long) iterator.next().getId());
        cursor = iterator.getCursor();
    } else {
        QueryResultIterator<AuthorEntity> iterator = query.iterator();
        while (iterator.hasNext()) responseList.add((T) iterator.next());
        cursor = iterator.getCursor();
    }
    return new DataListCursorTuple<T>(responseList, cursor == null ? null : cursor.toWebSafeString());
}
Also used : Cursor(com.google.appengine.api.datastore.Cursor) UserAuthorEntity(com.pratilipi.data.type.gae.UserAuthorEntity) AuthorEntity(com.pratilipi.data.type.gae.AuthorEntity) Key(com.googlecode.objectify.Key)

Example 7 with Cursor

use of com.google.appengine.api.datastore.Cursor in project pratilipi by Pratilipi.

the class DataAccessorGaeImpl method getUserPratilipiList.

@Override
public DataListCursorTuple<UserPratilipi> getUserPratilipiList(Long userId, Long pratilipiId, String cursorStr, Integer resultCount, boolean sortByReviewDate) {
    Query<UserPratilipiEntity> query = ObjectifyService.ofy().load().type(UserPratilipiEntity.class);
    if (userId != null)
        query = query.filter("USER_ID", userId);
    if (pratilipiId != null)
        query = query.filter("PRATILIPI_ID", pratilipiId);
    if (cursorStr != null)
        query = query.startAt(Cursor.fromWebSafeString(cursorStr));
    if (resultCount != null && resultCount > 0)
        query = query.limit(resultCount);
    if (sortByReviewDate)
        query = query.order("REVIEW_DATE");
    QueryResultIterator<UserPratilipiEntity> iterator = query.iterator();
    // UserPratilipi List
    ArrayList<UserPratilipi> userPratilipiList = resultCount == null ? new ArrayList<UserPratilipi>() : new ArrayList<UserPratilipi>(resultCount);
    while (iterator.hasNext()) userPratilipiList.add(iterator.next());
    // Cursor
    Cursor cursor = iterator.getCursor();
    return new DataListCursorTuple<UserPratilipi>(userPratilipiList, cursor == null ? null : cursor.toWebSafeString());
}
Also used : UserPratilipi(com.pratilipi.data.type.UserPratilipi) Cursor(com.google.appengine.api.datastore.Cursor) UserPratilipiEntity(com.pratilipi.data.type.gae.UserPratilipiEntity)

Example 8 with Cursor

use of com.google.appengine.api.datastore.Cursor in project pratilipi by Pratilipi.

the class DataAccessorGaeImpl method getAuditLogList.

@Override
public DataListCursorTuple<AuditLog> getAuditLogList(Date minCreationDate, String cursorStr, Integer resultCount) {
    Query<AuditLogEntity> query = ObjectifyService.ofy().load().type(AuditLogEntity.class);
    if (minCreationDate != null) {
        query = query.filter("CREATION_DATE >=", minCreationDate);
        query = query.order("CREATION_DATE");
    }
    if (cursorStr != null)
        query = query.startAt(Cursor.fromWebSafeString(cursorStr));
    if (resultCount != null)
        query = query.limit(resultCount);
    query = query.chunk(resultCount != null && resultCount < 1000 ? resultCount : 1000);
    List<AuditLog> responseList = resultCount == null ? new ArrayList<AuditLog>() : new ArrayList<AuditLog>(resultCount);
    QueryResultIterator<AuditLogEntity> iterator = query.iterator();
    while (iterator.hasNext() && (resultCount == null || responseList.size() != resultCount)) responseList.add(iterator.next());
    Cursor cursor = iterator.getCursor();
    return new DataListCursorTuple<AuditLog>(responseList, cursor == null ? null : cursor.toWebSafeString());
}
Also used : Cursor(com.google.appengine.api.datastore.Cursor) AuditLog(com.pratilipi.data.type.AuditLog) AuditLogEntity(com.pratilipi.data.type.gae.AuditLogEntity)

Example 9 with Cursor

use of com.google.appengine.api.datastore.Cursor in project pratilipi by Pratilipi.

the class DataAccessorGaeImpl method getUserLibrary.

@Override
public DataListCursorTuple<Long> getUserLibrary(Long userId, String cursorStr, Integer offset, Integer resultCount) {
    Query<UserPratilipiEntity> query = ObjectifyService.ofy().load().type(UserPratilipiEntity.class).filter("USER_ID", userId).filter("ADDED_TO_LIB", true);
    if (UxModeFilter.isAndroidApp())
        query = query.order("ADDED_TO_LIB_DATE");
    else
        query = query.order("-ADDED_TO_LIB_DATE");
    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);
    QueryResultIterator<UserPratilipiEntity> iterator = query.iterator();
    // Pratilipi id list
    ArrayList<Long> pratilipiIdList = resultCount == null ? new ArrayList<Long>() : new ArrayList<Long>(resultCount);
    while (iterator.hasNext()) pratilipiIdList.add(iterator.next().getPratilipiId());
    // Cursor
    Cursor cursor = iterator.getCursor();
    return new DataListCursorTuple<Long>(pratilipiIdList, cursor == null ? null : cursor.toWebSafeString());
}
Also used : Cursor(com.google.appengine.api.datastore.Cursor) UserPratilipiEntity(com.pratilipi.data.type.gae.UserPratilipiEntity)

Example 10 with Cursor

use of com.google.appengine.api.datastore.Cursor 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)

Aggregations

Cursor (com.google.appengine.api.datastore.Cursor)14 FetchOptions (com.google.appengine.api.datastore.FetchOptions)4 PreparedQuery (com.google.appengine.api.datastore.PreparedQuery)4 QueryResultList (com.google.appengine.api.datastore.QueryResultList)4 Key (com.googlecode.objectify.Key)4 ArrayList (java.util.ArrayList)4 QueryOptionFetchType (siena.core.options.QueryOptionFetchType)4 QueryOptionOffset (siena.core.options.QueryOptionOffset)4 QueryOptionPage (siena.core.options.QueryOptionPage)4 QueryOptionState (siena.core.options.QueryOptionState)4 QueryResultIterable (com.google.appengine.api.datastore.QueryResultIterable)3 UserAuthorEntity (com.pratilipi.data.type.gae.UserAuthorEntity)3 UserPratilipiEntity (com.pratilipi.data.type.gae.UserPratilipiEntity)3 UserPratilipi (com.pratilipi.data.type.UserPratilipi)2 PratilipiEntity (com.pratilipi.data.type.gae.PratilipiEntity)2 SienaFutureMock (siena.core.async.SienaFutureMock)2 Get (com.pratilipi.api.annotation.Get)1 GenericResponse (com.pratilipi.api.shared.GenericResponse)1 DataAccessor (com.pratilipi.data.DataAccessor)1 AppProperty (com.pratilipi.data.type.AppProperty)1