use of com.yahoo.elide.core.PersistentResource in project elide by yahoo.
the class PersistentResourceFetcher method replaceObjects.
/**
* Replaces a resource, updates given resource and deletes the rest
* belonging to the the same type/relationship family.
* @param context Environment encapsulating graphQL's request environment
* @return set of replaced {@link PersistentResource} object(s)
*/
private ConnectionContainer replaceObjects(Environment context) {
/* sanity check for id and data argument w REPLACE */
if (!context.data.isPresent()) {
throw new BadRequestException("REPLACE must include data argument");
}
if (context.ids.isPresent()) {
throw new BadRequestException("REPLACE must not include ids argument");
}
ConnectionContainer existingObjects = (ConnectionContainer) context.container.processFetch(context);
ConnectionContainer upsertedObjects = upsertObjects(context);
Set<PersistentResource> toDelete = Sets.difference(existingObjects.getPersistentResources(), upsertedObjects.getPersistentResources());
if (!context.isRoot()) {
/* has parent */
toDelete.forEach(item -> context.parentResource.removeRelation(context.field.getName(), item));
} else {
/* is root */
toDelete.forEach(PersistentResource::deleteResource);
}
return upsertedObjects;
}
use of com.yahoo.elide.core.PersistentResource in project elide by yahoo.
the class PersistentResourceFetcher method deleteObjects.
/**
* Deletes a resource.
* @param context Environment encapsulating graphQL's request environment
* @return set of deleted {@link PersistentResource} object(s)
*/
private ConnectionContainer deleteObjects(Environment context) {
/* sanity check for id and data argument w DELETE */
if (context.data.isPresent()) {
throw new BadRequestException("DELETE must not include data argument");
}
if (!context.ids.isPresent()) {
throw new BadRequestException("DELETE must include ids argument");
}
ConnectionContainer connection = (ConnectionContainer) fetchObjects(context);
Set<PersistentResource> toDelete = connection.getPersistentResources();
toDelete.forEach(PersistentResource::deleteResource);
return new ConnectionContainer(Collections.emptySet(), Optional.empty(), connection.getTypeName());
}
use of com.yahoo.elide.core.PersistentResource in project elide by yahoo.
the class PersistentResourceFetcher method upsertObject.
/**
* updates or creates existing/new entities.
* @param entity Resource entity
* @param context The request context
* @return {@link PersistentResource} object
*/
private PersistentResource upsertObject(Entity entity, Environment context) {
Set<Entity.Attribute> attributes = entity.getAttributes();
Optional<String> id = entity.getId();
RequestScope requestScope = entity.getRequestScope();
PersistentResource upsertedResource;
EntityDictionary dictionary = requestScope.getDictionary();
PersistentResource parentResource = entity.getParentResource().map(Entity::toPersistentResource).orElse(null);
if (!id.isPresent()) {
// If the ID is generated, it is safe to assign a temporary UUID. Otherwise the client must provide one.
if (dictionary.isIdGenerated(entity.getEntityClass())) {
// Assign a temporary UUID.
entity.setId();
id = entity.getId();
}
upsertedResource = PersistentResource.createObject(parentResource, context.field.getName(), entity.getEntityClass(), requestScope, id);
} else {
try {
Set<PersistentResource> loadedResource = fetchObject(requestScope, entity.getProjection(), Optional.of(Collections.singletonList(id.get()))).getPersistentResources();
upsertedResource = loadedResource.iterator().next();
// The ID doesn't exist yet. Let's create the object.
} catch (InvalidObjectIdentifierException | InvalidValueException e) {
upsertedResource = PersistentResource.createObject(parentResource, context.field.getName(), entity.getEntityClass(), requestScope, id);
}
}
return updateAttributes(upsertedResource, entity, attributes);
}
use of com.yahoo.elide.core.PersistentResource in project elide by yahoo.
the class PersistentResourceFetcher method fetchRelationship.
/**
* Fetches a relationship for a top-level entity.
*
* @param parentResource Parent object
* @param relationship constructed relationship object with entityProjection
* @param ids List of ids
* @return persistence resource object(s)
*/
public static ConnectionContainer fetchRelationship(PersistentResource<?> parentResource, @NotNull Relationship relationship, Optional<List<String>> ids) {
EntityDictionary dictionary = parentResource.getRequestScope().getDictionary();
Type relationshipClass = dictionary.getParameterizedType(parentResource.getObject(), relationship.getName());
String relationshipType = dictionary.getJsonAliasFor(relationshipClass);
Set<PersistentResource> relationResources;
if (ids.isPresent()) {
relationResources = parentResource.getRelation(ids.get(), relationship).toList(LinkedHashSet::new).blockingGet();
} else {
relationResources = parentResource.getRelationCheckedFiltered(relationship).toList(LinkedHashSet::new).blockingGet();
}
return new ConnectionContainer(relationResources, Optional.ofNullable(relationship.getProjection().getPagination()), relationshipType);
}
use of com.yahoo.elide.core.PersistentResource in project elide by yahoo.
the class CSVExportFormatterTest method testNullResourceToCSV.
@Test
public void testNullResourceToCSV() {
CSVExportFormatter formatter = new CSVExportFormatter(elide, false);
PersistentResource persistentResource = null;
String output = formatter.format(persistentResource, 1);
assertNull(output);
}
Aggregations