* @param left The SparseData that comes first in the resulting concatenation * @param right The SparseData that comes second in the resulting concatenation * @return The concatenation of two input SparseData. */
| 1669 | * @return The concatenation of two input SparseData. |
| 1670 | */ |
| 1671 | SparseData concat(SparseData left, SparseData right) { |
| 1672 | if (left == NULL && right == NULL) { |
| 1673 | return NULL; |
| 1674 | } else if (left == NULL && right != NULL) { |
| 1675 | return makeSparseDataCopy(right); |
| 1676 | } else if (left != NULL && right == NULL) { |
| 1677 | return makeSparseDataCopy(left); |
| 1678 | } |
| 1679 | SparseData sdata = makeEmptySparseData(); |
| 1680 | char *vals,*index; |
| 1681 | int l_val_len = left->vals->len; |
| 1682 | int r_val_len = right->vals->len; |
| 1683 | int l_ind_len = left->index->len; |
| 1684 | int r_ind_len = right->index->len; |
| 1685 | int val_len = l_val_len + r_val_len; |
| 1686 | int ind_len = l_ind_len + r_ind_len; |
| 1687 | |
| 1688 | vals = (char *)palloc(sizeof(char)*val_len + 1); |
| 1689 | index = (char *)palloc(sizeof(char)*ind_len + 1); |
| 1690 | |
| 1691 | memcpy(vals, left->vals->data,l_val_len); |
| 1692 | memcpy(vals+l_val_len,right->vals->data,r_val_len); |
| 1693 | vals[val_len] = '\0'; |
| 1694 | |
| 1695 | memcpy(index, left->index->data,l_ind_len); |
| 1696 | memcpy(index+l_ind_len,right->index->data,r_ind_len); |
| 1697 | index[ind_len] = '\0'; |
| 1698 | |
| 1699 | sdata->vals = makeStringInfoFromData(vals,val_len); |
| 1700 | sdata->index = makeStringInfoFromData(index,ind_len); |
| 1701 | |
| 1702 | sdata->type_of_data = left->type_of_data; |
| 1703 | sdata->unique_value_count = left->unique_value_count + |
| 1704 | right->unique_value_count; |
| 1705 | sdata->total_value_count = left->total_value_count + |
| 1706 | right->total_value_count; |
| 1707 | return sdata; |
| 1708 | } |
| 1709 | |
| 1710 | /** |
| 1711 | * @param rep The SparseData to be replicated |
no test coverage detected