Skip to content

Commit

Permalink
Merge pull request #2018 from ZhouBox/v2.7
Browse files Browse the repository at this point in the history
[v2.7]display optimization for float and double types
  • Loading branch information
fengzeroz committed May 24, 2024
2 parents def733f + 46f77e4 commit b3a652a
Show file tree
Hide file tree
Showing 3 changed files with 99 additions and 6 deletions.
2 changes: 1 addition & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ target_include_directories(neuron-base
PRIVATE include/neuron src)
target_link_libraries(neuron-base libssl.a libcrypto.a)
target_link_libraries(neuron-base nng libzlog.so jansson jwt
${CMAKE_THREAD_LIBS_INIT})
${CMAKE_THREAD_LIBS_INIT} -lm)
add_dependencies(neuron-base neuron-version)

# dependency imposed by nng
Expand Down
45 changes: 45 additions & 0 deletions src/adapter/driver/driver.c
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,44 @@ static inline void start_group_timer(neu_adapter_driver_t *driver,
group_t * grp);
static inline void stop_group_timer(neu_adapter_driver_t *driver, group_t *grp);

static void format_tag_value(neu_resp_tag_value_meta_t *value)
{
double scale = pow(10, 5);

int negative = 1;

if (value->value.value.d64 < 0) {
value->value.value.d64 *= -1;
negative = -1;
}

int64_t integer_part = (int64_t) value->value.value.d64;
double decimal_part = value->value.value.d64 - integer_part;
decimal_part *= scale;
decimal_part = round(decimal_part);
char str[6] = { 0 };
snprintf(str, sizeof(str), "%05" PRId64 "", (int64_t) decimal_part);
int i = 0, flag = 0;
for (; i < 4; i++) {
if (str[i] == '0' && str[i + 1] == '0') {
flag = 1;
break;
} else if (str[i] == '9' && str[i + 1] == '9') {
flag = 2;
break;
}
}
if (flag != 0 && i != 0) {
decimal_part = round(decimal_part / pow(10, 5 - i));
value->value.value.d64 =
(double) integer_part + decimal_part / pow(10, i);
} else {
value->value.value.d64 = (double) integer_part + decimal_part / scale;
}

value->value.value.d64 *= negative;
}

static void write_response(neu_adapter_t *adapter, void *r, neu_error error)
{
neu_reqresp_head_t *req = (neu_reqresp_head_t *) r;
Expand Down Expand Up @@ -1834,6 +1872,9 @@ static void read_report_group(int64_t timestamp, int64_t timeout,
break;
}
}
if (tag->precision == 0 && tag->type == NEU_TYPE_DOUBLE) {
format_tag_value(&tag_value);
}
}

utarray_push_back(tag_values, &tag_value);
Expand Down Expand Up @@ -1989,6 +2030,10 @@ static void read_group(int64_t timestamp, int64_t timeout,
break;
}
}

if (tag->precision == 0 && tag->type == NEU_TYPE_DOUBLE) {
format_tag_value(&tag_value);
}
}
utarray_push_back(tag_values, &tag_value);
}
Expand Down
58 changes: 53 additions & 5 deletions src/utils/json.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
**/

#include <math.h>
#include <stdlib.h>
#include <string.h>

Expand All @@ -25,6 +26,44 @@
#include "utils/log.h"
#include "json/json.h"

static double format_tag_value(float ele_value)
{
double scale = pow(10, 5);
double value = ele_value;
int negative = 1;

if (value < 0) {
value *= -1;
negative = -1;
}

int64_t integer_part = (int64_t)(value);
double decimal_part = value - integer_part;
decimal_part *= scale;
decimal_part = round(decimal_part);

char str[6] = { 0 };
snprintf(str, sizeof(str), "%05" PRId64 "", (int64_t) decimal_part);
int i = 0, flag = 0;
for (; i < 4; i++) {
if (str[i] == '0' && str[i + 1] == '0') {
flag = 1;
break;
} else if (str[i] == '9' && str[i + 1] == '9') {
flag = 2;
break;
}
}
if (flag != 0 && i != 0) {
decimal_part = round(decimal_part / pow(10, 5 - i));
value = (double) integer_part + decimal_part / pow(10, i);
} else {
value = (double) integer_part + decimal_part / scale;
}

return value * negative;
}

static json_t *encode_object_value(neu_json_elem_t *ele)
{
json_t *ob = NULL;
Expand All @@ -42,9 +81,14 @@ static json_t *encode_object_value(neu_json_elem_t *ele)
case NEU_JSON_DOUBLE:
ob = json_realp(ele->v.val_double, ele->precision);
break;
case NEU_JSON_FLOAT:
ob = json_realp(ele->v.val_float, ele->precision);
case NEU_JSON_FLOAT: {
double t = ele->v.val_float;
if (ele->precision == 0) {
t = format_tag_value(ele->v.val_float);
}
ob = json_realp(t, ele->precision);
break;
}
case NEU_JSON_BOOL:
ob = json_boolean(ele->v.val_bool);
break;
Expand All @@ -69,10 +113,14 @@ static json_t *encode_object(json_t *object, neu_json_elem_t ele)
case NEU_JSON_STR:
json_object_set_new(ob, ele.name, json_string(ele.v.val_str));
break;
case NEU_JSON_FLOAT:
json_object_set_new(ob, ele.name,
json_realp(ele.v.val_float, ele.precision));
case NEU_JSON_FLOAT: {
double t = ele.v.val_float;
if (ele.precision == 0) {
t = format_tag_value(ele.v.val_float);
}
json_object_set_new(ob, ele.name, json_realp(t, ele.precision));
break;
}
case NEU_JSON_DOUBLE:
json_object_set_new(ob, ele.name,
json_realp(ele.v.val_double, ele.precision));
Expand Down

0 comments on commit b3a652a

Please sign in to comment.