private boolean isAJoinColumn(AssociationKey key) { AssociationKeyMetadata metadata = key.getMetadata(); if ( AssociationKind.EMBEDDED_COLLECTION.equals( metadata.getAssociationKind() ) ) { return false; } AssociatedEntityKeyMetadata entityKeyMetadata = metadata.getAssociatedEntityKeyMetadata(); return metadata.getTable().equals( entityKeyMetadata.getEntityKeyMetadata().getTable() ); }
@Override public void setRows(Object rows) { EntityDocument entity = getEntity(); if ( isEmpty( rows ) ) { entity.unset( associationKeyMetadata.getCollectionRole() ); } else { entity.unset( associationKeyMetadata.getCollectionRole() ); if ( associationKeyMetadata.getAssociationType() == AssociationType.ONE_TO_ONE && rows instanceof Collection ) { Object value = ( (Collection<?>) rows ).iterator().next(); entity.set( associationKeyMetadata.getCollectionRole(), value ); } else { entity.set( associationKeyMetadata.getCollectionRole(), rows ); } } }
private void validateAssociationNames(Iterable<AssociationKeyMetadata> allAssociationKeyMetadata) { for ( AssociationKeyMetadata associationKeyMetadata : allAssociationKeyMetadata ) { validateAsMongoDBCollectionName( associationKeyMetadata.getTable() ); for ( String column : associationKeyMetadata.getRowKeyColumnNames() ) { validateAsMongoDBFieldName( column ); } } }
public static AssociationStorageStrategy getInstance(AssociationKeyMetadata keyMetadata, AssociationStorageType associationStorage, AssociationDocumentStorageType associationDocumentStorage) { if ( keyMetadata.getAssociationType() == AssociationType.ONE_TO_ONE || keyMetadata.getAssociationKind() == AssociationKind.EMBEDDED_COLLECTION || associationStorage == AssociationStorageType.IN_ENTITY ) { return IN_ENTITY; } else if ( associationDocumentStorage == AssociationDocumentStorageType.COLLECTION_PER_ASSOCIATION ) { return COLLECTION_PER_ASSOCIATION; } else { return GLOBAL_COLLECTION; } } }
/** * @param associationMetadata * @return index column name for indexed embedded collections or null for collections without index */ private String findIndexColumnName(AssociationKeyMetadata associationMetadata) { String indexColumnName = null; if ( associationMetadata.getAssociationType() == AssociationType.SET || associationMetadata.getAssociationType() == AssociationType.BAG ) { // String cols[] = associationMetadata.getColumnsWithoutKeyColumns( // Arrays.asList( associationMetadata.getRowKeyColumnNames() ) // ); } else { if ( associationMetadata.getRowKeyIndexColumnNames().length > 1 ) { throw new UnsupportedOperationException( "Multiple index columns not implemented yet" ); } indexColumnName = associationMetadata.getRowKeyIndexColumnNames()[0]; } return indexColumnName; }
public IgniteCache<Object, BinaryObject> getAssociationCache(AssociationKeyMetadata keyMetadata) { return keyMetadata.getAssociationKind() == AssociationKind.EMBEDDED_COLLECTION ? getEntityCache( keyMetadata.getEntityKeyMetadata() ) : getEntityCache( keyMetadata.getTable() ); }
if ( key.getMetadata().isInverse() ) { return; if ( key.getMetadata().getAssociationKind() == AssociationKind.ASSOCIATION ) { Map<Object, BinaryObject> changedObjects = new HashMap<>(); Set<Object> removedObjects = new HashSet<>(); for ( String columnName : key.getMetadata().getRowKeyIndexColumnNames() ) { clearBoBuilder.removeField( columnName ); boolean hasChanges = false; for ( String columnName : currentStateTuple.getColumnNames() ) { if ( key.getMetadata().getAssociatedEntityKeyMetadata().getEntityKeyMetadata().isKeyColumn( columnName ) ) { continue; putBoBuilder = provider.createBinaryObjectBuilder( provider.getEntityTypeName( key.getMetadata().getTable() ) ); if ( key.getMetadata().getAssociatedEntityKeyMetadata().getEntityKeyMetadata().isKeyColumn( columnName ) ) { continue; else if ( key.getMetadata().getAssociationKind() == AssociationKind.EMBEDDED_COLLECTION ) { String indexColumnName = findIndexColumnName( key.getMetadata() ); boolean searchByValue = indexColumnName == null; BinaryObject binaryObject = associationCache.get( id ); Contracts.assertNotNull( binaryObject, "binaryObject" ); String column = StringHelper.realColumnName( key.getMetadata().getCollectionRole() ); EntityKeyMetadata itemMetadata = key.getMetadata().getAssociatedEntityKeyMetadata().getEntityKeyMetadata();
String rowKeyIndexColumn = associationKey.getMetadata().getRowKeyIndexColumnNames()[0]; List<Document> rows = new ArrayList<Document>(); .getAssociatedEntityKeyMetadata() .getAssociationKeyColumns(); prefix = prefix == null ? "" : prefix + "."; String embeddedValueColumnPrefix = associationKey.getMetadata().getCollectionRole() + EMBEDDABLE_COLUMN_PREFIX; for ( String column : associationKey.getMetadata().getAssociatedEntityKeyMetadata().getAssociationKeyColumns() ) { column.substring( associationKey.getMetadata().getCollectionRole().length() + 1 ), ( (Document) mapRow ).get( column.substring( embeddedValueColumnPrefix.length() ) ) ); row.put( associationKey.getMetadata().getAssociatedEntityKeyMetadata().getAssociationKeyColumns()[0], mapRow );
@Override public void removeAssociation(AssociationKey key, AssociationContext associationContext) { if ( key.getMetadata().isInverse() ) { return; if ( key.getMetadata().getAssociationKind() == AssociationKind.ASSOCIATION ) { QueryHints.Builder hintsBuilder = new QueryHints.Builder(); Boolean isCollocated = associationContext.getAssociationTypeContext().getOptionsContext().getUnique( CollocatedAssociationOption.class ); if ( clearBo != null ) { BinaryObjectBuilder clearBoBuilder = provider.createBinaryObjectBuilder( clearBo ); for ( String columnName : key.getMetadata().getRowKeyColumnNames() ) { clearBoBuilder.removeField( StringHelper.realColumnName( columnName ) ); else if ( key.getMetadata().getAssociationKind() == AssociationKind.EMBEDDED_COLLECTION ) { Object id = ( (IgniteTupleSnapshot) associationContext.getEntityTuplePointer().getTuple().getSnapshot() ).getCacheKey(); BinaryObject binaryObject = associationCache.get( id ); Contracts.assertNotNull( binaryObject, "binaryObject" ); BinaryObjectBuilder binaryObjectBuilder = provider.createBinaryObjectBuilder( binaryObject ); binaryObjectBuilder.removeField( key.getMetadata().getCollectionRole() ); binaryObject = binaryObjectBuilder.build(); associationCache.put( id, binaryObject );
private void initializeAssociations(SchemaDefinitionContext context, IgniteDatastoreProvider igniteDatastoreProvider) { for ( AssociationKeyMetadata associationKeyMetadata : context.getAllAssociationKeyMetadata() ) { log.debugf( "initializeAssociations. associationKeyMetadata: %s", associationKeyMetadata ); if ( associationKeyMetadata.getAssociationKind() != AssociationKind.EMBEDDED_COLLECTION && IgniteAssociationSnapshot.isThirdTableAssociation( associationKeyMetadata ) ) { try { try { igniteDatastoreProvider.getAssociationCache( associationKeyMetadata ); } catch (HibernateException ex) { CacheConfiguration config = createCacheConfiguration( associationKeyMetadata, context ); if ( config != null ) { igniteDatastoreProvider.initializeCache( config ); } } } catch (Exception ex) { // just write error to log throw log.unableToInitializeCache( associationKeyMetadata.getTable(), ex ); } } } }
private static void appendRelationshipType(StringBuilder queryBuilder, AssociationKeyMetadata associationKeyMetadata) { escapeIdentifier( queryBuilder, associationKeyMetadata.getCollectionRole() ); }
appendRelationshipType( queryBuilder, associationKeyMetadata ); int offset = ownerEntityKeyMetadata.getColumnNames().length; boolean hasIndexColumns = associationKeyMetadata.getRowKeyIndexColumnNames().length > 0; if ( hasIndexColumns ) { appendProperties( queryBuilder, associationKeyMetadata.getRowKeyIndexColumnNames(), offset ); if ( associationKeyMetadata.getAssociationKind() == AssociationKind.EMBEDDED_COLLECTION ) { queryBuilder.append( ":" ); queryBuilder.append( EMBEDDED ); appendProperties( queryBuilder, associationKeyMetadata.getAssociatedEntityKeyMetadata().getEntityKeyMetadata().getColumnNames(), offset ); if ( associationKeyMetadata.getAssociationKind() == AssociationKind.EMBEDDED_COLLECTION ) { queryBuilder.append( ", e" );
public IgniteEmbeddedAssociationSnapshot(AssociationKey associationKey, Tuple tuple) { this.associationMetadata = associationKey.getMetadata(); this.tuple = tuple; BinaryObject obj = ( (IgniteTupleSnapshot) tuple.getSnapshot() ).getCacheValue(); Object objects[] = obj != null ? (Object[]) obj.field( StringHelper.realColumnName( associationMetadata.getCollectionRole() ) ) : null; rows = new HashMap<>(); if ( objects != null ) { String rowKeyColumnNames[] = new String[ associationMetadata.getRowKeyColumnNames().length ]; for ( int i = 0; i < rowKeyColumnNames.length; i++ ) { rowKeyColumnNames[i] = StringHelper.stringAfterPoint( associationMetadata.getRowKeyColumnNames()[i] ); } for ( int i = 0; i < objects.length; i++ ) { BinaryObject itemObject = (BinaryObject) objects[i]; Object rowKeyColumnValues[] = new Object[rowKeyColumnNames.length]; for ( int j = 0; j < rowKeyColumnNames.length; j++ ) { rowKeyColumnValues[j] = itemObject.field( rowKeyColumnNames[j] ); } RowKey rowKey = new RowKey( associationMetadata.getRowKeyColumnNames(), rowKeyColumnValues ); this.rows.put( rowKey, new IgniteTupleSnapshot( null, itemObject, associationMetadata.getAssociatedEntityKeyMetadata().getEntityKeyMetadata() ) ); } } }
private boolean hasRowIndex(AssociationKey associationKey) { return associationKey.getMetadata().getRowKeyIndexColumnNames().length > 0; }
queryBuilder.append( associationKeyMetadata.isInverse() ? " <-[r:" : " -[r:" ); appendRelationshipType( queryBuilder, relationshipType ); queryBuilder.append( associationKeyMetadata.isInverse() ? "]- " : "]-> " ); if ( associationKeyMetadata.getAssociationKind() == AssociationKind.ASSOCIATION ) { EntityKeyMetadata associatedEntityMetadata = associationKeyMetadata.getAssociatedEntityKeyMetadata().getEntityKeyMetadata(); appendEntityNode( "target", associatedEntityMetadata, queryBuilder, 0, false );
private boolean isRowKeyColumn(AssociationKeyMetadata metadata, String column) { for ( String rowKeyColumn : metadata.getRowKeyColumnNames() ) { if ( rowKeyColumn.equals( column ) ) { return true; } } return false; }
private static boolean isEmbeddedAssociation(AssociationKey key) { return AssociationKind.EMBEDDED_COLLECTION == key.getMetadata().getAssociationKind(); }
/** * Returns the table name of this key. * * @return the table name of this key */ public String getTable() { return metadata.getTable(); }
/** * @param associationMetadata * @return true - is association through third table */ public static boolean isThirdTableAssociation(AssociationKeyMetadata associationMetadata) { return !associationMetadata.getTable().equals( associationMetadata.getAssociatedEntityKeyMetadata().getEntityKeyMetadata().getTable() ); } }
private static String initFindRelationshipQuery(EntityKeyMetadata ownerEntityKeyMetadata, AssociationKeyMetadata associationKeyMetadata) { int offset = 0; StringBuilder queryBuilder = new StringBuilder( "MATCH " ); queryBuilder.append( "(n:" ); queryBuilder.append( ENTITY ); queryBuilder.append( ":" ); appendLabel( ownerEntityKeyMetadata, queryBuilder ); appendProperties( ownerEntityKeyMetadata, queryBuilder ); queryBuilder.append( ") - " ); queryBuilder.append( "[r" ); queryBuilder.append( ":" ); appendRelationshipType( queryBuilder, associationKeyMetadata ); offset = ownerEntityKeyMetadata.getColumnNames().length; if ( associationKeyMetadata.getRowKeyIndexColumnNames().length > 0 ) { appendProperties( queryBuilder, associationKeyMetadata.getRowKeyIndexColumnNames(), offset ); queryBuilder.append( "] - (t" ); } else { queryBuilder.append( "] - (t" ); appendProperties( queryBuilder, associationKeyMetadata.getAssociatedEntityKeyMetadata().getEntityKeyMetadata().getColumnNames(), offset ); } queryBuilder.append( ")" ); queryBuilder.append( " RETURN r" ); return queryBuilder.toString(); }