new ParamHandler<Object>(lambdaThisIndex, test, emSource),
SelectFromWhereExtensionJoin.fromSfw(sfw, (EntityManagerBackdoor)emSource),
this);
try {
SQLFragment newWhere = new SQLFragment();
if (analysis.paths.size() > 1)
{
for (PathAnalysis path: analysis.paths)
{
TypedValue pathReturn = path.getSimplifiedIsTrueReturnValue();
if (pathReturn instanceof ConstantValue.IntegerConstant
&& ((ConstantValue.IntegerConstant)pathReturn).val == 0)
continue;
SQLFragment pathWhere = new SQLFragment();
if (pathReturn instanceof ConstantValue.IntegerConstant
&& ((ConstantValue.IntegerConstant)pathReturn).val != 0)
{
// do nothing
}
else
{
SQLColumnValues colVals = gen.generateFor(pathReturn);
assert(colVals.getNumColumns() == 1);
pathWhere.add("(");
pathWhere.add(colVals.columns[0]);
pathWhere.add(")");
}
for (TypedValue condition: path.getSimplifiedConditions())
{
if (condition instanceof ConstantValue.IntegerConstant
&& ((ConstantValue.IntegerConstant)condition).val != 0)
continue;
if (condition instanceof ConstantValue.IntegerConstant
&& ((ConstantValue.IntegerConstant)condition).val == 0)
{
if (!pathWhere.isEmpty())
pathWhere.add(" AND ");
pathWhere.add("(1<>1)");
}
else
{
SQLColumnValues condColVals = gen.generateFor(condition);
assert(condColVals.getNumColumns() == 1);
if (!pathWhere.isEmpty())
pathWhere.add(" AND ");
pathWhere.add("(");
pathWhere.add(condColVals.columns[0]);
pathWhere.add(")");
}
}
if (!pathWhere.isEmpty())
{
if (!newWhere.isEmpty())
newWhere.add(" OR ");
newWhere.add("(");
newWhere.add(pathWhere);
newWhere.add(")");
}
}
}
else
{
PathAnalysis path = analysis.paths.get(0);
SQLColumnValues colVals = gen.generateFor(path.getSimplifiedReturnValue());
assert(colVals.reader.getNumColumns() == 1);
if (!newWhere.isEmpty())
newWhere.add(" OR ");
newWhere.add("(");
newWhere.add(colVals.columns[0]);
newWhere.add(")");
}
if (!sfw.where.isEmpty())
{
SQLFragment sql = new SQLFragment("(");
sql.add(sfw.where);
sql.add(") AND (");
sql.add(newWhere);
sql.add(")");
sfw.where = sql;
}
else
sfw.where = newWhere;
return sfw;