]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/arrow/c_glib/gandiva-glib/filter.cpp
import quincy 17.2.0
[ceph.git] / ceph / src / arrow / c_glib / gandiva-glib / filter.cpp
diff --git a/ceph/src/arrow/c_glib/gandiva-glib/filter.cpp b/ceph/src/arrow/c_glib/gandiva-glib/filter.cpp
new file mode 100644 (file)
index 0000000..baed699
--- /dev/null
@@ -0,0 +1,257 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#include <limits>
+
+#include <arrow-glib/basic-array.hpp>
+#include <arrow-glib/error.hpp>
+#include <arrow-glib/record-batch.hpp>
+#include <arrow-glib/schema.hpp>
+
+#include <gandiva-glib/expression.hpp>
+#include <gandiva-glib/filter.hpp>
+#include <gandiva-glib/selection-vector.hpp>
+
+G_BEGIN_DECLS
+
+/**
+ * SECTION: filter
+ * @title: Filter classes
+ * @include: gandiva-glib/gandiva-glib.h
+ *
+ * #GGandivaFilter is a class for selecting records by a specific
+ * condition.
+ *
+ * Since: 4.0.0
+ */
+
+typedef struct GGandivaFilterPrivate_ {
+  std::shared_ptr<gandiva::Filter> filter;
+  GArrowSchema *schema;
+  GGandivaCondition *condition;
+} GGandivaFilterPrivate;
+
+enum {
+  PROP_FILTER = 1,
+  PROP_SCHEMA,
+  PROP_CONDITION,
+};
+
+G_DEFINE_TYPE_WITH_PRIVATE(GGandivaFilter,
+                           ggandiva_filter,
+                           G_TYPE_OBJECT)
+
+#define GGANDIVA_FILTER_GET_PRIVATE(obj)         \
+  static_cast<GGandivaFilterPrivate *>(          \
+     ggandiva_filter_get_instance_private(       \
+       GGANDIVA_FILTER(obj)))
+
+static void
+ggandiva_filter_dispose(GObject *object)
+{
+  auto priv = GGANDIVA_FILTER_GET_PRIVATE(object);
+
+  if (priv->schema) {
+    g_object_unref(priv->schema);
+    priv->schema = nullptr;
+  }
+
+  if (priv->condition) {
+    g_object_unref(priv->condition);
+    priv->condition = nullptr;
+  }
+
+  G_OBJECT_CLASS(ggandiva_filter_parent_class)->dispose(object);
+}
+
+static void
+ggandiva_filter_finalize(GObject *object)
+{
+  auto priv = GGANDIVA_FILTER_GET_PRIVATE(object);
+
+  priv->filter.~shared_ptr();
+
+  G_OBJECT_CLASS(ggandiva_filter_parent_class)->finalize(object);
+}
+
+static void
+ggandiva_filter_set_property(GObject *object,
+                             guint prop_id,
+                             const GValue *value,
+                             GParamSpec *pspec)
+{
+  auto priv = GGANDIVA_FILTER_GET_PRIVATE(object);
+
+  switch (prop_id) {
+  case PROP_FILTER:
+    priv->filter =
+      *static_cast<std::shared_ptr<gandiva::Filter> *>(g_value_get_pointer(value));
+    break;
+  case PROP_SCHEMA:
+    priv->schema = GARROW_SCHEMA(g_value_dup_object(value));
+    break;
+  case PROP_CONDITION:
+    priv->condition = GGANDIVA_CONDITION(g_value_dup_object(value));
+    break;
+  default:
+    G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
+    break;
+  }
+}
+
+static void
+ggandiva_filter_get_property(GObject *object,
+                             guint prop_id,
+                             GValue *value,
+                             GParamSpec *pspec)
+{
+  auto priv = GGANDIVA_FILTER_GET_PRIVATE(object);
+
+  switch (prop_id) {
+  case PROP_SCHEMA:
+    g_value_set_object(value, priv->schema);
+    break;
+  case PROP_CONDITION:
+    g_value_set_object(value, priv->condition);
+    break;
+  default:
+    G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
+    break;
+  }
+}
+
+static void
+ggandiva_filter_init(GGandivaFilter *object)
+{
+  auto priv = GGANDIVA_FILTER_GET_PRIVATE(object);
+  new(&priv->filter) std::shared_ptr<gandiva::Filter>;
+}
+
+static void
+ggandiva_filter_class_init(GGandivaFilterClass *klass)
+{
+  auto gobject_class = G_OBJECT_CLASS(klass);
+
+  gobject_class->dispose      = ggandiva_filter_dispose;
+  gobject_class->finalize     = ggandiva_filter_finalize;
+  gobject_class->set_property = ggandiva_filter_set_property;
+  gobject_class->get_property = ggandiva_filter_get_property;
+
+  GParamSpec *spec;
+  spec = g_param_spec_pointer("filter",
+                              "Filter",
+                              "The raw std::shared<gandiva::Filter> *",
+                              static_cast<GParamFlags>(G_PARAM_WRITABLE |
+                                                       G_PARAM_CONSTRUCT_ONLY));
+  g_object_class_install_property(gobject_class, PROP_FILTER, spec);
+
+  spec = g_param_spec_object("schema",
+                             "Schema",
+                             "The schema for input record batch",
+                             GARROW_TYPE_SCHEMA,
+                             static_cast<GParamFlags>(G_PARAM_READWRITE |
+                                                      G_PARAM_CONSTRUCT_ONLY));
+  g_object_class_install_property(gobject_class, PROP_SCHEMA, spec);
+
+  spec = g_param_spec_object("condition",
+                             "Condition",
+                             "The condition for the filter",
+                             GGANDIVA_TYPE_CONDITION,
+                             static_cast<GParamFlags>(G_PARAM_READWRITE |
+                                                      G_PARAM_CONSTRUCT_ONLY));
+  g_object_class_install_property(gobject_class, PROP_CONDITION, spec);
+}
+
+/**
+ * ggandiva_filter_new:
+ * @schema: A #GArrowSchema.
+ * @condition: The condition to be used.
+ * @error: (nullable): Return location for a #GError or %NULL.
+ *
+ * Returns: (nullable): A newly created #GGandivaFilter on success,
+ *   %NULL on error.
+ *
+ * Since: 4.0.0
+ */
+GGandivaFilter *
+ggandiva_filter_new(GArrowSchema *schema,
+                    GGandivaCondition *condition,
+                    GError **error)
+{
+  auto arrow_schema = garrow_schema_get_raw(schema);
+  auto gandiva_condition = ggandiva_condition_get_raw(condition);
+  std::shared_ptr<gandiva::Filter> gandiva_filter;
+  auto status = gandiva::Filter::Make(arrow_schema,
+                                      gandiva_condition,
+                                      &gandiva_filter);
+  if (garrow_error_check(error, status, "[gandiva][filter][new]")) {
+    return ggandiva_filter_new_raw(&gandiva_filter, schema, condition);
+  } else {
+    return NULL;
+  }
+}
+
+/**
+ * ggandiva_filter_evaluate:
+ * @filter: A #GGandivaFilter.
+ * @record_batch: A #GArrowRecordBatch.
+ * @selection_vector: A #GGandivaSelectionVector that is used as
+ *   output.
+ * @error: (nullable): Return location for a #GError or %NULL.
+ *
+ * Returns: %TRUE on success, %FALSE otherwise.
+ *
+ * Since: 4.0.0
+ */
+gboolean
+ggandiva_filter_evaluate(GGandivaFilter *filter,
+                         GArrowRecordBatch *record_batch,
+                         GGandivaSelectionVector *selection_vector,
+                         GError **error)
+{
+  auto gandiva_filter = ggandiva_filter_get_raw(filter);
+  auto arrow_record_batch = garrow_record_batch_get_raw(record_batch);
+  auto gandiva_selection_vector =
+    ggandiva_selection_vector_get_raw(selection_vector);
+  auto status = gandiva_filter->Evaluate(*arrow_record_batch,
+                                         gandiva_selection_vector);
+  return garrow_error_check(error, status, "[gandiva][filter][evaluate]");
+}
+
+G_END_DECLS
+
+GGandivaFilter *
+ggandiva_filter_new_raw(std::shared_ptr<gandiva::Filter> *gandiva_filter,
+                        GArrowSchema *schema,
+                        GGandivaCondition *condition)
+{
+  auto filter = g_object_new(GGANDIVA_TYPE_FILTER,
+                             "filter", gandiva_filter,
+                             "schema", schema,
+                             "condition", condition,
+                             NULL);
+  return GGANDIVA_FILTER(filter);
+}
+
+std::shared_ptr<gandiva::Filter>
+ggandiva_filter_get_raw(GGandivaFilter *filter)
+{
+  auto priv = GGANDIVA_FILTER_GET_PRIVATE(filter);
+  return priv->filter;
+}