@Override public String getIdProperty() { return embIdProperty.getName(); }
@Override public String getDefaultOrderBy() { StringBuilder sb = new StringBuilder(); for (int i = 0; i < props.length; i++) { if (i > 0) { sb.append(","); } sb.append(embIdProperty.getName()); sb.append("."); sb.append(props[i].getName()); } return sb.toString(); }
@Override public String getOrderBy(String pathPrefix, boolean ascending) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < props.length; i++) { if (i > 0) { sb.append(", "); } if (pathPrefix != null) { sb.append(pathPrefix).append("."); } sb.append(embIdProperty.getName()).append("."); sb.append(props[i].getName()); if (!ascending) { sb.append(" desc"); } } return sb.toString(); }
@Override public String getAssocOneIdExpr(String prefix, String operator) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < props.length; i++) { if (i > 0) { sb.append(" and "); } if (prefix != null) { sb.append(prefix); sb.append("."); } sb.append(embIdProperty.getName()); sb.append("."); sb.append(props[i].getName()); sb.append(operator); } return sb.toString(); }
@Override public void visitPush(int position) { stack.push(descriptor); BeanPropertyAssocOne<?> embedded = (BeanPropertyAssocOne<?>)descriptor.propertiesIndex[position]; descriptor = embedded.getTargetDescriptor(); newJson.writeStartObject(embedded.getName()); if (oldJson != null) { oldJson.writeStartObject(embedded.getName()); } }
@Override public void buildRawSqlSelectChain(String prefix, List<String> selectChain) { prefix = SplitName.add(prefix, embIdProperty.getName()); for (BeanProperty prop : props) { prop.buildRawSqlSelectChain(prefix, selectChain); } }
/** * Initialise after the target bean descriptors have been all set. */ public void initialisePostTarget() { if (childMasterProperty != null) { BeanProperty masterId = childMasterProperty.getTargetDescriptor().getIdProperty(); if (masterId != null) { // in docstore only, the master-id may be not available childMasterIdProperty = childMasterProperty.getName() + "." + masterId.getName(); } } }
/** * Return the child property that links back to the master bean. * <p> * Note that childMasterProperty will be null if a field is used instead of * a ManyToOne bean association. * </p> */ private BeanPropertyAssocOne<?> initChildMasterProperty() { if (unidirectional) { return null; } // search for the property, to see if it exists Class<?> beanType = descriptor.getBeanType(); BeanDescriptor<?> targetDesc = getTargetDescriptor(); for (BeanPropertyAssocOne<?> prop : targetDesc.propertiesOne()) { if (mappedBy != null) { // match using mappedBy as property name if (mappedBy.equalsIgnoreCase(prop.getName())) { return prop; } } else { // assume only one property that matches parent object type if (prop.getTargetType().equals(beanType)) { // found it, stop search return prop; } } } throw new RuntimeException("Can not find Master [" + beanType + "] in Child[" + targetDesc + "]"); }
/** * We need to create and execute a query to get the foreign key values as * the delete cascades to them (foreign keys). */ private Query<?> deleteRequiresQuery(BeanDescriptor<?> desc, BeanPropertyAssocOne<?>[] propImportDelete, DeleteMode deleteMode) { Query<?> q = server.createQuery(desc.getBeanType()); StringBuilder sb = new StringBuilder(30); for (BeanPropertyAssocOne<?> aPropImportDelete : propImportDelete) { sb.append(aPropImportDelete.getName()).append(","); } q.setAutoTune(false); q.select(sb.toString()); if (deleteMode.isHard() && desc.isSoftDelete()) { // hard delete so we want this query to include logically deleted rows (if any) q.setIncludeSoftDeletes(); } return q; }
@Override void appendFrom(DbSqlContext ctx, SqlJoinType joinType) { String relativePrefix = ctx.getRelativePrefix(property.getName()); if (softDelete && !ctx.isIncludeSoftDelete()) { property.tableJoin.addJoin(joinType, relativePrefix, ctx, softDeletePredicate); } else { property.tableJoin.addJoin(joinType, relativePrefix, ctx); } } }
/** * Append columns for foreign key columns. */ @Override void appendSelect(DbSqlContext ctx, boolean subQuery) { // set appropriate tableAlias for the exported id columns String relativePrefix = ctx.getRelativePrefix(property.getName()); ctx.pushTableAlias(relativePrefix); property.targetIdBinder.appendSelect(ctx, subQuery); ctx.popTableAlias(); }
/** * Append columns for foreign key columns. */ @Override void appendSelect(DbSqlContext ctx, boolean subQuery) { if (!subQuery) { // add discriminator column String relativePrefix = ctx.getRelativePrefix(property.getName()); String tableAlias = ctx.getTableAlias(relativePrefix); ctx.appendColumn(tableAlias, property.targetInheritInfo.getDiscriminatorColumn()); } property.importedId.sqlAppend(ctx); } }
@Override public void addFkeys(String name) { BeanProperty[] embeddedProps = foreignAssocOne.getProperties(); for (int i = 0; i < imported.length; i++) { String n = name + "." + foreignAssocOne.getName() + "." + embeddedProps[i].getName(); BeanFkeyProperty fkey = new BeanFkeyProperty(n, imported[i].localDbColumn, foreignAssocOne.getDeployOrder()); owner.getBeanDescriptor().add(fkey); } }
/** * Execute a query fetching the missing (unloaded) foreign keys. We need to * fetch these key values before the parent bean is deleted. */ void queryForeignKeys() { BeanDescriptor<?> descriptor = request.getBeanDescriptor(); SpiQuery<?> q = (SpiQuery<?>) server.createQuery(descriptor.getBeanType()); Object id = request.getBeanId(); StringBuilder sb = new StringBuilder(30); for (BeanPropertyAssocOne<?> aPropList : propList) { sb.append(aPropList.getName()).append(","); } // run query in a separate persistence context q.setPersistenceContext(new DefaultPersistenceContext()); q.setPersistenceContextScope(PersistenceContextScope.QUERY); q.setAutoTune(false); q.select(sb.toString()); q.setIncludeSoftDeletes(); q.where().idEq(id); SpiTransaction t = request.getTransaction(); if (t.isLogSummary()) { t.logSummary("-- Ebean fetching foreign key values for delete of " + descriptor.getName() + " id:" + id); } beanWithForeignKeys = (EntityBean) server.findOne(q, t); }
/** * Fetch draftable element relationships. */ public void draftQueryOptimise(Query<T> query) { BeanPropertyAssocOne<?>[] one = desc.propertiesOne(); for (BeanPropertyAssocOne<?> anOne : one) { if (anOne.getTargetDescriptor().isDraftableElement()) { query.fetch(anOne.getName()); } } BeanPropertyAssocMany<?>[] many = desc.propertiesMany(); for (BeanPropertyAssocMany<?> aMany : many) { if (aMany.getTargetDescriptor().isDraftableElement()) { query.fetch(aMany.getName()); } } } }
String fkName = determineForeignKeyConstraintName(p.getName()); String fkIndex = determineForeignKeyIndexName(p.getName()); compoundKey = new MCompoundForeignKey(fkName, refTable, fkIndex); table.addForeignKey(compoundKey); String uqName = determineUniqueConstraintName(p.getName()); table.addUniqueConstraint(modelColumns, true, uqName); indexSetAdd(modelColumns);
@Override public void visitPush(int position) { stack.push(descriptor); BeanPropertyAssocOne<?> embedded = (BeanPropertyAssocOne<?>)descriptor.propertiesIndex[position]; descriptor = embedded.getTargetDescriptor(); newJson.writeStartObject(embedded.getName()); if (oldJson != null) { oldJson.writeStartObject(embedded.getName()); } }
/** * Initialise after the target bean descriptors have been all set. */ public void initialisePostTarget() { if (childMasterProperty != null) { BeanProperty masterId = childMasterProperty.getTargetDescriptor().getIdProperty(); if (masterId != null) { // in docstore only, the master-id may be not available childMasterIdProperty = childMasterProperty.getName() + "." + masterId.getName(); } } }
@Override void appendFrom(DbSqlContext ctx, SqlJoinType joinType) { String relativePrefix = ctx.getRelativePrefix(property.getName()); if (softDelete && !ctx.isIncludeSoftDelete()) { property.tableJoin.addJoin(joinType, relativePrefix, ctx, softDeletePredicate); } else { property.tableJoin.addJoin(joinType, relativePrefix, ctx); } } }
@Override public void addFkeys(String name) { BeanProperty[] embeddedProps = foreignAssocOne.getProperties(); for (int i = 0; i < imported.length; i++) { String n = name + "." + foreignAssocOne.getName() + "." + embeddedProps[i].getName(); BeanFkeyProperty fkey = new BeanFkeyProperty(n, imported[i].localDbColumn, foreignAssocOne.getDeployOrder()); owner.getBeanDescriptor().add(fkey); } }