package org.infinispan.objectfilter.impl.syntax;

import org.infinispan.objectfilter.SortField;
import org.infinispan.objectfilter.impl.ql.PropertyPath;

/**
 * Generates an Ickle query from an expression tree.
 *
 * @author anistor@redhat.com
 * @since 8.0
 */
public final class SyntaxTreePrinter {

   private SyntaxTreePrinter() {
   }

   public static String printTree(BooleanExpr whereClause) {
      StringBuilder sb = new StringBuilder();
      if (whereClause != null) {
         if (whereClause == ConstantBooleanExpr.FALSE) {
            throw new IllegalArgumentException("The WHERE clause must not be a contradiction");
         }
         if (whereClause != ConstantBooleanExpr.TRUE) {
            sb.append(" WHERE ").append(whereClause.toQueryString());
         }
      }
      return sb.toString();
   }

   public static String printTree(String fromEntityTypeName, PropertyPath[] projection, BooleanExpr whereClause, SortField[] orderBy) {
      StringBuilder sb = new StringBuilder();
      if (projection != null && projection.length != 0) {
         sb.append("SELECT ");
         for (int i = 0; i < projection.length; i++) {
            if (i != 0) {
               sb.append(", ");
            }
            sb.append(projection[i]);
         }
         sb.append(' ');
      }

      sb.append("FROM ").append(fromEntityTypeName);
      sb.append(printTree(whereClause));
      if (orderBy != null && orderBy.length != 0) {
         sb.append(" ORDER BY ");
         for (int i = 0; i < orderBy.length; i++) {
            if (i != 0) {
               sb.append(", ");
            }
            SortField sf = orderBy[i];
            sb.append(sf.getPath());
            if (!sf.isAscending()) {
               sb.append(" DESC");
            }
         }
      }
      return sb.toString();
   }
}
