Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions tiledb/api/c_api/query_field/query_field_api.cc
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
#include "tiledb/api/c_api/datatype/datatype_api_external.h"
#include "tiledb/api/c_api/query/query_api_internal.h"
#include "tiledb/api/c_api_support/c_api_support.h"
#include "tiledb/sm/array_schema/dimension_label.h"
#include "tiledb/sm/misc/constants.h"

tiledb_field_origin_t FieldFromDimension::origin() {
Expand All @@ -49,6 +50,10 @@ tiledb_field_origin_t FieldFromAggregate::origin() {
return TILEDB_AGGREGATE_FIELD;
}

tiledb_field_origin_t FieldFromDimensionLabel::origin() {
return TILEDB_DIMENSION_LABEL_FIELD;
}

tiledb_query_field_handle_t::tiledb_query_field_handle_t(
tiledb_query_t* query, const char* field_name)
: query_(query->query_)
Expand All @@ -71,6 +76,12 @@ tiledb_query_field_handle_t::tiledb_query_field_handle_t(
type_ = query_->array_schema().dimension_ptr(field_name_)->type();
cell_val_num_ =
query_->array_schema().dimension_ptr(field_name_)->cell_val_num();
} else if (query_->array_schema().is_dim_label(field_name_)) {
field_origin_ = std::make_shared<FieldFromDimensionLabel>();
type_ = query_->array_schema().dimension_label(field_name_).label_type();
cell_val_num_ = query_->array_schema()
.dimension_label(field_name_)
.label_cell_val_num();
} else if (query_->is_aggregate(field_name_)) {
field_origin_ = std::make_shared<FieldFromAggregate>();
auto aggregate = query_->get_aggregate(field_name_).value();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,8 @@ typedef struct tiledb_query_field_handle_t tiledb_query_field_t;
typedef enum {
TILEDB_ATTRIBUTE_FIELD = 0,
TILEDB_DIMENSION_FIELD,
TILEDB_AGGREGATE_FIELD
TILEDB_AGGREGATE_FIELD,
TILEDB_DIMENSION_LABEL_FIELD
} tiledb_field_origin_t;

/**
Expand Down
5 changes: 5 additions & 0 deletions tiledb/api/c_api/query_field/query_field_api_internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,11 @@ class FieldFromAggregate : public FieldOrigin {
virtual tiledb_field_origin_t origin() override;
};

class FieldFromDimensionLabel : public FieldOrigin {
public:
virtual tiledb_field_origin_t origin() override;
};

struct tiledb_query_field_handle_t
: public tiledb::api::CAPIHandle<tiledb_query_field_handle_t> {
/**
Expand Down
17 changes: 17 additions & 0 deletions tiledb/api/c_api/query_field/test/unit_capi_query_field.cc
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,13 @@ void QueryFieldFx::create_sparse_array(const std::string& array_name) {
tiledb_array_schema_add_attribute(ctx, array_schema, c));
throw_if_setup_failed(
tiledb_array_schema_add_attribute(ctx, array_schema, d));
throw_if_setup_failed(tiledb_array_schema_add_dimension_label(
ctx,
array_schema,
0,
"d1_label",
TILEDB_INCREASING_DATA,
TILEDB_STRING_ASCII));

// check array schema
throw_if_setup_failed(tiledb_array_schema_check(ctx, array_schema));
Expand Down Expand Up @@ -362,6 +369,16 @@ TEST_CASE_METHOD(
CHECK(cell_val_num == 1);
CHECK(tiledb_query_field_free(ctx, &field) == TILEDB_OK);

// Check field api works on dimension label field
REQUIRE(tiledb_query_get_field(ctx, query, "d1_label", &field) == TILEDB_OK);
REQUIRE(tiledb_field_datatype(ctx, field, &type) == TILEDB_OK);
CHECK(type == TILEDB_STRING_ASCII);
REQUIRE(tiledb_field_origin(ctx, field, &origin) == TILEDB_OK);
CHECK(origin == TILEDB_DIMENSION_LABEL_FIELD);
REQUIRE(tiledb_field_cell_val_num(ctx, field, &cell_val_num) == TILEDB_OK);
CHECK(cell_val_num == TILEDB_VAR_NUM);
CHECK(tiledb_query_field_free(ctx, &field) == TILEDB_OK);

// Clean up
tiledb_query_free(&query);
CHECK(tiledb_array_close(ctx, array) == TILEDB_OK);
Expand Down