@Override
  public String getSourceComment(ExecutionContext context, Command command) {
    String comment = super.getSourceComment(context, command);

    boolean usingPayloadComment = false;
    if (context != null) {
      // Check for db hints
      Object payload = context.getCommandPayload();
      if (payload instanceof String) {
        String payloadString = (String) payload;
        if (payloadString.startsWith(HINT_PREFIX)) {
          int i = payloadString.indexOf(HINT_SUFFIX);
          if (i > 0 && payloadString.substring(i + 2).trim().length() == 0) {
            comment += payloadString + " "; // $NON-NLS-1$
            usingPayloadComment = true;
          } else {
            String msg =
                JDBCPlugin.Util.gs(
                    JDBCPlugin.Event.TEIID11003, "Execution Payload", payloadString); // $NON-NLS-1$
            context.addWarning(new TranslatorException(msg));
            LogManager.logWarning(LogConstants.CTX_CONNECTOR, msg);
          }
        }
      }
    }

    if (!usingPayloadComment && context != null) {
      String hint = context.getSourceHint();
      if (context.getGeneralHint() != null) {
        if (hint != null) {
          hint += (" " + context.getGeneralHint()); // $NON-NLS-1$
        } else {
          hint = context.getGeneralHint();
        }
      }
      if (hint != null) {
        // append a source hint
        if (!hint.contains(HINT_PREFIX)) {
          comment += HINT_PREFIX + ' ' + hint + ' ' + HINT_SUFFIX + ' ';
        } else {
          String msg =
              JDBCPlugin.Util.gs(JDBCPlugin.Event.TEIID11003, "Source Hint", hint); // $NON-NLS-1$
          context.addWarning(new TranslatorException(msg));
          LogManager.logWarning(LogConstants.CTX_CONNECTOR, msg);
        }
      }
    }

    if (command instanceof Select) {
      //
      // This simple algorithm determines the hint which will be added to the
      // query.
      // Right now, we look through all functions passed in the query
      // (returned as a collection)
      // Then we check if any of those functions are sdo_relate
      // If so, the ORDERED hint is added, if not, it isn't
      Collection<Function> col = CollectorVisitor.collectObjects(Function.class, command);
      for (Function func : col) {
        if (func.getName().equalsIgnoreCase(OracleExecutionFactory.RELATE)) {
          return comment + "/*+ ORDERED */ "; // $NON-NLS-1$
        }
      }
    }
    return comment;
  }
  public void handleInsertSequences(Insert insert) throws TranslatorException {
    /*
     * If a missing auto_increment column is modeled with name in source indicating that an Oracle Sequence
     * then pull the Sequence name out of the name in source of the column.
     */
    if (!(insert.getValueSource() instanceof ExpressionValueSource)) {
      return;
    }
    ExpressionValueSource values = (ExpressionValueSource) insert.getValueSource();
    if (insert.getTable().getMetadataObject() == null) {
      return;
    }
    List<Column> allElements = insert.getTable().getMetadataObject().getColumns();
    if (allElements.size() == values.getValues().size()) {
      return;
    }

    int index = 0;
    List<ColumnReference> elements = insert.getColumns();

    for (Column element : allElements) {
      if (!element.isAutoIncremented()) {
        continue;
      }
      String name = element.getNameInSource();
      int seqIndex = name.indexOf(SEQUENCE);
      if (seqIndex == -1) {
        continue;
      }
      boolean found = false;
      while (index < elements.size()) {
        if (element.equals(elements.get(index).getMetadataObject())) {
          found = true;
          break;
        }
        index++;
      }
      if (found) {
        continue;
      }

      String sequence = name.substring(seqIndex + SEQUENCE.length());

      int delimiterIndex = sequence.indexOf(Tokens.DOT);
      if (delimiterIndex == -1) {
        throw new TranslatorException(
            JDBCPlugin.Event.TEIID11017,
            JDBCPlugin.Util.gs(JDBCPlugin.Event.TEIID11017, SEQUENCE, name));
      }
      String sequenceGroupName = sequence.substring(0, delimiterIndex);
      String sequenceElementName = sequence.substring(delimiterIndex + 1);

      NamedTable sequenceGroup =
          this.getLanguageFactory().createNamedTable(sequenceGroupName, null, null);
      ColumnReference sequenceElement =
          this.getLanguageFactory()
              .createColumnReference(
                  sequenceElementName, sequenceGroup, null, element.getJavaType());
      insert
          .getColumns()
          .add(
              index,
              this.getLanguageFactory()
                  .createColumnReference(
                      element.getName(), insert.getTable(), element, element.getJavaType()));
      values.getValues().add(index, sequenceElement);
    }
  }