[Groonga-commit] groonga/groonga at 5f7809b [master] min, max: support number in vector

Zurück zum Archiv-Index

Naoya Murakami null+****@clear*****
Wed Jul 12 12:22:33 JST 2017


Naoya Murakami	2017-07-12 12:22:33 +0900 (Wed, 12 Jul 2017)

  New Revision: 5f7809b7f2f92a2f97553108c5acb3c4328cf9cf
  https://github.com/groonga/groonga/commit/5f7809b7f2f92a2f97553108c5acb3c4328cf9cf

  Merged ef59b31: Merge pull request #735 from naoa/min-max-vector

  Message:
    min,max: support number in vector

  Added files:
    test/command/suite/select/function/max/reference_vector_time.expected
    test/command/suite/select/function/max/reference_vector_time.test
    test/command/suite/select/function/max/vector_time.expected
    test/command/suite/select/function/max/vector_time.test
    test/command/suite/select/function/min/reference_vector_time.expected
    test/command/suite/select/function/min/reference_vector_time.test
    test/command/suite/select/function/min/vector_time.expected
    test/command/suite/select/function/min/vector_time.test
  Modified files:
    lib/proc.c

  Modified: lib/proc.c (+181 -60)
===================================================================
--- lib/proc.c    2017-07-12 10:41:15 +0900 (29add30)
+++ lib/proc.c    2017-07-12 12:22:33 +0900 (a151ab4)
@@ -1482,6 +1482,93 @@ compare_number(grn_ctx *ctx, grn_obj *number1, grn_obj *number2, grn_id type)
 #undef COMPARE_AND_RETURN
 }
 
+inline static void
+get_number_in_grn_uvector(grn_ctx *ctx, grn_obj *uvector, unsigned int offset,
+                          grn_obj *buf)
+{
+#define GET_UVECTOR_ELEMENT_AS(type) do {                            \
+  GRN_ ## type ## _SET(ctx,                                          \
+                       buf,                                          \
+                       GRN_ ## type ## _VALUE_AT(uvector, offset));  \
+  } while (GRN_FALSE)
+  switch (uvector->header.domain) {
+  case GRN_DB_BOOL :
+    GET_UVECTOR_ELEMENT_AS(BOOL);
+    break;
+  case GRN_DB_INT8 :
+    GET_UVECTOR_ELEMENT_AS(INT8);
+    break;
+  case GRN_DB_UINT8 :
+    GET_UVECTOR_ELEMENT_AS(UINT8);
+    break;
+  case GRN_DB_INT16 :
+    GET_UVECTOR_ELEMENT_AS(INT16);
+    break;
+  case GRN_DB_UINT16 :
+    GET_UVECTOR_ELEMENT_AS(UINT16);
+    break;
+  case GRN_DB_INT32 :
+    GET_UVECTOR_ELEMENT_AS(INT32);
+    break;
+  case GRN_DB_UINT32 :
+    GET_UVECTOR_ELEMENT_AS(UINT32);
+    break;
+  case GRN_DB_INT64 :
+    GET_UVECTOR_ELEMENT_AS(INT64);
+    break;
+  case GRN_DB_UINT64 :
+    GET_UVECTOR_ELEMENT_AS(UINT64);
+    break;
+  case GRN_DB_FLOAT :
+    GET_UVECTOR_ELEMENT_AS(FLOAT);
+    break;
+  case GRN_DB_TIME :
+    GET_UVECTOR_ELEMENT_AS(TIME);
+    break;
+  default :
+    GET_UVECTOR_ELEMENT_AS(RECORD);
+    break;
+  }
+#undef GET_UVECTOR_ELEMENT_AS
+}
+
+inline static void
+apply_max(grn_ctx *ctx, grn_obj *number, grn_obj *max,
+          grn_obj *casted_number, grn_obj *casted_max, grn_id cast_type)
+{
+  grn_id domain = number->header.domain;
+  if (!is_comparable_number_type(domain)) {
+    return;
+  }
+  cast_type = larger_number_type(cast_type, domain);
+  if (!number_safe_cast(ctx, number, casted_number, cast_type)) {
+    return;
+  }
+  if (max->header.domain == GRN_DB_VOID) {
+    grn_obj_reinit(ctx, max, cast_type, 0);
+    GRN_TEXT_SET(ctx, max,
+                 GRN_TEXT_VALUE(casted_number),
+                 GRN_TEXT_LEN(casted_number));
+    return;
+  }
+
+  if (max->header.domain != cast_type) {
+    if (!number_safe_cast(ctx, max, casted_max, cast_type)) {
+      return;
+    }
+    grn_obj_reinit(ctx, max, cast_type, 0);
+    GRN_TEXT_SET(ctx, max,
+                 GRN_TEXT_VALUE(casted_max),
+                 GRN_TEXT_LEN(casted_max));
+  }
+  if (compare_number(ctx, casted_number, max, cast_type) > 0) {
+    grn_obj_reinit(ctx, max, cast_type, 0);
+    GRN_TEXT_SET(ctx, max,
+                 GRN_TEXT_VALUE(casted_number),
+                 GRN_TEXT_LEN(casted_number));
+  }
+}
+
 static grn_obj *
 func_max(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_data)
 {
@@ -1497,38 +1584,37 @@ func_max(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_data)
 
   GRN_VOID_INIT(&casted_max);
   GRN_VOID_INIT(&casted_number);
-  for (i = 0; i < nargs; i++) {
-    grn_obj *number = args[i];
-    grn_id domain = number->header.domain;
-    if (!is_comparable_number_type(domain)) {
-      continue;
-    }
-    cast_type = larger_number_type(cast_type, domain);
-    if (!number_safe_cast(ctx, number, &casted_number, cast_type)) {
-      continue;
-    }
-    if (max->header.domain == GRN_DB_VOID) {
-      grn_obj_reinit(ctx, max, cast_type, 0);
-      GRN_TEXT_SET(ctx, max,
-                   GRN_TEXT_VALUE(&casted_number),
-                   GRN_TEXT_LEN(&casted_number));
-      continue;
-    }
 
-    if (max->header.domain != cast_type) {
-      if (!number_safe_cast(ctx, max, &casted_max, cast_type)) {
-        continue;
+  for (i = 0; i < nargs; i++) {
+    switch (args[i]->header.type) {
+    case GRN_BULK :
+      apply_max(ctx, args[i], max, &casted_number, &casted_max, cast_type);
+      break;
+    case GRN_UVECTOR :
+      {
+        unsigned int j;
+        unsigned int n_elements;
+        grn_obj number_in_uvector;
+        grn_obj *domain;
+
+        domain = grn_ctx_at(ctx, args[i]->header.domain);
+        GRN_OBJ_INIT(&number_in_uvector, GRN_BULK, 0, args[i]->header.domain);
+        n_elements = grn_uvector_size(ctx, args[i]);
+        for (j = 0; j < n_elements; j++) {
+          get_number_in_grn_uvector(ctx, args[i], j, &number_in_uvector);
+          if (grn_obj_is_table(ctx, domain)) {
+            grn_obj_reinit(ctx, &number_in_uvector, domain->header.domain, 0);
+            grn_table_get_key2(ctx, domain,
+                               GRN_RECORD_VALUE(&number_in_uvector),
+                               &number_in_uvector);
+          }
+          apply_max(ctx, &number_in_uvector, max, &casted_number, &casted_max, cast_type);
+        }
+        GRN_OBJ_FIN(ctx, &number_in_uvector);
       }
-      grn_obj_reinit(ctx, max, cast_type, 0);
-      GRN_TEXT_SET(ctx, max,
-                   GRN_TEXT_VALUE(&casted_max),
-                   GRN_TEXT_LEN(&casted_max));
-    }
-    if (compare_number(ctx, &casted_number, max, cast_type) > 0) {
-      grn_obj_reinit(ctx, max, cast_type, 0);
-      GRN_TEXT_SET(ctx, max,
-                   GRN_TEXT_VALUE(&casted_number),
-                   GRN_TEXT_LEN(&casted_number));
+      break;
+    default :
+      continue;
     }
   }
   GRN_OBJ_FIN(ctx, &casted_max);
@@ -1537,6 +1623,43 @@ func_max(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_data)
   return max;
 }
 
+static void
+apply_min(grn_ctx *ctx, grn_obj *number, grn_obj *min,
+          grn_obj *casted_number, grn_obj *casted_min, grn_id cast_type)
+{
+  grn_id domain = number->header.domain;
+  if (!is_comparable_number_type(domain)) {
+    return;
+  }
+  cast_type = smaller_number_type(cast_type, domain);
+  if (!number_safe_cast(ctx, number, casted_number, cast_type)) {
+    return;
+  }
+  if (min->header.domain == GRN_DB_VOID) {
+    grn_obj_reinit(ctx, min, cast_type, 0);
+    GRN_TEXT_SET(ctx, min,
+                 GRN_TEXT_VALUE(casted_number),
+                 GRN_TEXT_LEN(casted_number));
+    return;
+  }
+
+  if (min->header.domain != cast_type) {
+    if (!number_safe_cast(ctx, min, casted_min, cast_type)) {
+      return;
+    }
+    grn_obj_reinit(ctx, min, cast_type, 0);
+    GRN_TEXT_SET(ctx, min,
+                 GRN_TEXT_VALUE(casted_min),
+                 GRN_TEXT_LEN(casted_min));
+  }
+  if (compare_number(ctx, casted_number, min, cast_type) < 0) {
+    grn_obj_reinit(ctx, min, cast_type, 0);
+    GRN_TEXT_SET(ctx, min,
+                 GRN_TEXT_VALUE(casted_number),
+                 GRN_TEXT_LEN(casted_number));
+  }
+}
+
 static grn_obj *
 func_min(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_data)
 {
@@ -1553,37 +1676,35 @@ func_min(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_data)
   GRN_VOID_INIT(&casted_min);
   GRN_VOID_INIT(&casted_number);
   for (i = 0; i < nargs; i++) {
-    grn_obj *number = args[i];
-    grn_id domain = number->header.domain;
-    if (!is_comparable_number_type(domain)) {
-      continue;
-    }
-    cast_type = smaller_number_type(cast_type, domain);
-    if (!number_safe_cast(ctx, number, &casted_number, cast_type)) {
-      continue;
-    }
-    if (min->header.domain == GRN_DB_VOID) {
-      grn_obj_reinit(ctx, min, cast_type, 0);
-      GRN_TEXT_SET(ctx, min,
-                   GRN_TEXT_VALUE(&casted_number),
-                   GRN_TEXT_LEN(&casted_number));
-      continue;
-    }
-
-    if (min->header.domain != cast_type) {
-      if (!number_safe_cast(ctx, min, &casted_min, cast_type)) {
-        continue;
+    switch (args[i]->header.type) {
+    case GRN_BULK :
+      apply_min(ctx, args[i], min, &casted_number, &casted_min, cast_type);
+      break;
+    case GRN_UVECTOR :
+      {
+        unsigned int j;
+        unsigned int n_elements;
+        grn_obj number_in_uvector;
+        grn_obj *domain;
+
+        domain = grn_ctx_at(ctx, args[i]->header.domain);
+        GRN_OBJ_INIT(&number_in_uvector, GRN_BULK, 0, args[i]->header.domain);
+        n_elements = grn_uvector_size(ctx, args[i]);
+        for (j = 0; j < n_elements; j++) {
+          get_number_in_grn_uvector(ctx, args[i], j, &number_in_uvector);
+          if (grn_obj_is_table(ctx, domain)) {
+            grn_obj_reinit(ctx, &number_in_uvector, domain->header.domain, 0);
+            grn_table_get_key2(ctx, domain,
+                               GRN_RECORD_VALUE(&number_in_uvector),
+                               &number_in_uvector);
+          }
+          apply_min(ctx, &number_in_uvector, min, &casted_number, &casted_min, cast_type);
+        }
+        GRN_OBJ_FIN(ctx, &number_in_uvector);
       }
-      grn_obj_reinit(ctx, min, cast_type, 0);
-      GRN_TEXT_SET(ctx, min,
-                   GRN_TEXT_VALUE(&casted_min),
-                   GRN_TEXT_LEN(&casted_min));
-    }
-    if (compare_number(ctx, &casted_number, min, cast_type) < 0) {
-      grn_obj_reinit(ctx, min, cast_type, 0);
-      GRN_TEXT_SET(ctx, min,
-                   GRN_TEXT_VALUE(&casted_number),
-                   GRN_TEXT_LEN(&casted_number));
+      break;
+    default :
+      continue;
     }
   }
   GRN_OBJ_FIN(ctx, &casted_min);

  Added: test/command/suite/select/function/max/reference_vector_time.expected (+13 -0) 100644
===================================================================
--- /dev/null
+++ test/command/suite/select/function/max/reference_vector_time.expected    2017-07-12 12:22:33 +0900 (2f9ac22)
@@ -0,0 +1,13 @@
+table_create Dates TABLE_PAT_KEY Time
+[[0,0.0,0.0],true]
+table_create Values TABLE_NO_KEY
+[[0,0.0,0.0],true]
+column_create Values time_values COLUMN_VECTOR Dates
+[[0,0.0,0.0],true]
+load --table Values
+[
+{"time_values": ["2017-07-12 00:00:00", "2017-05-12 00:00:00"]}
+]
+[[0,0.0,0.0],1]
+select Values   --filter true   --output_columns '_id, max(time_values, "2017-06-12 00:00:00")'
+[[0,0.0,0.0],[[[1],[["_id","UInt32"],["max",null]],[1,1499785200.0]]]]

  Added: test/command/suite/select/function/max/reference_vector_time.test (+13 -0) 100644
===================================================================
--- /dev/null
+++ test/command/suite/select/function/max/reference_vector_time.test    2017-07-12 12:22:33 +0900 (0c3ae27)
@@ -0,0 +1,13 @@
+table_create Dates TABLE_PAT_KEY Time
+
+table_create Values TABLE_NO_KEY
+column_create Values time_values COLUMN_VECTOR Dates
+
+load --table Values
+[
+{"time_values": ["2017-07-12 00:00:00", "2017-05-12 00:00:00"]}
+]
+
+select Values \
+  --filter true \
+  --output_columns '_id, max(time_values, "2017-06-12 00:00:00")'

  Added: test/command/suite/select/function/max/vector_time.expected (+11 -0) 100644
===================================================================
--- /dev/null
+++ test/command/suite/select/function/max/vector_time.expected    2017-07-12 12:22:33 +0900 (cc0f42b)
@@ -0,0 +1,11 @@
+table_create Values TABLE_NO_KEY
+[[0,0.0,0.0],true]
+column_create Values time_values COLUMN_VECTOR Time
+[[0,0.0,0.0],true]
+load --table Values
+[
+{"time_values": ["2017-07-12 00:00:00", "2017-05-12 00:00:00"]}
+]
+[[0,0.0,0.0],1]
+select Values   --filter true   --output_columns '_id, max(time_values, "2017-06-12 00:00:00")'
+[[0,0.0,0.0],[[[1],[["_id","UInt32"],["max",null]],[1,1499785200.0]]]]

  Added: test/command/suite/select/function/max/vector_time.test (+11 -0) 100644
===================================================================
--- /dev/null
+++ test/command/suite/select/function/max/vector_time.test    2017-07-12 12:22:33 +0900 (ff08a26)
@@ -0,0 +1,11 @@
+table_create Values TABLE_NO_KEY
+column_create Values time_values COLUMN_VECTOR Time
+
+load --table Values
+[
+{"time_values": ["2017-07-12 00:00:00", "2017-05-12 00:00:00"]}
+]
+
+select Values \
+  --filter true \
+  --output_columns '_id, max(time_values, "2017-06-12 00:00:00")'

  Added: test/command/suite/select/function/min/reference_vector_time.expected (+13 -0) 100644
===================================================================
--- /dev/null
+++ test/command/suite/select/function/min/reference_vector_time.expected    2017-07-12 12:22:33 +0900 (1f08b2f)
@@ -0,0 +1,13 @@
+table_create Dates TABLE_PAT_KEY Time
+[[0,0.0,0.0],true]
+table_create Values TABLE_NO_KEY
+[[0,0.0,0.0],true]
+column_create Values time_values COLUMN_VECTOR Dates
+[[0,0.0,0.0],true]
+load --table Values
+[
+{"time_values": ["2017-07-12 00:00:00", "2017-05-12 00:00:00"]}
+]
+[[0,0.0,0.0],1]
+select Values   --filter true   --output_columns '_id, min(time_values, "2017-06-12 00:00:00")'
+[[0,0.0,0.0],[[[1],[["_id","UInt32"],["min",null]],[1,1494514800.0]]]]

  Added: test/command/suite/select/function/min/reference_vector_time.test (+13 -0) 100644
===================================================================
--- /dev/null
+++ test/command/suite/select/function/min/reference_vector_time.test    2017-07-12 12:22:33 +0900 (cdac70b)
@@ -0,0 +1,13 @@
+table_create Dates TABLE_PAT_KEY Time
+
+table_create Values TABLE_NO_KEY
+column_create Values time_values COLUMN_VECTOR Dates
+
+load --table Values
+[
+{"time_values": ["2017-07-12 00:00:00", "2017-05-12 00:00:00"]}
+]
+
+select Values \
+  --filter true \
+  --output_columns '_id, min(time_values, "2017-06-12 00:00:00")'

  Added: test/command/suite/select/function/min/vector_time.expected (+11 -0) 100644
===================================================================
--- /dev/null
+++ test/command/suite/select/function/min/vector_time.expected    2017-07-12 12:22:33 +0900 (dfa2ae4)
@@ -0,0 +1,11 @@
+table_create Values TABLE_NO_KEY
+[[0,0.0,0.0],true]
+column_create Values time_values COLUMN_VECTOR Time
+[[0,0.0,0.0],true]
+load --table Values
+[
+{"time_values": ["2017-07-12 00:00:00", "2017-05-12 00:00:00"]}
+]
+[[0,0.0,0.0],1]
+select Values   --filter true   --output_columns '_id, min(time_values, "2017-06-12 00:00:00")'
+[[0,0.0,0.0],[[[1],[["_id","UInt32"],["min",null]],[1,1494514800.0]]]]

  Added: test/command/suite/select/function/min/vector_time.test (+11 -0) 100644
===================================================================
--- /dev/null
+++ test/command/suite/select/function/min/vector_time.test    2017-07-12 12:22:33 +0900 (3aaace7)
@@ -0,0 +1,11 @@
+table_create Values TABLE_NO_KEY
+column_create Values time_values COLUMN_VECTOR Time
+
+load --table Values
+[
+{"time_values": ["2017-07-12 00:00:00", "2017-05-12 00:00:00"]}
+]
+
+select Values \
+  --filter true \
+  --output_columns '_id, min(time_values, "2017-06-12 00:00:00")'
-------------- next part --------------
HTML����������������������������...
Download 



More information about the Groonga-commit mailing list
Zurück zum Archiv-Index