You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@calcite.apache.org by "Vladimir Sitnikov (JIRA)" <ji...@apache.org> on 2014/11/28 22:09:12 UTC

[jira] [Updated] (CALCITE-486) Fast-path for EnumerableCalc in case of trivial program

     [ https://issues.apache.org/jira/browse/CALCITE-486?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Vladimir Sitnikov updated CALCITE-486:
--------------------------------------
    Description: 
It looks like in case when row type differs just in the column names, enumerable is still processed.

{{JdbcTest.testInnerJoinValues}}, {{...SELECT * FROM (VALUES (10, 'SameName')) AS t (id, desc)...}}
Note how input "VALUES" is passed through custom enumerable that has no meaning.
This should be optimized.

{code:java}
/*   5 */   final org.apache.calcite.linq4j.Enumerable _inputEnumerable = org.apache.calcite.linq4j.Linq4j.asEnumerable(new Object[] {
/*   6 */     new Object[] {
/*   7 */       10,
/*   8 */       "SameName"}});
...
/*  25 */           public Object current() {
/*  26 */             final Object[] current = (Object[]) inputEnumerator.current();
/*  27 */             return new Object[] {
/*  28 */                 current[0],
/*  29 */                 current[1]};
/*  30 */           }
{code}

Full code
{code:java}
/*   1 */ org.apache.calcite.DataContext root;
/*   2 */ 
/*   3 */ public org.apache.calcite.linq4j.Enumerable bind(final org.apache.calcite.DataContext root0) {
/*   4 */   root = root0;
/*   5 */   final org.apache.calcite.linq4j.Enumerable _inputEnumerable = org.apache.calcite.linq4j.Linq4j.asEnumerable(new Object[] {
/*   6 */     new Object[] {
/*   7 */       10,
/*   8 */       "SameName"}});
/*   9 */   final org.apache.calcite.linq4j.AbstractEnumerable left = new org.apache.calcite.linq4j.AbstractEnumerable(){
/*  10 */     public org.apache.calcite.linq4j.Enumerator enumerator() {
/*  11 */       return new org.apache.calcite.linq4j.Enumerator(){
/*  12 */           public final org.apache.calcite.linq4j.Enumerator inputEnumerator = _inputEnumerable.enumerator();
/*  13 */           public void reset() {
/*  14 */             inputEnumerator.reset();
/*  15 */           }
/*  16 */ 
/*  17 */           public boolean moveNext() {
/*  18 */             return inputEnumerator.moveNext();
/*  19 */           }
/*  20 */ 
/*  21 */           public void close() {
/*  22 */             inputEnumerator.close();
/*  23 */           }
/*  24 */ 
/*  25 */           public Object current() {
/*  26 */             final Object[] current = (Object[]) inputEnumerator.current();
/*  27 */             return new Object[] {
/*  28 */                 current[0],
/*  29 */                 current[1]};
/*  30 */           }
/*  31 */ 
/*  32 */         };
/*  33 */     }
/*  34 */ 
/*  35 */   };
/*  36 */   final org.apache.calcite.linq4j.Enumerable _inputEnumerable0 = left.join(org.apache.calcite.linq4j.Linq4j.asEnumerable(((org.apache.calcite.test.JdbcTest.LingualSchema) ((org.apache.calcite.adapter.java.ReflectiveSchema) root.getRootSchema().getSubSchema("SALES").unwrap(org.apache.calcite.adapter.java.ReflectiveSchema.class)).getTarget()).EMPS), new org.apache.calcite.linq4j.function.Function1() {
/*  37 */     public java.util.List apply(Object[] v1) {
/*  38 */       return java.util.Collections.EMPTY_LIST;
/*  39 */     }
/*  40 */     public Object apply(Object v1) {
/*  41 */       return apply(
/*  42 */         (Object[]) v1);
/*  43 */     }
/*  44 */   }
/*  45 */   , new org.apache.calcite.linq4j.function.Function1() {
/*  46 */     public java.util.List apply(org.apache.calcite.test.JdbcTest.LingualEmp v1) {
/*  47 */       return java.util.Collections.EMPTY_LIST;
/*  48 */     }
/*  49 */     public Object apply(Object v1) {
/*  50 */       return apply(
/*  51 */         (org.apache.calcite.test.JdbcTest.LingualEmp) v1);
/*  52 */     }
/*  53 */   }
/*  54 */   , new org.apache.calcite.linq4j.function.Function2() {
/*  55 */     public Object[] apply(Object[] left, org.apache.calcite.test.JdbcTest.LingualEmp right) {
/*  56 */       return new Object[] {
/*  57 */           left[0],
/*  58 */           left[1],
/*  59 */           right.EMPNO,
/*  60 */           right.DEPTNO};
/*  61 */     }
/*  62 */     public Object[] apply(Object left, Object right) {
/*  63 */       return apply(
/*  64 */         (Object[]) left,
/*  65 */         (org.apache.calcite.test.JdbcTest.LingualEmp) right);
/*  66 */     }
/*  67 */   }
/*  68 */   , null, false, false);
/*  69 */   final org.apache.calcite.linq4j.AbstractEnumerable child = new org.apache.calcite.linq4j.AbstractEnumerable(){
/*  70 */     public org.apache.calcite.linq4j.Enumerator enumerator() {
/*  71 */       return new org.apache.calcite.linq4j.Enumerator(){
/*  72 */           public final org.apache.calcite.linq4j.Enumerator inputEnumerator = _inputEnumerable0.enumerator();
/*  73 */           public void reset() {
/*  74 */             inputEnumerator.reset();
/*  75 */           }
/*  76 */ 
/*  77 */           public boolean moveNext() {
/*  78 */             while (inputEnumerator.moveNext()) {
/*  79 */               final Object[] current = (Object[]) inputEnumerator.current();
/*  80 */               if (org.apache.calcite.runtime.SqlFunctions.toInt(current[3]) == org.apache.calcite.runtime.SqlFunctions.toInt(current[0]) && org.apache.calcite.runtime.SqlFunctions.eq(current[1] == null ? (String) null : current[1].toString(), "SameName")) {
/*  81 */                 return true;
/*  82 */               }
/*  83 */             }
/*  84 */             return false;
/*  85 */           }
/*  86 */ 
/*  87 */           public void close() {
/*  88 */             inputEnumerator.close();
/*  89 */           }
/*  90 */ 
/*  91 */           public Object current() {
/*  92 */             final Object[] current = (Object[]) inputEnumerator.current();
/*  93 */             return new Object[] {
/*  94 */                 current[2],
/*  95 */                 current[1]};
/*  96 */           }
/*  97 */ 
/*  98 */         };
/*  99 */     }
/* 100 */ 
/* 101 */   };
/* 102 */   return child.distinct(org.apache.calcite.linq4j.function.Functions.arrayComparer());
/* 103 */ }
/* 104 */ 
/* 105 */ 
/* 106 */ public java.lang.reflect.Type getElementType() {
/* 107 */   return java.lang.Object[].class;
/* 108 */ }
/* 109 */ 
/* 110 */ 
{code}

  was:
It looks like in case when row type differs just in the column names, enumerable is still processed.

{{JdbcTest.testInnerJoinValues}}
Note how input "VALUES" is passed through custom enumerable that has no meaning.
This should be optimized.

{code:java}
/*   5 */   final org.apache.calcite.linq4j.Enumerable _inputEnumerable = org.apache.calcite.linq4j.Linq4j.asEnumerable(new Object[] {
/*   6 */     new Object[] {
/*   7 */       10,
/*   8 */       "SameName"}});
...
/*  25 */           public Object current() {
/*  26 */             final Object[] current = (Object[]) inputEnumerator.current();
/*  27 */             return new Object[] {
/*  28 */                 current[0],
/*  29 */                 current[1]};
/*  30 */           }
{code}

Full code
{code:java}
/*   1 */ org.apache.calcite.DataContext root;
/*   2 */ 
/*   3 */ public org.apache.calcite.linq4j.Enumerable bind(final org.apache.calcite.DataContext root0) {
/*   4 */   root = root0;
/*   5 */   final org.apache.calcite.linq4j.Enumerable _inputEnumerable = org.apache.calcite.linq4j.Linq4j.asEnumerable(new Object[] {
/*   6 */     new Object[] {
/*   7 */       10,
/*   8 */       "SameName"}});
/*   9 */   final org.apache.calcite.linq4j.AbstractEnumerable left = new org.apache.calcite.linq4j.AbstractEnumerable(){
/*  10 */     public org.apache.calcite.linq4j.Enumerator enumerator() {
/*  11 */       return new org.apache.calcite.linq4j.Enumerator(){
/*  12 */           public final org.apache.calcite.linq4j.Enumerator inputEnumerator = _inputEnumerable.enumerator();
/*  13 */           public void reset() {
/*  14 */             inputEnumerator.reset();
/*  15 */           }
/*  16 */ 
/*  17 */           public boolean moveNext() {
/*  18 */             return inputEnumerator.moveNext();
/*  19 */           }
/*  20 */ 
/*  21 */           public void close() {
/*  22 */             inputEnumerator.close();
/*  23 */           }
/*  24 */ 
/*  25 */           public Object current() {
/*  26 */             final Object[] current = (Object[]) inputEnumerator.current();
/*  27 */             return new Object[] {
/*  28 */                 current[0],
/*  29 */                 current[1]};
/*  30 */           }
/*  31 */ 
/*  32 */         };
/*  33 */     }
/*  34 */ 
/*  35 */   };
/*  36 */   final org.apache.calcite.linq4j.Enumerable _inputEnumerable0 = left.join(org.apache.calcite.linq4j.Linq4j.asEnumerable(((org.apache.calcite.test.JdbcTest.LingualSchema) ((org.apache.calcite.adapter.java.ReflectiveSchema) root.getRootSchema().getSubSchema("SALES").unwrap(org.apache.calcite.adapter.java.ReflectiveSchema.class)).getTarget()).EMPS), new org.apache.calcite.linq4j.function.Function1() {
/*  37 */     public java.util.List apply(Object[] v1) {
/*  38 */       return java.util.Collections.EMPTY_LIST;
/*  39 */     }
/*  40 */     public Object apply(Object v1) {
/*  41 */       return apply(
/*  42 */         (Object[]) v1);
/*  43 */     }
/*  44 */   }
/*  45 */   , new org.apache.calcite.linq4j.function.Function1() {
/*  46 */     public java.util.List apply(org.apache.calcite.test.JdbcTest.LingualEmp v1) {
/*  47 */       return java.util.Collections.EMPTY_LIST;
/*  48 */     }
/*  49 */     public Object apply(Object v1) {
/*  50 */       return apply(
/*  51 */         (org.apache.calcite.test.JdbcTest.LingualEmp) v1);
/*  52 */     }
/*  53 */   }
/*  54 */   , new org.apache.calcite.linq4j.function.Function2() {
/*  55 */     public Object[] apply(Object[] left, org.apache.calcite.test.JdbcTest.LingualEmp right) {
/*  56 */       return new Object[] {
/*  57 */           left[0],
/*  58 */           left[1],
/*  59 */           right.EMPNO,
/*  60 */           right.DEPTNO};
/*  61 */     }
/*  62 */     public Object[] apply(Object left, Object right) {
/*  63 */       return apply(
/*  64 */         (Object[]) left,
/*  65 */         (org.apache.calcite.test.JdbcTest.LingualEmp) right);
/*  66 */     }
/*  67 */   }
/*  68 */   , null, false, false);
/*  69 */   final org.apache.calcite.linq4j.AbstractEnumerable child = new org.apache.calcite.linq4j.AbstractEnumerable(){
/*  70 */     public org.apache.calcite.linq4j.Enumerator enumerator() {
/*  71 */       return new org.apache.calcite.linq4j.Enumerator(){
/*  72 */           public final org.apache.calcite.linq4j.Enumerator inputEnumerator = _inputEnumerable0.enumerator();
/*  73 */           public void reset() {
/*  74 */             inputEnumerator.reset();
/*  75 */           }
/*  76 */ 
/*  77 */           public boolean moveNext() {
/*  78 */             while (inputEnumerator.moveNext()) {
/*  79 */               final Object[] current = (Object[]) inputEnumerator.current();
/*  80 */               if (org.apache.calcite.runtime.SqlFunctions.toInt(current[3]) == org.apache.calcite.runtime.SqlFunctions.toInt(current[0]) && org.apache.calcite.runtime.SqlFunctions.eq(current[1] == null ? (String) null : current[1].toString(), "SameName")) {
/*  81 */                 return true;
/*  82 */               }
/*  83 */             }
/*  84 */             return false;
/*  85 */           }
/*  86 */ 
/*  87 */           public void close() {
/*  88 */             inputEnumerator.close();
/*  89 */           }
/*  90 */ 
/*  91 */           public Object current() {
/*  92 */             final Object[] current = (Object[]) inputEnumerator.current();
/*  93 */             return new Object[] {
/*  94 */                 current[2],
/*  95 */                 current[1]};
/*  96 */           }
/*  97 */ 
/*  98 */         };
/*  99 */     }
/* 100 */ 
/* 101 */   };
/* 102 */   return child.distinct(org.apache.calcite.linq4j.function.Functions.arrayComparer());
/* 103 */ }
/* 104 */ 
/* 105 */ 
/* 106 */ public java.lang.reflect.Type getElementType() {
/* 107 */   return java.lang.Object[].class;
/* 108 */ }
/* 109 */ 
/* 110 */ 
{code}


> Fast-path for EnumerableCalc in case of trivial program
> -------------------------------------------------------
>
>                 Key: CALCITE-486
>                 URL: https://issues.apache.org/jira/browse/CALCITE-486
>             Project: Calcite
>          Issue Type: Bug
>            Reporter: Vladimir Sitnikov
>            Assignee: Julian Hyde
>              Labels: newbie
>
> It looks like in case when row type differs just in the column names, enumerable is still processed.
> {{JdbcTest.testInnerJoinValues}}, {{...SELECT * FROM (VALUES (10, 'SameName')) AS t (id, desc)...}}
> Note how input "VALUES" is passed through custom enumerable that has no meaning.
> This should be optimized.
> {code:java}
> /*   5 */   final org.apache.calcite.linq4j.Enumerable _inputEnumerable = org.apache.calcite.linq4j.Linq4j.asEnumerable(new Object[] {
> /*   6 */     new Object[] {
> /*   7 */       10,
> /*   8 */       "SameName"}});
> ...
> /*  25 */           public Object current() {
> /*  26 */             final Object[] current = (Object[]) inputEnumerator.current();
> /*  27 */             return new Object[] {
> /*  28 */                 current[0],
> /*  29 */                 current[1]};
> /*  30 */           }
> {code}
> Full code
> {code:java}
> /*   1 */ org.apache.calcite.DataContext root;
> /*   2 */ 
> /*   3 */ public org.apache.calcite.linq4j.Enumerable bind(final org.apache.calcite.DataContext root0) {
> /*   4 */   root = root0;
> /*   5 */   final org.apache.calcite.linq4j.Enumerable _inputEnumerable = org.apache.calcite.linq4j.Linq4j.asEnumerable(new Object[] {
> /*   6 */     new Object[] {
> /*   7 */       10,
> /*   8 */       "SameName"}});
> /*   9 */   final org.apache.calcite.linq4j.AbstractEnumerable left = new org.apache.calcite.linq4j.AbstractEnumerable(){
> /*  10 */     public org.apache.calcite.linq4j.Enumerator enumerator() {
> /*  11 */       return new org.apache.calcite.linq4j.Enumerator(){
> /*  12 */           public final org.apache.calcite.linq4j.Enumerator inputEnumerator = _inputEnumerable.enumerator();
> /*  13 */           public void reset() {
> /*  14 */             inputEnumerator.reset();
> /*  15 */           }
> /*  16 */ 
> /*  17 */           public boolean moveNext() {
> /*  18 */             return inputEnumerator.moveNext();
> /*  19 */           }
> /*  20 */ 
> /*  21 */           public void close() {
> /*  22 */             inputEnumerator.close();
> /*  23 */           }
> /*  24 */ 
> /*  25 */           public Object current() {
> /*  26 */             final Object[] current = (Object[]) inputEnumerator.current();
> /*  27 */             return new Object[] {
> /*  28 */                 current[0],
> /*  29 */                 current[1]};
> /*  30 */           }
> /*  31 */ 
> /*  32 */         };
> /*  33 */     }
> /*  34 */ 
> /*  35 */   };
> /*  36 */   final org.apache.calcite.linq4j.Enumerable _inputEnumerable0 = left.join(org.apache.calcite.linq4j.Linq4j.asEnumerable(((org.apache.calcite.test.JdbcTest.LingualSchema) ((org.apache.calcite.adapter.java.ReflectiveSchema) root.getRootSchema().getSubSchema("SALES").unwrap(org.apache.calcite.adapter.java.ReflectiveSchema.class)).getTarget()).EMPS), new org.apache.calcite.linq4j.function.Function1() {
> /*  37 */     public java.util.List apply(Object[] v1) {
> /*  38 */       return java.util.Collections.EMPTY_LIST;
> /*  39 */     }
> /*  40 */     public Object apply(Object v1) {
> /*  41 */       return apply(
> /*  42 */         (Object[]) v1);
> /*  43 */     }
> /*  44 */   }
> /*  45 */   , new org.apache.calcite.linq4j.function.Function1() {
> /*  46 */     public java.util.List apply(org.apache.calcite.test.JdbcTest.LingualEmp v1) {
> /*  47 */       return java.util.Collections.EMPTY_LIST;
> /*  48 */     }
> /*  49 */     public Object apply(Object v1) {
> /*  50 */       return apply(
> /*  51 */         (org.apache.calcite.test.JdbcTest.LingualEmp) v1);
> /*  52 */     }
> /*  53 */   }
> /*  54 */   , new org.apache.calcite.linq4j.function.Function2() {
> /*  55 */     public Object[] apply(Object[] left, org.apache.calcite.test.JdbcTest.LingualEmp right) {
> /*  56 */       return new Object[] {
> /*  57 */           left[0],
> /*  58 */           left[1],
> /*  59 */           right.EMPNO,
> /*  60 */           right.DEPTNO};
> /*  61 */     }
> /*  62 */     public Object[] apply(Object left, Object right) {
> /*  63 */       return apply(
> /*  64 */         (Object[]) left,
> /*  65 */         (org.apache.calcite.test.JdbcTest.LingualEmp) right);
> /*  66 */     }
> /*  67 */   }
> /*  68 */   , null, false, false);
> /*  69 */   final org.apache.calcite.linq4j.AbstractEnumerable child = new org.apache.calcite.linq4j.AbstractEnumerable(){
> /*  70 */     public org.apache.calcite.linq4j.Enumerator enumerator() {
> /*  71 */       return new org.apache.calcite.linq4j.Enumerator(){
> /*  72 */           public final org.apache.calcite.linq4j.Enumerator inputEnumerator = _inputEnumerable0.enumerator();
> /*  73 */           public void reset() {
> /*  74 */             inputEnumerator.reset();
> /*  75 */           }
> /*  76 */ 
> /*  77 */           public boolean moveNext() {
> /*  78 */             while (inputEnumerator.moveNext()) {
> /*  79 */               final Object[] current = (Object[]) inputEnumerator.current();
> /*  80 */               if (org.apache.calcite.runtime.SqlFunctions.toInt(current[3]) == org.apache.calcite.runtime.SqlFunctions.toInt(current[0]) && org.apache.calcite.runtime.SqlFunctions.eq(current[1] == null ? (String) null : current[1].toString(), "SameName")) {
> /*  81 */                 return true;
> /*  82 */               }
> /*  83 */             }
> /*  84 */             return false;
> /*  85 */           }
> /*  86 */ 
> /*  87 */           public void close() {
> /*  88 */             inputEnumerator.close();
> /*  89 */           }
> /*  90 */ 
> /*  91 */           public Object current() {
> /*  92 */             final Object[] current = (Object[]) inputEnumerator.current();
> /*  93 */             return new Object[] {
> /*  94 */                 current[2],
> /*  95 */                 current[1]};
> /*  96 */           }
> /*  97 */ 
> /*  98 */         };
> /*  99 */     }
> /* 100 */ 
> /* 101 */   };
> /* 102 */   return child.distinct(org.apache.calcite.linq4j.function.Functions.arrayComparer());
> /* 103 */ }
> /* 104 */ 
> /* 105 */ 
> /* 106 */ public java.lang.reflect.Type getElementType() {
> /* 107 */   return java.lang.Object[].class;
> /* 108 */ }
> /* 109 */ 
> /* 110 */ 
> {code}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)