package water.rapids.ast.prims.search;
import org.junit.BeforeClass;
import org.junit.Test;
import water.TestUtil;
import water.fvec.Frame;
import water.fvec.TestFrameBuilder;
import water.fvec.Vec;
import water.rapids.Rapids;
import water.rapids.Val;
import java.util.Random;
public class AstMatchTest extends TestUtil {
@BeforeClass
static public void setup() { stall_till_cloudsize(1); }
@Test
public void testMatchNumList() throws Exception {
final Frame data = makeTestFrame();
Frame output = null;
try {
String numList = idx(data.vec(2), "cB", "cC", "cD");
String rapids = "(tmp= tst (match (cols data [2]) [" + numList + "] -1 ignored))";
Val val = Rapids.exec(rapids);
output = val.getFrame();
assertVecEquals(data.vec(0), output.vec(0), 0.0);
} finally {
data.delete();
if (output != null) {
output.delete();
}
}
}
@Test
public void testMatchCatList() throws Exception {
final Frame data = makeTestFrame();
Frame output = null;
try {
String rapids = "(tmp= tst (match (cols data [2]) [\"cD\",\"cC\",\"cB\"] -1 ignored))";
Val val = Rapids.exec(rapids);
output = val.getFrame();
assertVecEquals(data.vec(0), output.vec(0), 0.0);
} finally {
data.delete();
if (output != null) {
output.delete();
}
}
}
@Test
public void testMatchStrList() throws Exception {
final Frame data = makeTestFrame();
Frame output = null;
try {
String rapids = "(tmp= tst (match (cols data [1]) [\"sD\",\"sC\",\"sB\"] -1 ignored))";
Val val = Rapids.exec(rapids);
output = val.getFrame();
assertVecEquals(data.vec(0), output.vec(0), 0.0);
} finally {
data.delete();
if (output != null) {
output.delete();
}
}
}
private Frame makeTestFrame() {
Random rnd = new Random();
final int len = 45000;
double numData[] = new double[len];
String[] strData = new String[len];
String[] catData = new String[len];
for (int i = 0; i < len; i++) {
char c = (char) ('A' + rnd.nextInt('Z' - 'A'));
numData[i] = c >= 'B' && c <= 'D' ? 1 : -1;
strData[i] = "s" + Character.toString(c);
catData[i] = "c" + Character.toString(c);
}
return new TestFrameBuilder()
.withName("data")
.withColNames("Expected", "Str", "Cat")
.withVecTypes(Vec.T_NUM, Vec.T_STR, Vec.T_CAT)
.withDataForCol(0, numData)
.withDataForCol(1, strData)
.withDataForCol(2, catData)
.withChunkLayout(10000, 10000, 20000, 5000)
.build();
}
private String idx(Vec v, String... cats) {
String[] domain = v.domain();
StringBuilder sb = new StringBuilder();
for (String cat : cats) {
if (sb.length() > 0) sb.append(",");
for (int i = 0; i < domain.length; i++) {
if (cat.equals(domain[i])) {
sb.append(i);
break;
}
}
}
return sb.toString();
}
}