Как удалить повторяющиеся вхождения файла в documentum, если он существует более одного раза, используя запрос dql в java?

Я хочу удалить повторное вхождение файла в documentum, оставив только один файл, если он существует более одного раза.

Ниже приведен мой код.

import com.documentum.fc.client.IDfQuery;
import com.documentum.fc.client.IDfSession;
import com.documentum.fc.client.IDfSessionManager;
import com.documentum.fc.common.DfException;
import com.documentum.fc.common.DfId;
import com.documentum.fc.common.IDfLoginInfo;
import com.documentum.operations.IDfDeleteOperation;

public class CountFiles {

    // Documentum target repository where the files will be imported
    private static final String REPO_NAME = "rep";



    public static void main( String[] args ) throws Exception {

        try {
            String username = "user";
            String password = "pwd";

            System.out.println( "Starting to connect ..." );

            IDfSessionManager sessMgr = createSessionManager( );
            addIdentity( sessMgr, username, password);
            IDfSession sess = sessMgr.getSession(REPO_NAME );
            System.out.println( "Successfully connected to the server.");
            queryDocumentum(sess);


        } catch( Exception ex ) {
            System.out.println( ex );
            ex.printStackTrace( );
        }
    }


    private static void queryDocumentum(IDfSession sess) throws DfException {
    IDfQuery query = new DfQuery();
String queryStr= "select count(*) from dm_document where folder('/XXX/YYY', DESCEND) and object_name = 'abc.pdf' ";
    query.setDQL(queryStr);
    IDfCollection coll = query.execute(sess,IDfQuery.DF_EXEC_QUERY);
    while(coll.next())
    {
      int count = coll.getValueAt(0);
      if(count>1)
      {
       String qry = "delete dm_sysobject (all) objects where object_name='abc.pdf';";

        IDfQuery q= new DfQuery();
        query.setDQL(qry);
        IDfCollection col = query.execute(sess,IDfQuery.DF_EXEC_QUERY);


      }
    }
    coll.close();
}
/**
     * Creates a new session manager instance. The session manager does not have
     * any identities associated with it.
     *
     * @return a new session manager object.
     * @throws DfException
     */
    private static IDfSessionManager createSessionManager( ) 
            throws Exception {
        IDfClientX clientX = new DfClientX( );
        IDfClient localClient = clientX.getLocalClient( );
        IDfSessionManager sessMgr = localClient.newSessionManager( );

        System.out.println( "Created session manager." );

        return sessMgr;
    }

    /**
     * Adds a new identity to the session manager.
     *
     */
    private static void addIdentity( final IDfSessionManager sm, 
            final String username, final String password ) 
            throws Exception {
        IDfClientX clientX = new DfClientX( );

        IDfLoginInfo li = clientX.getLoginInfo( );
        li.setUser( username );
        li.setPassword( password );

        // check if session manager already has an identity.
        // if yes, remove it.
        if( sm.hasIdentity( REPO_NAME ) ) {
            sm.clearIdentity( REPO_NAME );

            System.out.println( "Cleared identity on :" + REPO_NAME );
        }

        sm.setIdentity( REPO_NAME, li );

        System.out.println( "Set up identity for the user." );
    }

}

Но что-то не так в том, как я делаю операцию. Это не работает. Я не указываю здесь путь к файлу, потому что не знаю точного пути к файлу. Без указания пути к файлу можно удалить все вхождения файла, кроме одного.


person Moizudddin    schedule 13.08.2017    source источник


Ответы (2)


Если вы все равно кодируете логику на Java, взгляните на IDfOperatiins. Также этот метод создания объемных вещей хорошо описан в гайдах.

person Henning Winter    schedule 14.08.2017

Я бы предложил следующие изменения в вашем DQL и в логике, это в основном потому, что вы используете API DFC:

ДКЛ:

//Retrieves all the root object ids of the documents version tree where there are duplicates as their name. 
//Here I thought the latest created document is the one to keep, you can adapt it to your needs - **see ORDER by clause**.

    select i_chronicle_id from dm_document where folder('/XXX/YYYY', DESCEND) and object_name in (select object_name from dm_document where folder('/XXX/YYYY', DESCEND) and object_name = 'abc.pdf' group by object_name having count(*) > 1) order by r_creation_date asc;

Логика:

//"pseudo-code" - deletes the entire version tree of the document that is not the last in the returned list
while 'not last i_chronicle_id from the result collection' 
     //execute this dql: 
     `delete dm_document (all) objects where i_chronicle_id='<i_chronicle_id from the list>';`

Надеюсь это поможет,

Эмилиан

P.S. DQL, которые я тестировал на CS 7.3

person Emilian Utma    schedule 17.08.2017