reifydb-engine 0.10.0

Query execution and processing engine for ReifyDB
Documentation
// SPDX-License-Identifier: Apache-2.0
// Copyright (c) 2026 ReifyDB

use arrow_array::RecordBatch;
use reifydb_core::value::batch::single_row;
use reifydb_rql::nodes::AlterRemoteNamespaceNode;
use reifydb_transaction::transaction::{Transaction, admin::AdminTransaction};
use reifydb_value::value::Value;

use crate::{Result, vm::services::Services};

pub(crate) fn alter_remote_namespace(
	services: &Services,
	txn: &mut AdminTransaction,
	plan: AlterRemoteNamespaceNode,
) -> Result<RecordBatch> {
	let ns_name = plan.namespace.text();
	let ns_def = services.catalog.get_namespace_by_name(&mut Transaction::Admin(txn), ns_name)?;
	let grpc_text = plan.grpc.text().to_string();

	services.catalog.update_namespace_grpc(txn, ns_def.id(), Some(grpc_text))?;

	single_row([("namespace", Value::Utf8(ns_name.to_string())), ("altered", Value::Boolean(true))])
}

#[cfg(test)]
pub mod tests {
	use reifydb_test_harness::engine::create_test_admin_transaction;
	use reifydb_value::{
		params::Params,
		value::{Value, column_view::ColumnView, frame::frame::Frame},
	};

	use crate::vm::{Admin, executor::Executor};

	#[test]
	fn test_alter_remote_namespace() {
		let instance = Executor::testing();
		let mut txn = create_test_admin_transaction();

		let r = instance.admin(
			&mut txn,
			Admin {
				rql: "CREATE REMOTE NAMESPACE remote_ns WITH { grpc: 'localhost:50051' }",
				params: Params::default(),
			},
		);
		if let Some(e) = r.error {
			panic!("{e:?}");
		}

		// ALTER must overwrite the endpoint in place, not register a second one.
		let r = instance.admin(
			&mut txn,
			Admin {
				rql: "ALTER REMOTE NAMESPACE remote_ns WITH { grpc: 'newhost:50051' }",
				params: Params::default(),
			},
		);
		if let Some(e) = r.error {
			panic!("{e:?}");
		}
		let frame = &r[0];

		assert_eq!(value_at(frame, 0), Value::Utf8("remote_ns".to_string()));
		assert_eq!(value_at(frame, 1), Value::Boolean(true));
	}

	fn value_at(frame: &Frame, column: usize) -> Value {
		// Positional read: without it a reordered result column would still pass.
		ColumnView::try_from((frame.batch.column(column), frame.batch.schema_ref().field(column)))
			.unwrap()
			.get_value(0)
	}
}