Search in sources :

Example 1 with Key

use of com.googlecode.objectify.Key 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 2 with Key

use of com.googlecode.objectify.Key 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 3 with Key

use of com.googlecode.objectify.Key in project pratilipi by Pratilipi.

the class DataAccessorGaeImpl method createOrUpdateEntity.

private <T extends GenericOfyType> T createOrUpdateEntity(T entity, Page page, AuditLog auditLog) {
    if (entity.getKey() == null) {
        if (page == null) {
            Key<T> key = ObjectifyService.ofy().save().entity(entity).now();
            entity.setKey(key);
        } else {
            Map<Key<GenericOfyType>, GenericOfyType> map = ObjectifyService.ofy().save().entities(entity, page).now();
            for (Key<GenericOfyType> key : map.keySet()) map.get(key).setKey(key);
        }
        if (entity.getKey().getName() == null)
            auditLog.setPrimaryContentId(entity.getKey().getId());
        else
            auditLog.setPrimaryContentId(entity.getKey().getName());
        auditLog.setEventDataNew(entity);
        auditLog.setCreationDate(new Date());
        Key<AuditLog> key = ObjectifyService.ofy().save().entity(auditLog).now();
        auditLog.setKey(key);
    } else {
        if (entity.getKey().getName() == null)
            auditLog.setPrimaryContentId(entity.getKey().getId());
        else
            auditLog.setPrimaryContentId(entity.getKey().getName());
        auditLog.setEventDataNew(entity);
        auditLog.setCreationDate(new Date());
        Map<Key<GenericOfyType>, GenericOfyType> map = page == null ? ObjectifyService.ofy().save().entities(entity, auditLog).now() : ObjectifyService.ofy().save().entities(entity, page, auditLog).now();
        for (Key<GenericOfyType> key : map.keySet()) map.get(key).setKey(key);
    }
    if (page != null)
        // Updating additional page memcache ids
        _createOrUpdatePageMemcache(page);
    return entity;
}
Also used : Key(com.googlecode.objectify.Key) Date(java.util.Date) AuditLog(com.pratilipi.data.type.AuditLog) GenericOfyType(com.pratilipi.data.type.GenericOfyType)

Example 4 with Key

use of com.googlecode.objectify.Key in project pratilipi by Pratilipi.

the class PratilipiBackupApi method get.

@Get
public GenericResponse get(GetRequest request) throws UnexpectedServerException {
    DataAccessor dataAccessor = DataAccessorFactory.getDataAccessor();
    // Fetching Cursor from AppProperty
    AppProperty appProperty = dataAccessor.getAppProperty(AppProperty.API_PRATILIPI_BACKUP);
    if (appProperty == null)
        appProperty = dataAccessor.newAppProperty(AppProperty.API_PRATILIPI_BACKUP);
    Cursor cursor = appProperty.getValue() == null ? null : Cursor.fromWebSafeString((String) appProperty.getValue());
    QueryResultIterator<Key<PratilipiEntity>> itr = ObjectifyService.ofy().load().type(PratilipiEntity.class).filter("LAST_UPDATED >=", // Thu Dec 01 00:00:00 IST 2016
    new Date(1480530600000L)).order("LAST_UPDATED").startAt(cursor).keys().iterator();
    int batchSize = 1000;
    List<Task> taskList = new ArrayList<>(batchSize);
    while (itr.hasNext()) {
        TaskQueueFactory.getPratilipiTaskQueue().add(TaskQueueFactory.newTask().setUrl("/pratilipi/backup").addParam("pratilipiId", itr.next().getId() + ""));
        if (taskList.size() == batchSize || !itr.hasNext()) {
            TaskQueueFactory.getPratilipiTaskQueue().addAll(taskList);
            taskList.clear();
        }
    }
    // Updating Cursor to AppProperty
    appProperty.setValue(itr.getCursor().toWebSafeString());
    dataAccessor.createOrUpdateAppProperty(appProperty);
    /*		DataAccessor dataAccessor = DataAccessorFactory.getDataAccessor();
		BlobAccessor blobAccessor = DataAccessorFactory.getBlobAccessorBackup();
		
		Date backupDate = new Date();

		DateFormat dateFormat = new SimpleDateFormat( "yyyy-MM-dd" );
		DateFormat csvDateFormat = new SimpleDateFormat( "yyyy-MM-dd HH:mm" );
		DateFormat dateTimeFormat = new SimpleDateFormat( "yyyy-MM-dd-HH:mm-z" );
		dateFormat.setTimeZone( TimeZone.getTimeZone( "Asia/Kolkata" ) );
		csvDateFormat.setTimeZone( TimeZone.getTimeZone( "Asia/Kolkata" ) );
		dateTimeFormat.setTimeZone( TimeZone.getTimeZone( "Asia/Kolkata" ) );

		StringBuilder backup = new StringBuilder();
		StringBuilder csv = new StringBuilder( CSV_HEADER + LINE_SEPARATOR );

		int count = 0;
		String cursor = null;
		PratilipiFilter pratilipiFilter = new PratilipiFilter();
		Gson gson = new GsonBuilder().registerTypeAdapter( Date.class, new GsonIstDateAdapter() ).create();
		
		while( true ) {
			DataListCursorTuple<Pratilipi> pratilipiListCursorTuple = dataAccessor.getPratilipiList( pratilipiFilter, cursor, 1000 );
			List<Pratilipi> pratilipiList = pratilipiListCursorTuple.getDataList();

			for( Pratilipi pratilipi : pratilipiList ) {
                backup.append( gson.toJson( pratilipi ) + LINE_SEPARATOR );

				if( request.generateCsv != null && request.generateCsv )
					csv.append( "'" + pratilipi.getId() )
							.append( CSV_SEPARATOR ).append( pratilipi.getAuthorId() == null ? "" : "'" + pratilipi.getAuthorId() )
							.append( CSV_SEPARATOR ).append( pratilipi.getTitle()	 == null ? "" : "\"" + pratilipi.getTitle().replace( "\"", "\"\"" ) + "\"" )
							.append( CSV_SEPARATOR ).append( pratilipi.getTitleEn()	 == null ? "" : "\"" + pratilipi.getTitleEn().replace( "\"", "\"\"" ) + "\"" )
							.append( CSV_SEPARATOR ).append( pratilipi.getLanguage() )
							.append( CSV_SEPARATOR ).append( pratilipi.getSummary() != null && pratilipi.getSummary().trim().length() != 0 )
							.append( CSV_SEPARATOR ).append( pratilipi.getType() )
							.append( CSV_SEPARATOR ).append( pratilipi.getContentType() )
							.append( CSV_SEPARATOR ).append( pratilipi.getState() )
							.append( CSV_SEPARATOR ).append( pratilipi.getCoverImage() != null )
							.append( CSV_SEPARATOR ).append( csvDateFormat.format( pratilipi.getListingDate() ) )
							.append( CSV_SEPARATOR ).append( pratilipi.getReviewCount() )
							.append( CSV_SEPARATOR ).append( pratilipi.getRatingCount() )
							.append( CSV_SEPARATOR ).append( pratilipi.getTotalRating() )
							.append( CSV_SEPARATOR ).append( pratilipi.getReadCount() )
							.append( LINE_SEPARATOR );
				
			}
			
			count = count + pratilipiList.size();

			if( pratilipiList.size() < 1000 )
				break;
			else
				cursor = pratilipiListCursorTuple.getCursor();
		}
		

		String fileName = "datastore.pratilipi/"
				+ dateFormat.format( backupDate ) + "/"
				+ "pratilipi-" + dateTimeFormat.format( backupDate );

		BlobEntry pratilipiBackupEntry = blobAccessor.newBlob(
				fileName,
				backup.toString().getBytes( Charset.forName( "UTF-8" ) ),
				"text/plain" );
		
		blobAccessor.createOrUpdateBlob( pratilipiBackupEntry );
		
		
		if( request.generateCsv != null && request.generateCsv ) {
			BlobEntry authorCsvEntry = blobAccessor.newBlob(
					"datastore/pratilipi.csv",
					csv.toString().getBytes( Charset.forName( "UTF-8" ) ),
					"text/csv" );
			blobAccessor.createOrUpdateBlob( authorCsvEntry );
		}
		

		logger.log( Level.INFO, "Backed up " + count + " Pratilipi Entities." );
*/
    return new GenericResponse();
}
Also used : Task(com.pratilipi.taskqueue.Task) PratilipiEntity(com.pratilipi.data.type.gae.PratilipiEntity) GenericResponse(com.pratilipi.api.shared.GenericResponse) DataAccessor(com.pratilipi.data.DataAccessor) ArrayList(java.util.ArrayList) Cursor(com.google.appengine.api.datastore.Cursor) Date(java.util.Date) AppProperty(com.pratilipi.data.type.AppProperty) Key(com.googlecode.objectify.Key) Get(com.pratilipi.api.annotation.Get)

Example 5 with Key

use of com.googlecode.objectify.Key in project pratilipi by Pratilipi.

the class DataAccessorGaeImpl method getUserList.

@SuppressWarnings("unchecked")
private <T> DataListCursorTuple<T> getUserList(String cursorStr, Integer resultCount, boolean idOnly) {
    Query<UserEntity> query = ObjectifyService.ofy().load().type(UserEntity.class);
    if (cursorStr != null)
        query = query.startAt(Cursor.fromWebSafeString(cursorStr));
    if (resultCount != null && resultCount > 0)
        query = query.limit(resultCount);
    List<T> dataList = resultCount == null ? new ArrayList<T>() : new ArrayList<T>(resultCount);
    Cursor cursor = null;
    if (idOnly) {
        QueryResultIterator<Key<UserEntity>> iterator = query.keys().iterator();
        while (iterator.hasNext()) dataList.add((T) (Long) iterator.next().getId());
        cursor = iterator.getCursor();
    } else {
        QueryResultIterator<UserEntity> iterator = query.iterator();
        while (iterator.hasNext()) dataList.add((T) iterator.next());
        cursor = iterator.getCursor();
    }
    return new DataListCursorTuple<T>(dataList, cursor == null ? null : cursor.toWebSafeString());
}
Also used : Cursor(com.google.appengine.api.datastore.Cursor) ConversationUserEntity(com.pratilipi.data.type.gae.ConversationUserEntity) UserEntity(com.pratilipi.data.type.gae.UserEntity) Key(com.googlecode.objectify.Key)

Aggregations

Key (com.googlecode.objectify.Key)6 Cursor (com.google.appengine.api.datastore.Cursor)4 ArrayList (java.util.ArrayList)3 Date (java.util.Date)3 Get (com.pratilipi.api.annotation.Get)2 GenericResponse (com.pratilipi.api.shared.GenericResponse)2 DataAccessor (com.pratilipi.data.DataAccessor)2 AppProperty (com.pratilipi.data.type.AppProperty)2 PratilipiEntity (com.pratilipi.data.type.gae.PratilipiEntity)2 UserEntity (com.pratilipi.data.type.gae.UserEntity)2 Task (com.pratilipi.taskqueue.Task)2 AuditLog (com.pratilipi.data.type.AuditLog)1 GenericOfyType (com.pratilipi.data.type.GenericOfyType)1 Page (com.pratilipi.data.type.Page)1 UserPratilipi (com.pratilipi.data.type.UserPratilipi)1 AuthorEntity (com.pratilipi.data.type.gae.AuthorEntity)1 ConversationUserEntity (com.pratilipi.data.type.gae.ConversationUserEntity)1 UserAuthorEntity (com.pratilipi.data.type.gae.UserAuthorEntity)1 UserPratilipiEntity (com.pratilipi.data.type.gae.UserPratilipiEntity)1 IOException (java.io.IOException)1