private void checkJoinEstimateCosts(JoinOptimizer jo, LogicalJoinNode equalsJoinNode) {
   int card1s[] = new int[20];
   int card2s[] = new int[card1s.length];
   double cost1s[] = new double[card1s.length];
   double cost2s[] = new double[card1s.length];
   Object[] ret;
   // card1s linear others constant
   for (int i = 0; i < card1s.length; ++i) {
     card1s[i] = 3 * i + 1;
     card2s[i] = 5;
     cost1s[i] = cost2s[i] = 5.0;
   }
   double stats[] = getRandomJoinCosts(jo, equalsJoinNode, card1s, card2s, cost1s, cost2s);
   ret = SystemTestUtil.checkLinear(stats);
   Assert.assertEquals(Boolean.TRUE, ret[0]);
   // card2s linear others constant
   for (int i = 0; i < card1s.length; ++i) {
     card1s[i] = 4;
     card2s[i] = 3 * i + 1;
     cost1s[i] = cost2s[i] = 5.0;
   }
   stats = getRandomJoinCosts(jo, equalsJoinNode, card1s, card2s, cost1s, cost2s);
   ret = SystemTestUtil.checkLinear(stats);
   Assert.assertEquals(Boolean.TRUE, ret[0]);
   // cost1s linear others constant
   for (int i = 0; i < card1s.length; ++i) {
     card1s[i] = card2s[i] = 7;
     cost1s[i] = 5.0 * (i + 1);
     cost2s[i] = 3.0;
   }
   stats = getRandomJoinCosts(jo, equalsJoinNode, card1s, card2s, cost1s, cost2s);
   ret = SystemTestUtil.checkLinear(stats);
   Assert.assertEquals(Boolean.TRUE, ret[0]);
   // cost2s linear others constant
   for (int i = 0; i < card1s.length; ++i) {
     card1s[i] = card2s[i] = 9;
     cost1s[i] = 5.0;
     cost2s[i] = 3.0 * (i + 1);
   }
   stats = getRandomJoinCosts(jo, equalsJoinNode, card1s, card2s, cost1s, cost2s);
   ret = SystemTestUtil.checkLinear(stats);
   Assert.assertEquals(Boolean.TRUE, ret[0]);
   // everything linear
   for (int i = 0; i < card1s.length; ++i) {
     card1s[i] = 2 * (i + 1);
     card2s[i] = 9 * i + 1;
     cost1s[i] = 5.0 * i + 2;
     cost2s[i] = 3.0 * i + 1;
   }
   stats = getRandomJoinCosts(jo, equalsJoinNode, card1s, card2s, cost1s, cost2s);
   ret = SystemTestUtil.checkQuadratic(stats);
   Assert.assertEquals(Boolean.TRUE, ret[0]);
 }