function testTree_MultipleCrossColumnIndices_PartialMatching() {
  var treeBefore =
      'select(value_pred(DummyTable.string eq StringValue))\n' +
      '-select(value_pred(DummyTable.integer gt 100))\n' +
      '--table_access(DummyTable)\n';

  var treeAfter =
      'select(value_pred(DummyTable.integer gt 100))\n' +
      '-table_access_by_row_id(DummyTable)\n' +
      '--index_range_scan(DummyTable.pkDummyTable, ' +
          '[StringValue, StringValue],[unbound, unbound], natural)\n';

  var indices = dt.getIndices();
  lf.testing.util.simulateIndexCost(
      propertyReplacer, indexStore, indices[0], 10);
  lf.testing.util.simulateIndexCost(
      propertyReplacer, indexStore, indices[1], 100);

  var constructTree = function() {
    var queryContext = new lf.query.SelectContext(hr.db.getSchema());
    queryContext.from = [dt];
    queryContext.where = lf.op.and(
        dt.string.eq('StringValue'),
        dt.integer.gt(100));

    var selectNode1 = createSelectStep(queryContext, 0);
    var selectNode2 = createSelectStep(queryContext, 1);
    var tableAccessNode = new lf.proc.TableAccessFullStep(
        hr.db.getGlobal(), queryContext.from[0]);
    selectNode1.addChild(selectNode2);
    selectNode2.addChild(tableAccessNode);

    return {
      queryContext: queryContext,
      root: selectNode1
    };
  };

  lf.testing.treeutil.assertTreeTransformation(
      constructTree(), treeBefore, treeAfter, pass);
}
Tests a tree where
 - two cross-column indices exist, each index is indexing two columns.
 - a predicate that refers to a subset of the cross column index's columns
   exists. The referred columns are enough to leverage the index, since
   they do form a prefix. Cross-column indices exist on
   ['string', 'number'] and ['integer', 'string2'], and the predicates refer
   to 'string', and 'integer', therefore both indices are valid candidates
   and the most selective one should be leveraged.