use of com.actiontech.dble.backend.mysql.nio.handler.util.TwoTableComparator in project dble by actiontech.
the class JoinHandler method ownThreadJob.
@Override
protected void ownThreadJob(Object... objects) {
MySQLConnection conn = (MySQLConnection) objects[0];
LocalResult leftLocal = null, rightLocal = null;
try {
Comparator<RowDataPacket> joinComparator = new TwoTableComparator(leftFieldPackets, rightFieldPackets, leftOrders, rightOrders, this.isAllPushDown(), this.type());
// logger.debug("merge Join start");
leftLocal = takeFirst(leftQueue);
rightLocal = takeFirst(rightQueue);
while (true) {
if (terminate.get())
return;
RowDataPacket leftRow = leftLocal.getLastRow();
RowDataPacket rightRow = rightLocal.getLastRow();
if (leftRow.getFieldCount() == 0) {
break;
}
if (rightRow.getFieldCount() == 0) {
if (isLeftJoin) {
if (connectLeftAndNull(leftLocal, conn))
break;
leftLocal = takeFirst(leftQueue);
continue;
} else {
break;
}
}
int rs = joinComparator.compare(leftRow, rightRow);
if (rs < 0) {
if (isLeftJoin) {
if (connectLeftAndNull(leftLocal, conn))
break;
leftLocal = takeFirst(leftQueue);
continue;
} else {
leftLocal.close();
leftLocal = takeFirst(leftQueue);
}
} else if (rs > 0) {
rightLocal.close();
rightLocal = takeFirst(rightQueue);
} else {
if (connectLeftAndRight(leftLocal, rightLocal, conn))
break;
leftLocal = takeFirst(leftQueue);
rightLocal = takeFirst(rightQueue);
}
}
nextHandler.rowEofResponse(null, isLeft, conn);
HandlerTool.terminateHandlerTree(this);
} catch (Exception e) {
String msg = "join thread error, " + e.getLocalizedMessage();
logger.info(msg, e);
session.onQueryError(msg.getBytes());
} finally {
if (leftLocal != null)
leftLocal.close();
if (rightLocal != null)
rightLocal.close();
}
}
use of com.actiontech.dble.backend.mysql.nio.handler.util.TwoTableComparator in project dble by actiontech.
the class NotInHandler method ownThreadJob.
@Override
protected void ownThreadJob(Object... objects) {
MySQLConnection conn = (MySQLConnection) objects[0];
LocalResult leftLocal = null, rightLocal = null;
try {
Comparator<RowDataPacket> notInComparator = new TwoTableComparator(leftFieldPackets, rightFieldPackets, leftOrders, rightOrders, this.isAllPushDown(), this.type());
leftLocal = takeFirst(leftQueue);
rightLocal = takeFirst(rightQueue);
while (true) {
RowDataPacket leftRow = leftLocal.getLastRow();
RowDataPacket rightRow = rightLocal.getLastRow();
if (leftRow.getFieldCount() == 0) {
break;
}
if (rightRow.getFieldCount() == 0) {
sendLeft(leftLocal, conn);
leftLocal.close();
leftLocal = takeFirst(leftQueue);
continue;
}
int rs = notInComparator.compare(leftRow, rightRow);
if (rs < 0) {
sendLeft(leftLocal, conn);
leftLocal.close();
leftLocal = takeFirst(leftQueue);
continue;
} else if (rs > 0) {
rightLocal.close();
rightLocal = takeFirst(rightQueue);
} else {
// because not in, if equal left should move to next value
leftLocal.close();
rightLocal.close();
leftLocal = takeFirst(leftQueue);
rightLocal = takeFirst(rightQueue);
}
}
nextHandler.rowEofResponse(null, isLeft, conn);
HandlerTool.terminateHandlerTree(this);
} catch (Exception e) {
String msg = "notIn thread error, " + e.getLocalizedMessage();
LOGGER.info(msg, e);
session.onQueryError(msg.getBytes());
} finally {
if (leftLocal != null)
leftLocal.close();
if (rightLocal != null)
rightLocal.close();
}
}
Aggregations