Skip to content

Commit

Permalink
#416 Added filtering support on replicator output
Browse files Browse the repository at this point in the history
  • Loading branch information
SanderMertens committed Dec 2, 2015
1 parent 43d7615 commit 5a88db5
Show file tree
Hide file tree
Showing 4 changed files with 99 additions and 32 deletions.
72 changes: 41 additions & 31 deletions packages/corto/lang/src/corto_select.c
Original file line number Diff line number Diff line change
Expand Up @@ -389,41 +389,51 @@ static void corto_selectRequestReplicators(
}
}

static void corto_selectIterateReplicators(corto_selectData *data) {
static void corto_selectIterateReplicators(
corto_selectData *data,
corto_selectStack *frame)
{
if (data->activeReplicators) {
if (data->currentReplicator < 0) {
data->currentReplicator = 0;
}

/* Walk over iterators until one with data available has been found */
while ((data->currentReplicator < data->activeReplicators)) {
corto_resultIter *iter = &data->replicators[data->currentReplicator];
if (corto_iterHasNext(iter)) {
while (corto_iterHasNext(iter)) {
corto_result *result = corto_iterNext(iter);
data->next = &data->item;
if (!frame->filter ||
corto_selectMatch(frame->filter, result->name))
{
data->next = &data->item;

/* Copy data, so replicator can safely release it */
if (result->name) {
strcpy(data->item.name, result->name);
} else {
data->item.name[0] = '\0';
}
if (result->parent) {
strcpy(data->item.parent, result->name);
} else {
data->item.parent[0] = '\0';
}
if (result->type) {
strcpy(data->item.type, result->name);
} else {
data->item.type[0] = '\0';
}

/* Copy data, so replicator can safely release it */
if (result->name) {
strcpy(data->item.name, result->name);
} else {
data->item.name[0] = '\0';
}
if (result->parent) {
strcpy(data->item.parent, result->name);
} else {
data->item.parent[0] = '\0';
}
if (result->type) {
strcpy(data->item.type, result->name);
} else {
data->item.type[0] = '\0';
break;
}
}

/* Return item */
break;
} else {
if (!data->next) {
corto_iterRelease(iter);
data->currentReplicator ++;
} else {
break;
}
}
}
Expand Down Expand Up @@ -459,7 +469,7 @@ static void corto_selectScope(

/* Handle replicator iteration outside of scope lock */
if (!data->next) {
corto_selectIterateReplicators(data);
corto_selectIterateReplicators(data, frame);
}
}

Expand Down Expand Up @@ -558,19 +568,19 @@ static int corto_selectRun(corto_selectData *data) {
case TOKEN_IDENTIFIER:
explicitRef = TRUE;
if (!op->containsWildcard) {
frame->next = corto_selectThis;
corto_object o = corto_lookup(frame->o, op->start);
corto_setref(&frame->o, o);
if (o) {
frame->next = corto_selectThis;
corto_setref(&frame->o, o);
corto_release(o);
} else {
corto_seterr("unresolved identifier '%s'", op->start);
goto error;
break;
}
break;
} else {
frame->filter = op->start;
}

/* If expression contains wildcard OR does not resolve to an object,
* lookup object in scope (and replicators) */
frame->filter = op->start;

case TOKEN_WILDCARD:
if (op->token == TOKEN_WILDCARD) {
frame->filter = "?";
Expand Down
1 change: 1 addition & 0 deletions packages/corto/lang/test/src/test_ListReplicator.c
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
corto_resultIter _test_ListReplicator_onRequest(test_ListReplicator this, corto_object parent, corto_string expr) {
/* $begin(test/ListReplicator/onRequest) */

/* Return persistent iterator to request */
return corto_llIterAlloc(this->items);

/* $end */
Expand Down
56 changes: 55 additions & 1 deletion packages/corto/lang/test/src/test_ReplicatorRequest.c
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ corto_void _test_ReplicatorRequest_setup(test_ReplicatorRequest this) {

/* Create list of dummy 'remote' objects */
corto_resultList items = corto_llNew();
*(corto_resultListAppendAlloc(items)) = (corto_result){corto_strdup("x"), NULL, NULL};
*(corto_resultListAppendAlloc(items)) = (corto_result){corto_strdup("x")};
*(corto_resultListAppendAlloc(items)) = (corto_result){corto_strdup("yz")};
*(corto_resultListAppendAlloc(items)) = (corto_result){corto_strdup("xyz")};

Expand Down Expand Up @@ -67,6 +67,37 @@ corto_void _test_ReplicatorRequest_tc_selectScope(test_ReplicatorRequest this) {
/* $end */
}

corto_void _test_ReplicatorRequest_tc_selectScopeFilter(test_ReplicatorRequest this) {
/* $begin(test/ReplicatorRequest/tc_selectScopeFilter) */
corto_resultIter iter;
corto_result *result;
corto_int16 ret;

ret = corto_select(root_o, "a/*z", &iter);

test_assert(ret == 0);

test_assert(corto_iterHasNext(&iter));
result = corto_iterNext(&iter);
test_assert(result != NULL);
test_assert(result->name != NULL);
test_assert(!strcmp(result->name, "yz"));
test_assert(!strlen(result->parent));
test_assert(!strlen(result->type));

test_assert(corto_iterHasNext(&iter));
result = corto_iterNext(&iter);
test_assert(result != NULL);
test_assert(result->name != NULL);
test_assert(!strcmp(result->name, "xyz"));
test_assert(!strlen(result->parent));
test_assert(!strlen(result->type));

test_assert(!corto_iterHasNext(&iter));

/* $end */
}

corto_void _test_ReplicatorRequest_tc_selectScopeMixed(test_ReplicatorRequest this) {
/* $begin(test/ReplicatorRequest/tc_selectScopeMixed) */
corto_resultIter iter;
Expand Down Expand Up @@ -138,6 +169,29 @@ corto_void _test_ReplicatorRequest_tc_selectScopeMixed(test_ReplicatorRequest th
/* $end */
}

corto_void _test_ReplicatorRequest_tc_selectSingle(test_ReplicatorRequest this) {
/* $begin(test/ReplicatorRequest/tc_selectSingle) */
corto_resultIter iter;
corto_result *result;
corto_int16 ret;

ret = corto_select(root_o, "a/xyz", &iter);

test_assert(ret == 0);

test_assert(corto_iterHasNext(&iter));
result = corto_iterNext(&iter);
test_assert(result != NULL);
test_assert(result->name != NULL);
test_assert(!strcmp(result->name, "xyz"));
test_assert(!strlen(result->parent));
test_assert(!strlen(result->type));

test_assert(!corto_iterHasNext(&iter));

/* $end */
}

corto_void _test_ReplicatorRequest_teardown(test_ReplicatorRequest this) {
/* $begin(test/ReplicatorRequest/teardown) */

Expand Down
2 changes: 2 additions & 0 deletions packages/corto/lang/test/test.cx
Original file line number Diff line number Diff line change
Expand Up @@ -228,8 +228,10 @@ test::Suite ReplicatorRequest::
void setup() method
void teardown() method
replicator: ListReplicator
void tc_selectSingle()
void tc_selectScope()
void tc_selectScopeMixed()
void tc_selectScopeFilter()

// Test Event scenarios
class EventTest::
Expand Down

0 comments on commit 5a88db5

Please sign in to comment.