core/src/main/java/com/orientechnologies/orient/core/sql/OCommandExecutorSQLSelect.java
private void applyExpand() {
    if (expandTarget == null) {
      return;
    }

    final long startExpand = System.currentTimeMillis();
    try {

      if (tempResult == null) {
        tempResult = new ArrayList<OIdentifiable>();
        if (expandTarget instanceof OSQLFilterItemVariable) {
          Object r = ((OSQLFilterItemVariable) expandTarget).getValue(null, null, context);
          if (r != null) {
            if (r instanceof OIdentifiable) {
              ((Collection<OIdentifiable>) tempResult).add((OIdentifiable) r);
            } else if (r instanceof Iterator || OMultiValue.isMultiValue(r)) {
              for (Object o : OMultiValue.getMultiValueIterable(r)) {
                ((Collection<OIdentifiable>) tempResult).add((OIdentifiable) o);
              }
            }
          }
        } else if (expandTarget instanceof OSQLFunctionRuntime && !hasFieldItemParams((OSQLFunctionRuntime) expandTarget)) {
          if (((OSQLFunctionRuntime) expandTarget).aggregateResults()) {
            throw new OCommandExecutionException("Unsupported operation: aggregate function in expand(" + expandTarget + ")");
          } else {
            Object r = ((OSQLFunctionRuntime) expandTarget).execute(null, null, null, context);
            if (r instanceof OIdentifiable) {
              ((Collection<OIdentifiable>) tempResult).add((OIdentifiable) r);
            } else if (r instanceof Iterator || OMultiValue.isMultiValue(r)) {
              for (Object o : OMultiValue.getMultiValueIterable(r)) {
                ((Collection<OIdentifiable>) tempResult).add((OIdentifiable) o);
              }
            }
          }
        }
      } else {
        if (tempResult == null) {
          tempResult = new ArrayList<OIdentifiable>();
        }
        final OMultiCollectionIterator<OIdentifiable> finalResult = new OMultiCollectionIterator<OIdentifiable>();

        if (orderedFields == null || orderedFields.size() == 0) {
          // expand is applied before sorting, so limiting the result set here would give wrong results
          int iteratorLimit = 0;
          if (limit < 0) {
            iteratorLimit = -1;
          } else {
            iteratorLimit += limit;
          }
          finalResult.setLimit(iteratorLimit);
          finalResult.setSkip(skip);
        }

        for (OIdentifiable id : tempResult) {
          Object fieldValue;
          if (expandTarget instanceof OSQLFilterItem) {
            fieldValue = ((OSQLFilterItem) expandTarget).getValue(id.getRecord(), null, context);
          } else if (expandTarget instanceof OSQLFunctionRuntime) {
            fieldValue = ((OSQLFunctionRuntime) expandTarget).getResult();
          } else {
            fieldValue = expandTarget.toString();
          }

          if (fieldValue != null) {
            if (fieldValue instanceof Iterable && !(fieldValue instanceof OIdentifiable)) {
              fieldValue = ((Iterable) fieldValue).iterator();
            }
            if (fieldValue instanceof ODocument) {
              ArrayList<ODocument> partial = new ArrayList<ODocument>();
              partial.add((ODocument) fieldValue);
              finalResult.add(partial);
            } else if (fieldValue instanceof Collection<?> || fieldValue.getClass().isArray() || fieldValue instanceof Iterator<?>
                || fieldValue instanceof OIdentifiable || fieldValue instanceof ORidBag) {
              finalResult.add(fieldValue);
            } else if (fieldValue instanceof Map<?, ?>) {
              finalResult.add(((Map<?, OIdentifiable>) fieldValue).values());
            }
          }
        }
        tempResult = finalResult;
      }
    } finally {
      context.setVariable("expandElapsed", (System.currentTimeMillis() - startExpand));
    }

  }
private void applyExpand() {
    if (expandTarget == null) {
      return;
    }

    final long startExpand = System.currentTimeMillis();
    try {

      if (tempResult == null) {
        tempResult = new ArrayList<OIdentifiable>();
        if (expandTarget instanceof OSQLFilterItemVariable) {
          Object r = ((OSQLFilterItemVariable) expandTarget).getValue(null, null, context);
          if (r != null) {
            if (r instanceof OIdentifiable) {
              ((Collection<OIdentifiable>) tempResult).add((OIdentifiable) r);
            } else if (r instanceof Iterator || OMultiValue.isMultiValue(r)) {
              for (Object o : OMultiValue.getMultiValueIterable(r)) {
                ((Collection<OIdentifiable>) tempResult).add((OIdentifiable) o);
              }
            }
          }
        } else if (expandTarget instanceof OSQLFunctionRuntime && !hasFieldItemParams((OSQLFunctionRuntime) expandTarget)) {
          if (((OSQLFunctionRuntime) expandTarget).aggregateResults()) {
            throw new OCommandExecutionException("Unsupported operation: aggregate function in expand(" + expandTarget + ")");
          } else {
            Object r = ((OSQLFunctionRuntime) expandTarget).execute(null, null, null, context);
            if (r instanceof OIdentifiable) {
              ((Collection<OIdentifiable>) tempResult).add((OIdentifiable) r);
            } else if (r instanceof Iterator || OMultiValue.isMultiValue(r)) {
              for (Object o : OMultiValue.getMultiValueIterable(r)) {
                ((Collection<OIdentifiable>) tempResult).add((OIdentifiable) o);
              }
            }
          }
        }
      } else {
        if (tempResult == null) {
          tempResult = new ArrayList<OIdentifiable>();
        }
        final OMultiCollectionIterator<OIdentifiable> finalResult = new OMultiCollectionIterator<OIdentifiable>();

        if (orderedFields == null || orderedFields.size() == 0) {
          // expand is applied before sorting, so limiting the result set here would give wrong results
          int iteratorLimit = 0;
          if (limit < 0) {
            iteratorLimit = -1;
          } else {
            iteratorLimit += limit;
          }
          finalResult.setLimit(iteratorLimit);
          finalResult.setSkip(skip);
        }

        for (OIdentifiable id : tempResult) {
          Object fieldValue;
          if (expandTarget instanceof OSQLFilterItem) {
            fieldValue = ((OSQLFilterItem) expandTarget).getValue(id.getRecord(), null, context);
          } else if (expandTarget instanceof OSQLFunctionRuntime) {
            fieldValue = ((OSQLFunctionRuntime) expandTarget).getResult();
          } else {
            fieldValue = expandTarget.toString();
          }

          if (fieldValue != null) {
            if (fieldValue instanceof Iterable && !(fieldValue instanceof OIdentifiable)) {
              fieldValue = ((Iterable) fieldValue).iterator();
            }
            if (fieldValue instanceof ODocument) {
              ArrayList<ODocument> partial = new ArrayList<ODocument>();
              partial.add((ODocument) fieldValue);
              finalResult.add(partial);
            } else if (fieldValue instanceof Collection<?> || fieldValue.getClass().isArray() || fieldValue instanceof Iterator<?>
                || fieldValue instanceof OIdentifiable || fieldValue instanceof ORidBag) {
              finalResult.add(fieldValue);
            } else if (fieldValue instanceof Map<?, ?>) {
              finalResult.add(((Map<?, OIdentifiable>) fieldValue).values());
            }
          }
        }
        tempResult = finalResult;
      }
    } finally {
      context.setVariable("expandElapsed", (System.currentTimeMillis() - startExpand));
    }

  }
private void applyExpand ( ) { if ( expandTarget == null ) { return ; } final long startExpand = System . currentTimeMillis ( ) ; try { if ( tempResult == null ) { tempResult = new ArrayList < OIdentifiable > ( ) ; if ( expandTarget instanceof OSQLFilterItemVariable ) { Object r = ( ( OSQLFilterItemVariable ) expandTarget ) . getValue ( null , null , context ) ; if ( r != null ) { if ( r instanceof OIdentifiable ) { ( ( Collection < OIdentifiable > ) tempResult ) . add ( ( OIdentifiable ) r ) ; } else if ( r instanceof Iterator || OMultiValue . isMultiValue ( r ) ) { for ( Object o : OMultiValue . getMultiValueIterable ( r ) ) { ( ( Collection < OIdentifiable > ) tempResult ) . add ( ( OIdentifiable ) o ) ; } } } } else if ( expandTarget instanceof OSQLFunctionRuntime && ! hasFieldItemParams ( ( OSQLFunctionRuntime ) expandTarget ) ) { if ( ( ( OSQLFunctionRuntime ) expandTarget ) . aggregateResults ( ) ) { throw new OCommandExecutionException ( "Unsupported operation: aggregate function in expand(" + expandTarget + ")" ) ; } else { Object r = ( ( OSQLFunctionRuntime ) expandTarget ) . execute ( null , null , null , context ) ; if ( r instanceof OIdentifiable ) { ( ( Collection < OIdentifiable > ) tempResult ) . add ( ( OIdentifiable ) r ) ; } else if ( r instanceof Iterator || OMultiValue . isMultiValue ( r ) ) { for ( Object o : OMultiValue . getMultiValueIterable ( r ) ) { ( ( Collection < OIdentifiable > ) tempResult ) . add ( ( OIdentifiable ) o ) ; } } } } } else { if ( tempResult == null ) { tempResult = new ArrayList < OIdentifiable > ( ) ; } final OMultiCollectionIterator < OIdentifiable > finalResult = new OMultiCollectionIterator < OIdentifiable > ( ) ; if ( orderedFields == null || orderedFields . size ( ) == 0 ) { // expand is applied before sorting, so limiting the result set here would give wrong results
 int iteratorLimit = 0 ; if ( limit < 0 ) { iteratorLimit = - 1 ; } else { iteratorLimit += limit ; } finalResult . setLimit ( iteratorLimit ) ; finalResult . setSkip ( skip ) ; } for ( OIdentifiable id : tempResult ) { Object fieldValue ; if ( expandTarget instanceof OSQLFilterItem ) { fieldValue = ( ( OSQLFilterItem ) expandTarget ) . getValue ( id . getRecord ( ) , null , context ) ; } else if ( expandTarget instanceof OSQLFunctionRuntime ) { fieldValue = ( ( OSQLFunctionRuntime ) expandTarget ) . getResult ( ) ; } else { fieldValue = expandTarget . toString ( ) ; } if ( fieldValue != null ) { if ( fieldValue instanceof Iterable && ! ( fieldValue instanceof OIdentifiable ) ) { fieldValue = ( ( Iterable ) fieldValue ) . iterator ( ) ; } if ( fieldValue instanceof ODocument ) { ArrayList < ODocument > partial = new ArrayList < ODocument > ( ) ; partial . add ( ( ODocument ) fieldValue ) ; finalResult . add ( partial ) ; } else if ( fieldValue instanceof Collection < ? > || fieldValue . getClass ( ) . isArray ( ) || fieldValue instanceof Iterator < ? > || fieldValue instanceof OIdentifiable || fieldValue instanceof ORidBag ) { finalResult . add ( fieldValue ) ; } else if ( fieldValue instanceof Map < ? , ? > ) { finalResult . add ( ( ( Map < ? , OIdentifiable > ) fieldValue ) . values ( ) ) ; } } } tempResult = finalResult ; } } finally { context . setVariable ( "expandElapsed" , ( System . currentTimeMillis ( ) - startExpand ) ) ; } }
Extract the content of collections and/or links and put it as result
Extract the content of collections and / or links and put it as result