Skip to content

Commit

Permalink
Merge pull request #284 from alltilla/filterx-datetime-to-integer-or-…
Browse files Browse the repository at this point in the history
…double

filterx: support casting datetime to integer or double
  • Loading branch information
MrAnno authored Sep 24, 2024
2 parents e5d40ca + 252c36f commit 34251b6
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 0 deletions.
9 changes: 9 additions & 0 deletions lib/filterx/object-primitive.c
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
#include "cfg.h"
#include "filterx-globals.h"
#include "str-utils.h"
#include "timeutils/misc.h"

#include "compat/json.h"

Expand Down Expand Up @@ -307,6 +308,10 @@ filterx_typecast_integer(FilterXExpr *s, GPtrArray *args)
return filterx_integer_new(val);
}

UnixTime ut;
if (filterx_object_extract_datetime(object, &ut))
return filterx_integer_new(ut.ut_sec * USEC_PER_SEC + ut.ut_usec);

msg_error("filterx: invalid typecast",
evt_tag_str("from", object->type->name),
evt_tag_str("to", "integer"));
Expand Down Expand Up @@ -339,6 +344,10 @@ filterx_typecast_double(FilterXExpr *s, GPtrArray *args)
return filterx_double_new(val);
}

UnixTime ut;
if (filterx_object_extract_datetime(object, &ut))
return filterx_double_new(ut.ut_sec + (gdouble) ut.ut_usec / USEC_PER_SEC);

msg_error("filterx: invalid typecast",
evt_tag_str("from", object->type->name),
evt_tag_str("to", "double"));
Expand Down
19 changes: 19 additions & 0 deletions lib/filterx/tests/test_object_double.c
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
#include "filterx/object-string.h"
#include "filterx/object-null.h"
#include "filterx/object-primitive.h"
#include "filterx/object-datetime.h"
#include "apphook.h"
#include "scratch-buffers.h"

Expand Down Expand Up @@ -148,6 +149,24 @@ Test(filterx_double, test_filterx_double_typecast_from_string)
filterx_object_unref(obj);
}

Test(filterx_double, test_filterx_double_typecast_from_datetime)
{
GPtrArray *args = g_ptr_array_new_with_free_func((GDestroyNotify) filterx_object_unref);
UnixTime ut = { .ut_sec = 171, .ut_usec = 443221 };
FilterXObject *in = filterx_datetime_new(&ut);
g_ptr_array_add(args, in);

FilterXObject *obj = filterx_typecast_double(NULL, args);
cr_assert_not_null(obj);
cr_assert(filterx_object_is_type(obj, &FILTERX_TYPE_NAME(double)));

GenericNumber gn = filterx_primitive_get_value(obj);
cr_assert_float_eq(171.443221, gn_as_double(&gn), 0.00001);

g_ptr_array_free(args, TRUE);
filterx_object_unref(obj);
}

Test(filterx_double, test_filterx_double_repr)
{
FilterXObject *obj = filterx_double_new(123.456);
Expand Down
20 changes: 20 additions & 0 deletions lib/filterx/tests/test_object_integer.c
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
#include "filterx/object-string.h"
#include "filterx/object-null.h"
#include "filterx/object-primitive.h"
#include "filterx/object-datetime.h"

#include "apphook.h"
#include "scratch-buffers.h"
Expand Down Expand Up @@ -202,6 +203,25 @@ Test(filterx_integer, test_filterx_integer_typecast_from_double_string)
filterx_object_unref(obj);
}

Test(filterx_integer, test_filterx_integer_typecast_from_datetime)
{
GPtrArray *args = g_ptr_array_new_with_free_func((GDestroyNotify) filterx_object_unref);
UnixTime ut = { .ut_sec = 171, .ut_usec = 443221 };
FilterXObject *in = filterx_datetime_new(&ut);
g_ptr_array_add(args, in);

FilterXObject *obj = filterx_typecast_integer(NULL, args);
cr_assert_not_null(obj);
cr_assert(filterx_object_is_type(obj, &FILTERX_TYPE_NAME(integer)));

GenericNumber gn = filterx_primitive_get_value(obj);

cr_assert(gn_as_int64(&gn) == 171443221);

g_ptr_array_free(args, TRUE);
filterx_object_unref(obj);
}

Test(filterx_integer, test_filterx_integer_repr)
{
FilterXObject *obj = filterx_integer_new(65566);
Expand Down

0 comments on commit 34251b6

Please sign in to comment.