public Object execute(final Map<Object, Object> iArgs) {
    if (destField == null)
      throw new OCommandExecutionException("Cannot execute the command because it has not been parsed yet");

    final ODatabaseRecord database = getDatabase();
    if (!(database.getDatabaseOwner() instanceof ODatabaseDocumentTx))
      throw new OCommandSQLParsingException("This command supports only the database type ODatabaseDocumentTx and type '"
          + database.getClass() + "' was found");

    final ODatabaseDocumentTx db = (ODatabaseDocumentTx) database.getDatabaseOwner();

    final OClass sourceClass = database.getMetadata().getSchema().getClass(sourceClassName);
    if (sourceClass == null)
      throw new OCommandExecutionException("Source class '" + sourceClassName + "' not found");

    final OClass destClass = database.getMetadata().getSchema().getClass(destClassName);
    if (destClass == null)
      throw new OCommandExecutionException("Destination class '" + destClassName + "' not found");

    Object value;
    String cmd = "select from " + destClassName + " where " + destField + " = ";
    List<ODocument> result;
    ODocument target;
    Object oldValue;
    long total = 0;

    if (linkName == null)
      // NO LINK NAME EXPRESSED: OVERWRITE THE SOURCE FIELD
      linkName = sourceField;

    boolean multipleRelationship;
    if (linkType != null)
      // DETERMINE BASED ON FORCED TYPE
      multipleRelationship = linkType == OType.LINKSET || linkType == OType.LINKLIST;
    else
      multipleRelationship = false;

    long totRecords = db.countClass(sourceClass.getName());
    long currRecord = 0;

    if (progressListener != null)
      progressListener.onBegin(this, totRecords);

    database.declareIntent(new OIntentMassiveInsert());
    try {
      // BROWSE ALL THE RECORDS OF THE SOURCE CLASS
      for (ODocument doc : db.browseClass(sourceClass.getName())) {
        doc.unpin();

        value = doc.field(sourceField);

        if (value != null) {
          if (value instanceof ODocument || value instanceof ORID) {
            // ALREADY CONVERTED
          } else if (value instanceof Collection<?>) {
            // TODO
          } else {
            // SEARCH THE DESTINATION RECORD
            target = null;

            if (value instanceof String)
              if (((String) value).length() == 0)
                value = null;
              else
                value = "'" + value + "'";

            result = database.<OCommandRequest> command(new OSQLSynchQuery<ODocument>(cmd + value)).execute();

            if (result == null || result.size() == 0)
              value = null;
            else if (result.size() > 1)
              throw new OCommandExecutionException("Cannot create link because multiple records was found in class '"
                  + destClass.getName() + "' with value " + value + " in field '" + destField + "'");
            else {
              target = result.get(0);
              value = target;
            }

            if (target != null && inverse) {
              // INVERSE RELATIONSHIP
              oldValue = target.field(linkName);

              if (oldValue != null) {
                if (!multipleRelationship)
                  multipleRelationship = true;

                Collection<ODocument> coll;
                if (oldValue instanceof Collection) {
                  // ADD IT IN THE EXISTENT COLLECTION
                  coll = (Collection<ODocument>) oldValue;
                  target.setDirty();
                } else {
                  // CREATE A NEW COLLECTION FOR BOTH
                  coll = new ArrayList<ODocument>(2);
                  target.field(linkName, coll);
                  coll.add((ODocument) oldValue);
                }
                coll.add(doc);
              } else {
                if (linkType != null)
                  if (linkType == OType.LINKSET) {
                    value = new OMVRBTreeRIDSet(target);
                    ((OMVRBTreeRIDSet) value).add(doc);
                  } else if (linkType == OType.LINKLIST) {
                    value = new ORecordLazyList(target);
                    ((ORecordLazyList) value).add(doc);
                  } else
                    // IGNORE THE TYPE, SET IT AS LINK
                    value = doc;
                else
                  value = doc;

                target.field(linkName, value);
              }
              target.save();

            } else {
              // SET THE REFERENCE
              doc.field(linkName, value);
              doc.save();
            }

            total++;
          }
        }

        if (progressListener != null)
          progressListener.onProgress(this, currRecord, currRecord * 100f / totRecords);
      }

      if (total > 0) {
        if (inverse) {
          // REMOVE THE OLD PROPERTY IF ANY
          OProperty prop = destClass.getProperty(linkName);
          if (prop != null)
            destClass.dropProperty(linkName);

          if (linkType == null)
            linkType = multipleRelationship ? OType.LINKSET : OType.LINK;

          // CREATE THE PROPERTY
          destClass.createProperty(linkName, linkType, sourceClass);

        } else {

          // REMOVE THE OLD PROPERTY IF ANY
          OProperty prop = sourceClass.getProperty(linkName);
          if (prop != null)
            sourceClass.dropProperty(linkName);

          // CREATE THE PROPERTY
          sourceClass.createProperty(linkName, OType.LINK, destClass);
        }
      }

      if (progressListener != null)
        progressListener.onCompletition(this, true);

    } catch (Exception e) {
      if (progressListener != null)
        progressListener.onCompletition(this, false);

      throw new OCommandExecutionException("Error on creation of links", e);

    } finally {
      database.declareIntent(null);
    }

    return total;
  }
public Object execute ( final Map < Object , Object > iArgs ) { if ( destField == null ) throw new OCommandExecutionException ( "Cannot execute the command because it has not been parsed yet" ) ; final ODatabaseRecord database = getDatabase ( ) ; if ( ! ( database . getDatabaseOwner ( ) instanceof ODatabaseDocumentTx ) ) throw new OCommandSQLParsingException ( "This command supports only the database type ODatabaseDocumentTx and type '" + database . getClass ( ) + "' was found" ) ; final ODatabaseDocumentTx db = ( ODatabaseDocumentTx ) database . getDatabaseOwner ( ) ; final OClass sourceClass = database . getMetadata ( ) . getSchema ( ) . getClass ( sourceClassName ) ; if ( sourceClass == null ) throw new OCommandExecutionException ( "Source class '" + sourceClassName + "' not found" ) ; final OClass destClass = database . getMetadata ( ) . getSchema ( ) . getClass ( destClassName ) ; if ( destClass == null ) throw new OCommandExecutionException ( "Destination class '" + destClassName + "' not found" ) ; Object value ; String cmd = "select from " + destClassName + " where " + destField + " = " ; List < ODocument > result ; ODocument target ; Object oldValue ; long total = 0 ; if ( linkName == null ) linkName = sourceField ; boolean multipleRelationship ; if ( linkType != null ) multipleRelationship = linkType == OType . LINKSET || linkType == OType . LINKLIST ; else multipleRelationship = false ; long totRecords = db . countClass ( sourceClass . getName ( ) ) ; long currRecord = 0 ; if ( progressListener != null ) progressListener . onBegin ( this , totRecords ) ; database . declareIntent ( new OIntentMassiveInsert ( ) ) ; try { for ( ODocument doc : db . browseClass ( sourceClass . getName ( ) ) ) { doc . unpin ( ) ; value = doc . field ( sourceField ) ; if ( value != null ) { if ( value instanceof ODocument || value instanceof ORID ) { } else if ( value instanceof Collection < ? > ) { } else { target = null ; if ( value instanceof String ) if ( ( ( String ) value ) . length ( ) == 0 ) value = null ; else value = "'" + value + "'" ; result = database . < OCommandRequest > command ( new OSQLSynchQuery < ODocument > ( cmd + value ) ) . execute ( ) ; if ( result == null || result . size ( ) == 0 ) value = null ; else if ( result . size ( ) > 1 ) throw new OCommandExecutionException ( "Cannot create link because multiple records was found in class '" + destClass . getName ( ) + "' with value " + value + " in field '" + destField + "'" ) ; else { target = result . get ( 0 ) ; value = target ; } if ( target != null && inverse ) { oldValue = target . field ( linkName ) ; if ( oldValue != null ) { if ( ! multipleRelationship ) multipleRelationship = true ; Collection < ODocument > coll ; if ( oldValue instanceof Collection ) { coll = ( Collection < ODocument > ) oldValue ; target . setDirty ( ) ; } else { coll = new ArrayList < ODocument > ( 2 ) ; target . field ( linkName , coll ) ; coll . add ( ( ODocument ) oldValue ) ; } coll . add ( doc ) ; } else { if ( linkType != null ) if ( linkType == OType . LINKSET ) { value = new OMVRBTreeRIDSet ( target ) ; ( ( OMVRBTreeRIDSet ) value ) . add ( doc ) ; } else if ( linkType == OType . LINKLIST ) { value = new ORecordLazyList ( target ) ; ( ( ORecordLazyList ) value ) . add ( doc ) ; } else value = doc ; else value = doc ; target . field ( linkName , value ) ; } target . save ( ) ; } else { doc . field ( linkName , value ) ; doc . save ( ) ; } total ++ ; } } if ( progressListener != null ) progressListener . onProgress ( this , currRecord , currRecord * 100f / totRecords ) ; } if ( total > 0 ) { if ( inverse ) { OProperty prop = destClass . getProperty ( linkName ) ; if ( prop != null ) destClass . dropProperty ( linkName ) ; if ( linkType == null ) linkType = multipleRelationship ? OType . LINKSET : OType . LINK ; destClass . createProperty ( linkName , linkType , sourceClass ) ; } else { OProperty prop = sourceClass . getProperty ( linkName ) ; if ( prop != null ) sourceClass . dropProperty ( linkName ) ; sourceClass . createProperty ( linkName , OType . LINK , destClass ) ; } } if ( progressListener != null ) progressListener . onCompletition ( this , true ) ; } catch ( Exception e ) { if ( progressListener != null ) progressListener . onCompletition ( this , false ) ; throw new OCommandExecutionException ( "Error on creation of links" , e ) ; } finally { database . declareIntent ( null ) ; } return total ; }
Execute the CREATE LINK.