Relazioni tra documenti

cancel
Showing results for 
Search instead for 
Did you mean: 
fedemori
Member II

Relazioni tra documenti

Ciao,
devo associare più allegati ad un documento principale. L'associazione funziona ma è molto lenta e di conseguenza, più allegati ci sono, più sono grandi e più è lenta questa funzionalità.
Come posso risolvere il problema?
In seguito il codice

public static void updateDocumentRelated(Session session, String root, String sourceObjectId, String targetObjectId,long idRepositoryPrincipale,long idRepositoryAllegato) throws Exception {
      
      Document doc = getDocumentInFolderByidRepository(session, idRepositoryPrincipale, root);
       if (doc==null){
          throw new Exception("Il documento con idRepository " + idRepositoryPrincipale + " non è stato trovato su Alfresco");
       }
      
       //Estraggo tutti i figli del documento principale
      
       ObjectType typeDefinition = session.getTypeDefinition("R:documento:related");
       OperationContext operationContext = session.createOperationContext();
       RelationshipDirection direction = RelationshipDirection.SOURCE;
       ItemIterable<Relationship> relationships = session.getRelationships(doc,true, direction, typeDefinition, operationContext);
      
      
      //Creo la relazione bilaterale
      
      Map relProps = new HashMap();
      
      
      
      //Dall'allegato verso il documento principale
      relProps = new HashMap();
      relProps.put("cmis:sourceId", targetObjectId);
      relProps.put("cmis:targetId", sourceObjectId);
      relProps.put("cmis:objectTypeId", "R:docarea:related");
      session.createRelationship(relProps, null, null, null);
      
      
      //Collego anche il documento allegato ad ogni fratello
      //che non sia stato già collegato
      
      
      
       if (relationships==null ) {
           //Dal documento principale verso l'allegato
          
          relProps = new HashMap();
         relProps.put("cmis:sourceId", sourceObjectId);
         relProps.put("cmis:targetId", targetObjectId);
         relProps.put("cmis:objectTypeId", "R:docarea:related");
         session.createRelationship(relProps, null, null, null);
         
          return;
       }
      
       Document docAllegato = getDocumentInFolderByidRepository(session, idRepositoryAllegato, root);
       ItemIterable<Relationship> brotherships = session.getRelationships(docAllegato,true, direction, typeDefinition, operationContext);
      
       for (Relationship relationship : relationships) {
           
            Document relatedDocument = (Document) relationship.getTarget();
           
           
   
           //Dall'allegato verso i fratelli se non sono già presenti
           
           
            boolean esiste = false;
            if (brotherships!=null ){
                for (Relationship brothership : brotherships) {
                    Document brotherDocument = (Document) brothership.getTarget();
                    if (brotherDocument.getId().equals(relatedDocument.getId())) {
                       esiste = true;
                       break;
                    }
                 }
            }

            if (!esiste){
               
                relProps = new HashMap();
              relProps.put("cmis:sourceId", targetObjectId);
              relProps.put("cmis:targetId", relatedDocument.getId());
              relProps.put("cmis:objectTypeId", "R:docarea:related");
              session.createRelationship(relProps, null, null, null);
              
              //Riporto anche il documento sui fratelli
               relProps = new HashMap();
                 relProps.put("cmis:sourceId", relatedDocument.getId());
                 relProps.put("cmis:targetId", targetObjectId);
                 relProps.put("cmis:objectTypeId", "R:docarea:related");
                 session.createRelationship(relProps, null, null, null);
              
              
            }

           

        }
      
       //Dal documento principale verso l'allegato
      
      relProps = new HashMap();
      relProps.put("cmis:sourceId", sourceObjectId);
      relProps.put("cmis:targetId", targetObjectId);
      relProps.put("cmis:objectTypeId", "R:docarea:related");
      session.createRelationship(relProps, null, null, null);
      
      
      
      

   }
2 Replies
openpj
Moderator
Moderator

Re: Relazioni tra documenti

Il motore di associazione di Alfresco è basato essenzialmente sull'utilizzo del database, in pratica le associazioni non vengono indicizzate. Questo infatti può impattare sulle performance.

Le soluzioni possibili sono due:
1. Tuning del database e del connection pool
2. Tuning della cache
3. Modellazione dell'associazione tramite content model


La soluzione 2 è attuabile solo su sistemi a 64bit e con molta memoria disponibile, potresti fare qualche iterazione di tuning provando ad incrementare i valori della cache del 50% di volta in volta.

La soluzione 3, ovvero la modellazione dell'associazione è la soluzione più radicale e che ti permetterebbe di indicizzare tutte le associazioni. In questo caso le performance ovviamente saranno sempre eccellenti.

La soluzione 1 non è sempre praticabile poiché dipende fortemente dall'ambiente.
fedemori
Member II

Re: Relazioni tra documenti

ok grazie, come si fa a modellare l'associazione? Ti posso girare via mail il mio customModel.xml Grazie