public CrossDataStoreProperty(MetaProperty metaProperty, ViewProperty viewProperty) { this.property = metaProperty; this.viewProperty = viewProperty; List<String> relatedProperties = metadataTools.getRelatedProperties(property); relatedPropertyName = relatedProperties.get(0); String pkName = metadataTools.getPrimaryKeyName(property.getRange().asClass()); primaryKeyName = pkName != null ? pkName : "id"; // sensible default for non-persistent entities }
/** * @return list of related properties defined in {@link com.haulmont.chile.core.annotations.MetaProperty#related()} * or empty list */ public List<String> getRelatedProperties(Class<?> entityClass, String property) { checkNotNullArgument(entityClass, "entityClass is null"); MetaClass metaClass = metadata.getClassNN(entityClass); return getRelatedProperties(metaClass.getPropertyNN(property)); }
/** * If the given property is a reference to an entity from different data store, returns the name of a persistent * property which stores the identifier of the related entity. * * @param thisStore name of a base data store * @param metaProperty property * @return name of the ID property or null if the given property is not a cross-datastore reference or it does not * satisfy the convention of declaring related properties for such references */ @Nullable public String getCrossDataStoreReferenceIdProperty(String thisStore, MetaProperty metaProperty) { checkNotNullArgument(metaProperty, "metaProperty is null"); if (!metaProperty.getRange().isClass()) return null; String propStore = getStoreName(metaProperty.getRange().asClass()); if (Objects.equals(thisStore, propStore)) return null; List<String> relatedProperties = getRelatedProperties(metaProperty); if (relatedProperties.size() == 1) return relatedProperties.get(0); else return null; }
private void traverseView(View view, Map<Class<? extends Entity>, List<CrossDataStoreProperty>> crossPropertiesMap, Set<View> visited) { if (visited.contains(view)) return; visited.add(view); String storeName = metadataTools.getStoreName(metaClass); Class<? extends Entity> entityClass = view.getEntityClass(); for (ViewProperty viewProperty : view.getProperties()) { MetaProperty metaProperty = metadata.getClassNN(entityClass).getPropertyNN(viewProperty.getName()); if (metaProperty.getRange().isClass()) { MetaClass propertyMetaClass = metaProperty.getRange().asClass(); if (!Objects.equals(metadataTools.getStoreName(propertyMetaClass), storeName)) { List<String> relatedProperties = metadataTools.getRelatedProperties(metaProperty); if (relatedProperties.size() == 0) { continue; } if (relatedProperties.size() > 1) { log.warn("More than 1 related property is defined for attribute {}, skip handling cross-datastore reference", metaProperty); continue; } List<CrossDataStoreProperty> crossProperties = crossPropertiesMap.computeIfAbsent(entityClass, k -> new ArrayList<>()); if (crossProperties.stream().noneMatch(aProp -> aProp.property == metaProperty)) crossProperties.add(new CrossDataStoreProperty(metaProperty, viewProperty)); } View propertyView = viewProperty.getView(); if (propertyView != null) { traverseView(propertyView, crossPropertiesMap, visited); } } } }
} else { List<String> relProperties = metadata.getTools().getRelatedProperties(propertyPath.getMetaProperty()); if (!relProperties.isEmpty()) { List<String> sortPropertiesList = new ArrayList<>(relProperties.size());
/** * Determine whether the given metaProperty relates to at least one non local property */ protected boolean isRelatedToNonLocalProperty(MetaProperty metaProperty) { MetaClass metaClass = metaProperty.getDomain(); for (String relatedProperty : metadata.getTools().getRelatedProperties(metaProperty)) { //noinspection ConstantConditions if (metaClass.getProperty(relatedProperty).getRange().isClass()) { return true; } } return false; }
protected void setSortDirection(LoadContext.Query q) { boolean asc = Sortable.Order.ASC.equals(sortInfos[0].getOrder()); MetaPropertyPath propertyPath = sortInfos[0].getPropertyPath(); String[] sortProperties = null; if (metadata.getTools().isPersistent(propertyPath)) { sortProperties = getSortPropertiesForPersistentAttribute(propertyPath); } else { // a non-persistent attribute List<String> relProperties = metadata.getTools().getRelatedProperties(propertyPath.getMetaProperty()); if (!relProperties.isEmpty()) { List<String> sortPropertiesList = new ArrayList<>(relProperties.size()); for (String relProp : relProperties) { String[] ppCopy = Arrays.copyOf(propertyPath.getPath(), propertyPath.getPath().length); ppCopy[ppCopy.length - 1] = relProp; MetaPropertyPath relPropertyPath = propertyPath.getMetaProperties()[0].getDomain().getPropertyPath(Joiner.on(".").join(ppCopy)); String[] sortPropertiesForRelProperty = getSortPropertiesForPersistentAttribute(relPropertyPath); if (sortPropertiesForRelProperty != null) Collections.addAll(sortPropertiesList, sortPropertiesForRelProperty); } if (!sortPropertiesList.isEmpty()) sortProperties = sortPropertiesList.toArray(new String[sortPropertiesList.size()]); } } if (sortProperties != null && sortProperties.length != 0) { QueryTransformer transformer = QueryTransformerFactory.createTransformer(q.getQueryString()); transformer.replaceOrderBy(!asc, sortProperties); String jpqlQuery = transformer.getResult(); q.setQueryString(jpqlQuery); } }
MetaClass propertyMetaClass = property.getRange().asClass(); if (!Objects.equals(metadataTools.getStoreName(propertyMetaClass), metadataTools.getStoreName(metaClass))) { List<String> relatedProperties = metadataTools.getRelatedProperties(property); if (relatedProperties.size() == 0) { continue;
List<String> relatedProperties = metadataTools.getRelatedProperties(metaProperty); if (relatedProperties.isEmpty()) { return true;
protected void addAttributesToMinimalView(MetaClass metaClass, View view, ViewInfo info, Set<ViewInfo> visited) { Collection<MetaProperty> metaProperties = metadata.getTools().getNamePatternProperties(metaClass, true); for (MetaProperty metaProperty : metaProperties) { if (metadata.getTools().isPersistent(metaProperty)) { addPersistentAttributeToMinimalView(metaClass, visited, info, view, metaProperty); } else { List<String> relatedProperties = metadata.getTools().getRelatedProperties(metaProperty); for (String relatedPropertyName : relatedProperties) { MetaProperty relatedProperty = metaClass.getPropertyNN(relatedPropertyName); if (metadata.getTools().isPersistent(relatedProperty)) { addPersistentAttributeToMinimalView(metaClass, visited, info, view, relatedProperty); } else { log.warn( "Transient attribute '{}' is listed in 'related' properties of another transient attribute '{}'", relatedPropertyName, metaProperty.getName()); } } } } }
List<String> relatedProperties = metadataTools.getRelatedProperties(entityClass, propertyName); for (String relatedProperty : relatedProperties) { MetaProperty relatedMetaProp = metaClass.getPropertyNN(relatedProperty);