Fix https://github.com/julianhyde/linq4j/issues/15, "Expressions.ifThenElse does not work".
diff --git a/src/main/java/net/hydromatic/linq4j/expressions/ConditionalStatement.java b/src/main/java/net/hydromatic/linq4j/expressions/ConditionalStatement.java
index 9edb3c1..5ed1f57 100644
--- a/src/main/java/net/hydromatic/linq4j/expressions/ConditionalStatement.java
+++ b/src/main/java/net/hydromatic/linq4j/expressions/ConditionalStatement.java
@@ -51,18 +51,27 @@
 
   @Override
   void accept0(ExpressionWriter writer) {
-    for (int i = 0; i < expressionList.size(); i += 2) {
-      writer.append(i > 0 ? " else if (" : "if (")
+    for (int i = 0; i < expressionList.size() - 1; i += 2) {
+      if (i > 0) {
+        writer.backUp();
+        writer.append(" else ");
+      }
+      writer.append("if (")
           .append(expressionList.get(i))
           .append(") ")
           .append(Blocks.toBlock(expressionList.get(i + 1)));
     }
     if (expressionList.size() % 2 == 1) {
-      writer.append(" else ").append(Blocks.toBlock(expressionList.get(
-          expressionList.size() - 1)));
+      writer.backUp();
+      writer.append(" else ")
+          .append(Blocks.toBlock(last(expressionList)));
     }
   }
 
+  private static <E> E last(List<E> collection) {
+    return collection.get(collection.size() - 1);
+  }
+
   @Override
   public boolean equals(Object o) {
     if (this == o) {
diff --git a/src/main/java/net/hydromatic/linq4j/expressions/Expressions.java b/src/main/java/net/hydromatic/linq4j/expressions/Expressions.java
index 8e8ecd5..3a34fdf 100644
--- a/src/main/java/net/hydromatic/linq4j/expressions/Expressions.java
+++ b/src/main/java/net/hydromatic/linq4j/expressions/Expressions.java
@@ -958,6 +958,17 @@
   }
 
   /**
+   * Creates a ConditionalExpression that represents a conditional
+   * block with if and else statements:
+   * <code>if (test) stmt1 [ else if (test2) stmt2 ]... [ else stmtN ]</code>.
+   */
+  public static ConditionalStatement ifThenElse(Expression test,
+      Node... nodes) {
+    return new ConditionalStatement(
+        new FluentArrayList<Node>().append(test).appendAll(nodes));
+  }
+
+  /**
    * Creates a UnaryExpression that represents the incrementing of
    * the expression value by 1.
    */
diff --git a/src/test/java/net/hydromatic/linq4j/test/ExpressionTest.java b/src/test/java/net/hydromatic/linq4j/test/ExpressionTest.java
index 3d9fda7..025526d 100644
--- a/src/test/java/net/hydromatic/linq4j/test/ExpressionTest.java
+++ b/src/test/java/net/hydromatic/linq4j/test/ExpressionTest.java
@@ -1045,11 +1045,32 @@
     assertEquals(
         "if (true) {\n"
         + "  return;\n"
+        + "} else {\n"
+        + "  return 1;\n"
         + "}\n",
         Expressions.toString(
-            Expressions.ifThen(
+            Expressions.ifThenElse(
                 Expressions.constant(true),
-                Expressions.return_(null))));
+                Expressions.return_(null),
+                Expressions.return_(null, Expressions.constant(1)))));
+  }
+
+  @Test public void testIfElseIfElse() {
+    assertEquals(
+        "if (true) {\n"
+        + "  return;\n"
+        + "} else if (false) {\n"
+        + "  return;\n"
+        + "} else {\n"
+        + "  return 1;\n"
+        + "}\n",
+        Expressions.toString(
+            Expressions.ifThenElse(
+                Expressions.constant(true),
+                Expressions.return_(null),
+                Expressions.constant(false),
+                Expressions.return_(null),
+                Expressions.return_(null, Expressions.constant(1)))));
   }
 
   @Test public void assignInCondition() {