You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by na...@apache.org on 2010/11/22 19:27:09 UTC
svn commit: r1037822 - in /hive/trunk: CHANGES.txt
ql/src/java/org/apache/hadoop/hive/ql/exec/CommonJoinOperator.java
Author: namit
Date: Mon Nov 22 18:27:09 2010
New Revision: 1037822
URL: http://svn.apache.org/viewvc?rev=1037822&view=rev
Log:
HIVE-1787 optimize the code path when there are no outer joins
(Siying Dong via namit)
Modified:
hive/trunk/CHANGES.txt
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/CommonJoinOperator.java
Modified: hive/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/hive/trunk/CHANGES.txt?rev=1037822&r1=1037821&r2=1037822&view=diff
==============================================================================
--- hive/trunk/CHANGES.txt (original)
+++ hive/trunk/CHANGES.txt Mon Nov 22 18:27:09 2010
@@ -265,6 +265,9 @@ Trunk - Unreleased
HIVE-1746 Support for using ALTER to set IDXPROPERTIES
(Marquis Wang via jvs)
+ HIVE-1787 optimize the code path when there are no outer joins
+ (Siying Dong via namit)
+
OPTIMIZATIONS
BUG FIXES
Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/CommonJoinOperator.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/CommonJoinOperator.java?rev=1037822&r1=1037821&r2=1037822&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/CommonJoinOperator.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/CommonJoinOperator.java Mon Nov 22 18:27:09 2010
@@ -717,28 +717,21 @@ transient boolean newGroupStarted = fals
checkAndGenObject();
}
- private void genUniqueJoinObject(int aliasNum, IntermediateObject intObj)
+ private void genUniqueJoinObject(int aliasNum, int forwardCachePos)
throws HiveException {
- if (aliasNum == numAliases) {
- int p = 0;
- for (int i = 0; i < numAliases; i++) {
- int sz = joinValues.get(order[i]).size();
- ArrayList<Object> obj = intObj.getObjs()[i];
- for (int j = 0; j < sz; j++) {
- forwardCache[p++] = obj.get(j);
- }
- }
-
- forward(forwardCache, outputObjInspector);
- countAfterReport = 0;
- return;
- }
-
AbstractRowContainer<ArrayList<Object>> alias = storage.get(order[aliasNum]);
for (ArrayList<Object> row = alias.first(); row != null; row = alias.next()) {
- intObj.pushObj(row);
- genUniqueJoinObject(aliasNum + 1, intObj);
- intObj.popObj();
+ int sz = joinValues.get(order[aliasNum]).size();
+ int p = forwardCachePos;
+ for (int j = 0; j < sz; j++) {
+ forwardCache[p++] = row.get(j);
+ }
+ if (aliasNum == numAliases - 1) {
+ forward(forwardCache, outputObjInspector);
+ countAfterReport = 0;
+ } else {
+ genUniqueJoinObject(aliasNum + 1, p);
+ }
}
}
@@ -794,13 +787,12 @@ transient boolean newGroupStarted = fals
LOG.info("called genAllOneUniqueJoinObject");
} else {
LOG.trace("calling genUniqueJoinObject");
- genUniqueJoinObject(0, new IntermediateObject(new ArrayList[numAliases],
- 0));
+ genUniqueJoinObject(0, 0);
LOG.trace("called genUniqueJoinObject");
}
} else {
// does any result need to be emitted
- boolean hasMoreThanOne = false;
+ boolean mayHasMoreThanOne = false;
boolean hasEmpty = false;
for (int i = 0; i < numAliases; i++) {
Byte alias = order[i];
@@ -811,13 +803,13 @@ transient boolean newGroupStarted = fals
LOG.trace("No data for alias=" + i);
return;
} else if (alw.size() > 1) {
- hasMoreThanOne = true;
+ mayHasMoreThanOne = true;
}
} else {
if (alw.size() == 0) {
hasEmpty = true;
alw.add((ArrayList<Object>) dummyObj[i]);
- } else if (alw.size() == 1) {
+ } else if (!hasEmpty && alw.size() == 1) {
ArrayList<Object> row = alw.first();
int numValues = joinValues.get(alias).size();
if (row == dummyObj[alias]
@@ -825,15 +817,29 @@ transient boolean newGroupStarted = fals
hasEmpty = true;
}
} else {
- hasMoreThanOne = true;
+ mayHasMoreThanOne = true;
+ if (!hasEmpty) {
+ int numValues = joinValues.get(alias).size();
+ for (ArrayList<Object> row = alw.first(); row != null; row = alw.next()) {
+ if (row == dummyObj[alias]
+ || (row.size() > numValues && ((BooleanWritable) (row.get(numValues))).get())) {
+ hasEmpty = true;
+ break;
+ }
+ }
+ }
}
}
}
- if (!hasEmpty && !hasMoreThanOne) {
+ if (!hasEmpty && !mayHasMoreThanOne) {
LOG.trace("calling genAllOneUniqueJoinObject");
genAllOneUniqueJoinObject();
LOG.trace("called genAllOneUniqueJoinObject");
+ } else if (!hasEmpty) {
+ LOG.trace("calling genUniqueJoinObject");
+ genUniqueJoinObject(0, 0);
+ LOG.trace("called genUniqueJoinObject");
} else {
LOG.trace("calling genObject");
genObject(null, 0, new IntermediateObject(new ArrayList[numAliases], 0),