/**
 * @ brief Build the joined tile with schema derived from children tiles
 */
std::unique_ptr<LogicalTile> AbstractJoinExecutor::BuildOutputLogicalTile(
    LogicalTile *left_tile, LogicalTile *right_tile) {
  // Check the input logical tiles.
  PL_ASSERT(left_tile != nullptr);
  PL_ASSERT(right_tile != nullptr);

  // Construct output logical tile.
  std::unique_ptr<LogicalTile> output_tile(LogicalTileFactory::GetTile());

  auto left_tile_schema = left_tile->GetSchema();
  auto right_tile_schema = right_tile->GetSchema();

  // advance the position list index of right tile schema
  for (auto &col : right_tile_schema) {
    col.position_list_idx += left_tile->GetPositionLists().size();
  }

  /* build the schema given the projection */
  auto output_tile_schema = BuildSchema(left_tile_schema, right_tile_schema);

  // Set the output logical tile schema
  output_tile->SetSchema(std::move(output_tile_schema));

  return output_tile;
}
std::unique_ptr<LogicalTile> AbstractJoinExecutor::BuildOutputLogicalTile(
    LogicalTile *left_tile, LogicalTile *right_tile,
    const catalog::Schema *output_schema) {
  PL_ASSERT(output_schema != nullptr);

  std::unique_ptr<LogicalTile> output_tile(LogicalTileFactory::GetTile());

  // get the non empty tile
  LogicalTile *non_empty_tile = GetNonEmptyTile(left_tile, right_tile);

  auto non_empty_tile_schema = non_empty_tile->GetSchema();

  // left tile is empty
  if (non_empty_tile == right_tile) {
    /* build the schema given the projection */
    output_tile->SetSchema(
        BuildSchemaFromRightTile(&non_empty_tile_schema, output_schema));
  } else {
    // right tile is empty
    output_tile->SetSchema(
        BuildSchemaFromLeftTile(&non_empty_tile_schema, output_schema,
                                left_tile->GetPositionLists().size()));
  }
  return output_tile;
}
Exemple #3
0
void output_tiles(COMPARISON comp, TILES t)
{
	int i=1;
	TILE tile = t->first;
	printf(_("Number of tiles: %d\n"), t->num);
	while (tile)
	{
		printf("%d:\n", i++);
		output_tile(tile);
		printf(_("Fragment of %s:\n"), comp->a->filename);
	    print_substring(comp->a->source, 
				tile->p_atoms[0]->start, 
				tile->p_atoms[tile->L-1]->start + tile->p_atoms[tile->L-1]->len);
		printf(_("Fragment of %s:\n"), comp->b->filename);
	    print_substring(comp->b->source, 
				tile->t_atoms[0]->start, 
				tile->t_atoms[tile->L-1]->start + tile->t_atoms[tile->L-1]->len);
		tile = tile->next;
	}
}
/*
 * build right join output by adding null rows for every row from left tile
 * which doesn't have a match
 */
bool AbstractJoinExecutor::BuildRightJoinOutput() {
  while (right_matching_idx < no_matching_right_row_sets_.size()) {
    if (no_matching_right_row_sets_[right_matching_idx].empty()) {
      right_matching_idx++;
      continue;
    }

    std::unique_ptr<LogicalTile> output_tile(nullptr);
    auto right_tile = right_result_tiles_[right_matching_idx].get();
    LogicalTile::PositionListsBuilder pos_lists_builder;
    if (left_result_tiles_.size() == 0) {
      // no tile information for left tile. construct a output tile from right
      // tile only
      output_tile = BuildOutputLogicalTile(nullptr, right_tile, proj_schema_);
      pos_lists_builder = LogicalTile::PositionListsBuilder(
          nullptr, &(right_tile->GetPositionLists()));
    } else {
      PL_ASSERT(left_result_tiles_.size() > 0);
      // construct the output tile from both children tiles
      auto left_tile = left_result_tiles_.front().get();
      output_tile = BuildOutputLogicalTile(left_tile, right_tile);
      pos_lists_builder =
          LogicalTile::PositionListsBuilder(left_tile, right_tile);
    }
    // add rows with null values on the left
    for (auto right_row_itr : no_matching_right_row_sets_[right_matching_idx]) {
      pos_lists_builder.AddLeftNullRow(right_row_itr);
    }
    PL_ASSERT(pos_lists_builder.Size() > 0);
    output_tile->SetPositionListsAndVisibility(pos_lists_builder.Release());

    SetOutput(output_tile.release());
    right_matching_idx++;
    return true;
  }
  return false;
}