/*
* Copyright (c) 2002-2017 "Neo Technology,"
* Network Engine for Objects in Lund AB [http://neotechnology.com]
*
* This file is part of Neo4j.
*
* Licensed 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.
*/
package org.neo4j.driver.internal.cluster;
import java.util.List;
import org.neo4j.driver.internal.NetworkSession;
import org.neo4j.driver.internal.spi.Connection;
import org.neo4j.driver.v1.Record;
import org.neo4j.driver.v1.Statement;
import static org.neo4j.driver.internal.SessionResourcesHandler.NO_OP;
import static org.neo4j.driver.internal.util.ServerVersion.v3_2_0;
import static org.neo4j.driver.internal.util.ServerVersion.version;
import static org.neo4j.driver.v1.Values.parameters;
public class RoutingProcedureRunner
{
static final String GET_SERVERS = "dbms.cluster.routing.getServers";
static final String GET_ROUTING_TABLE_PARAM = "context";
static final String GET_ROUTING_TABLE = "dbms.cluster.routing.getRoutingTable({" + GET_ROUTING_TABLE_PARAM + "})";
private final RoutingContext context;
private Statement invokedProcedure;
public RoutingProcedureRunner( RoutingContext context )
{
this.context = context;
}
public List<Record> run( Connection connection )
{
if( version( connection.server().version() ).greaterThanOrEqual( v3_2_0 ) )
{
invokedProcedure = new Statement( "CALL " + GET_ROUTING_TABLE,
parameters( GET_ROUTING_TABLE_PARAM, context.asMap() ) );
}
else
{
invokedProcedure = new Statement( "CALL " + GET_SERVERS );
}
return runProcedure( connection, invokedProcedure );
}
List<Record> runProcedure( Connection connection, Statement procedure )
{
return NetworkSession.run( connection, procedure, NO_OP ).list();
}
Statement invokedProcedure()
{
return invokedProcedure;
}
}