@Override public String toString() { return toString('_'); } }
/** * Add left outer join on all metadata fields which are passed to this function. * The identifier of the join will be the toString() representation of the metadata field. * The joined metadata fields can then be used to query or sort. * @param query the query string being built. * @param tableIdentifier name of the table to be joined. * @param metadataFields names of the desired fields. */ protected void addMetadataLeftJoin(StringBuilder query, String tableIdentifier, Collection<MetadataField> metadataFields) { for (MetadataField metadataField : metadataFields) { query.append(" left join ").append(tableIdentifier).append(".metadata ").append(metadataField.toString()); query.append(" WITH ").append(metadataField.toString()).append(".metadataField.id").append(" = :") .append(metadataField.toString()); } }
@Override public String makeFieldKey(MetadataField metadataField) { init(); return metadataField.toString(); }
@Override public List<Group> findByMetadataField(Context context, String searchValue, MetadataField metadataField) throws SQLException { StringBuilder queryBuilder = new StringBuilder(); String groupTableName = "g"; queryBuilder.append("SELECT ").append(groupTableName).append(" FROM Group as ").append(groupTableName); addMetadataLeftJoin(queryBuilder, groupTableName, Collections.singletonList(metadataField)); addMetadataValueWhereQuery(queryBuilder, Collections.singletonList(metadataField), "=", null); Query query = createQuery(context, queryBuilder.toString()); query.setParameter(metadataField.toString(), metadataField.getID()); query.setParameter("queryParam", searchValue); return list(query); }
@Override public Iterator<Item> findBySubmitter(Context context, EPerson eperson, MetadataField metadataField, int limit) throws SQLException { StringBuilder query = new StringBuilder(); query.append("SELECT item FROM Item as item "); addMetadataLeftJoin(query, Item.class.getSimpleName().toLowerCase(), Collections.singletonList(metadataField)); query.append(" WHERE item.inArchive = :in_archive"); query.append(" AND item.submitter =:submitter"); //submissions should sort in reverse by date by default addMetadataSortQuery(query, Collections.singletonList(metadataField), null, Collections.singletonList("desc")); Query hibernateQuery = createQuery(context, query.toString()); hibernateQuery.setParameter(metadataField.toString(), metadataField.getID()); hibernateQuery.setParameter("in_archive", true); hibernateQuery.setParameter("submitter", eperson); hibernateQuery.setMaxResults(limit); return iterate(hibernateQuery); }
for (int i = 0; i < metadataSortFields.size(); i++) { MetadataField metadataField = metadataSortFields.get(i); query.append("STR(").append(metadataField.toString()).append(".value)"); String dir = direction.size() > i ? " " + direction.get(i) : ""; query.append(dir);
if (StringUtils.isNotBlank(operator)) { query.append(" ("); query.append("lower(STR(" + metadataField.toString()).append(".value)) ").append(operator) .append(" lower(:queryParam)"); query.append(")");
@Override public Iterator<Item> findBySubmitter(Context context, EPerson eperson, MetadataField metadataField, int limit) throws SQLException { StringBuilder query = new StringBuilder(); query.append("SELECT item FROM Item as item "); addMetadataLeftJoin(query, Item.class.getSimpleName().toLowerCase(), Collections.singletonList(metadataField)); query.append(" WHERE item.inArchive = :in_archive"); query.append(" AND item.submitter =:submitter"); //submissions should sort in reverse by date by default addMetadataSortQuery(query, Collections.singletonList(metadataField), null, Collections.singletonList("desc")); Query hibernateQuery = createQuery(context, query.toString()); hibernateQuery.setParameter(metadataField.toString(), metadataField.getID()); hibernateQuery.setParameter("in_archive", true); hibernateQuery.setParameter("submitter", eperson); hibernateQuery.setMaxResults(limit); return iterate(hibernateQuery); }
@Override public List<Community> findAllNoParent(Context context, MetadataField sortField) throws SQLException { StringBuilder queryBuilder = new StringBuilder(); queryBuilder.append("SELECT community FROM Community as community "); addMetadataLeftJoin(queryBuilder, Community.class.getSimpleName().toLowerCase(), Arrays.asList(sortField)); addMetadataValueWhereQuery(queryBuilder, Collections.EMPTY_LIST, null, " community.parentCommunities IS EMPTY"); addMetadataSortQuery(queryBuilder, Arrays.asList(sortField), Collections.EMPTY_LIST); Query query = createQuery(context, queryBuilder.toString()); query.setParameter(sortField.toString(), sortField.getID()); query.setHint("org.hibernate.cacheable", Boolean.TRUE); return findMany(context, query); }
@Override public List<Collection> findAll(Context context, MetadataField order, Integer limit, Integer offset) throws SQLException { StringBuilder query = new StringBuilder(); query.append("SELECT ").append(Collection.class.getSimpleName()).append(" FROM Collection as ") .append(Collection.class.getSimpleName()).append(" "); addMetadataLeftJoin(query, Collection.class.getSimpleName(), Arrays.asList(order)); addMetadataSortQuery(query, Arrays.asList(order), null); Query hibernateQuery = createQuery(context, query.toString()); if (offset != null) { hibernateQuery.setFirstResult(offset); } if (limit != null) { hibernateQuery.setMaxResults(limit); } hibernateQuery.setParameter(order.toString(), order.getID()); return list(hibernateQuery); }
@Override public List<Community> findAll(Context context, MetadataField sortField, Integer limit, Integer offset) throws SQLException { StringBuilder queryBuilder = new StringBuilder(); queryBuilder.append("SELECT ").append(Community.class.getSimpleName()).append(" FROM Community as ") .append(Community.class.getSimpleName()).append(" "); addMetadataLeftJoin(queryBuilder, Community.class.getSimpleName(), Arrays.asList(sortField)); addMetadataSortQuery(queryBuilder, Arrays.asList(sortField), Collections.EMPTY_LIST); Query query = createQuery(context, queryBuilder.toString()); if (offset != null) { query.setFirstResult(offset); } if (limit != null) { query.setMaxResults(limit); } query.setParameter(sortField.toString(), sortField.getID()); return list(query); }
@Override public List<Group> findAll(Context context, List<MetadataField> sortMetadataFields, int pageSize, int offset) throws SQLException { StringBuilder queryBuilder = new StringBuilder(); String groupTableName = "g"; queryBuilder.append("SELECT ").append(groupTableName).append(" FROM Group as ").append(groupTableName); addMetadataLeftJoin(queryBuilder, groupTableName, sortMetadataFields); addMetadataSortQuery(queryBuilder, sortMetadataFields, null); Query query = createQuery(context, queryBuilder.toString()); if (pageSize > 0) { query.setMaxResults(pageSize); } if (offset > 0) { query.setFirstResult(offset); } for (MetadataField sortField : sortMetadataFields) { query.setParameter(sortField.toString(), sortField.getID()); } return list(query); }
query.setParameter(metadataField.toString(), metadataField.getID());
protected void addMetadata(MetadataValue metadataValue) { setMetadataModified(); getMetadata().add(metadataValue); addDetails(metadataValue.getMetadataField().toString()); }
@Override public String getLabel(MetadataValue metadataValue, String locale) { return getLabel(metadataValue.getMetadataField().toString(), metadataValue.getAuthority(), locale); }
@Override public List<String> getVariants(MetadataValue metadataValue) { ChoiceAuthority ma = getChoiceAuthorityMap().get(metadataValue.getMetadataField().toString()); if (ma instanceof AuthorityVariantsSupport) { AuthorityVariantsSupport avs = (AuthorityVariantsSupport) ma; return avs.getVariants(metadataValue.getAuthority(), metadataValue.getLanguage()); } return null; }
@Override public void move(Context context, WorkspaceItem source, Collection fromCollection, Collection toCollection) throws DCInputsReaderException { source.setCollection(toCollection); List<MetadataValue> remove = new ArrayList<>(); List<String> diff = Util.differenceInSubmissionFields(fromCollection, toCollection); for (String toRemove : diff) { for (MetadataValue value : source.getItem().getMetadata()) { if (value.getMetadataField().toString('.').equals(toRemove)) { remove.add(value); } } } source.getItem().removeMetadata(remove); }
@Override public void delete(Context context, MetadataField metadataField) throws SQLException, AuthorizeException { // Check authorisation: Only admins may create DC types if (!authorizeService.isAdmin(context)) { throw new AuthorizeException( "Only administrators may modify the metadata registry"); } // Check for existing usages of this field List<MetadataValue> values = null; try { values = metadataValueService.findByField(context, metadataField); } catch (IOException io) { // ignore } // Only remove this field if it is NOT in use (as we don't want to bulk delete metadata values) if (CollectionUtils.isEmpty(values)) { metadataFieldDAO.delete(context, metadataField); } else { throw new IllegalStateException("Metadata field " + metadataField .toString() + " cannot be deleted as it is currently used by one or more objects."); } log.info(LogManager.getHeader(context, "delete_metadata_field", "metadata_field_id=" + metadataField.getID())); }
@Override public void additionalIndex(Context context, DSpaceObject dso, SolrInputDocument document) { if (dso instanceof Item) { Item item = (Item) dso; List<MetadataValue> dcValues = itemService.getMetadata(item, Item.ANY, Item.ANY, Item.ANY, Item.ANY); List<String> toIgnoreMetadataFields = SearchUtils.getIgnoredMetadataFields(item.getType()); for (MetadataValue dcValue : dcValues) { if (!toIgnoreMetadataFields.contains(dcValue.getMetadataField().toString('.'))) { document.addField("a_spell", dcValue.getValue()); } } } } }
protected void copyMetadata(Context context, Item itemNew, Item nativeItem) throws SQLException { List<MetadataValue> md = itemService.getMetadata(nativeItem, Item.ANY, Item.ANY, Item.ANY, Item.ANY); for (MetadataValue aMd : md) { MetadataField metadataField = aMd.getMetadataField(); MetadataSchema metadataSchema = metadataField.getMetadataSchema(); String unqualifiedMetadataField = metadataSchema.getName() + "." + metadataField.getElement(); if (getIgnoredMetadataFields().contains(metadataField.toString('.')) || getIgnoredMetadataFields().contains(unqualifiedMetadataField + "." + Item.ANY)) { //Skip this metadata field continue; } itemService .addMetadata(context, itemNew, metadataField, aMd.getLanguage(), aMd.getValue(), aMd.getAuthority(), aMd.getConfidence()); } }