diff --git a/src/main/java/com/nebulagraphql/AutoGenerateMain.java b/src/main/java/com/nebulagraphql/AutoGenerateMain.java index 15409d1..0515466 100644 --- a/src/main/java/com/nebulagraphql/AutoGenerateMain.java +++ b/src/main/java/com/nebulagraphql/AutoGenerateMain.java @@ -2,6 +2,8 @@ import com.google.common.collect.Lists; import com.nebulagraphql.schema.SchemaManger; +import com.nebulagraphql.session.GraphqlSessionPool; +import com.nebulagraphql.session.GraphqlSessionPoolConfig; import com.nebulagraphql.util.InitialUtil; import com.vesoft.nebula.client.graph.data.HostAddress; import graphql.ExecutionResult; @@ -19,17 +21,20 @@ public class AutoGenerateMain { public static void main(String[] args) throws UnknownHostException { logger.info("Test"); InitialUtil.initialBasketballPlayer(); - HostAddress hostAddress = new HostAddress("metad0",9559); - System.out.println("connect to metad"); - SchemaManger schemaManger = new SchemaManger(Lists.newArrayList(hostAddress)); - GraphQLSchema graphQLSchema = schemaManger.generateSchema("basketballplayer"); - SchemaPrinter schemaPrinter = new SchemaPrinter(); - String printer = schemaPrinter.print(graphQLSchema); - System.out.println(printer); - GraphQL build = GraphQL.newGraphQL(graphQLSchema).build(); - ExecutionResult executionResult = build.execute("{players(age:32){name\nage}}"); + HostAddress metadAddress = new HostAddress("metad0",9559); + HostAddress graphdAddress = new HostAddress("graphd", 9669); + String spaceName = "basketballplayer"; + String username = "root"; + String password = "nebula"; + GraphqlSessionPoolConfig graphqlSessionPoolConfig = new GraphqlSessionPoolConfig( + Lists.newArrayList(graphdAddress), + Lists.newArrayList(metadAddress), + spaceName, username, password); + graphqlSessionPoolConfig.setTimeout(3000); + GraphqlSessionPool pool = new GraphqlSessionPool(graphqlSessionPoolConfig); + ExecutionResult executionResult = pool.execute("{players(age:32){name\nage}}"); System.out.println(executionResult.getData().toString()); - ExecutionResult executionResult2 = build.execute("{players(name:\"Kobe Bryant\"){name\nage}}"); + ExecutionResult executionResult2 = pool.execute("{players(name:\"Kobe Bryant\"){name\nage}}"); System.out.println(executionResult2.getData().toString()); } } diff --git a/src/main/java/com/nebulagraphql/ngql/DataProcessor.java b/src/main/java/com/nebulagraphql/ngql/DataProcessor.java deleted file mode 100644 index 6c2aebb..0000000 --- a/src/main/java/com/nebulagraphql/ngql/DataProcessor.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.nebulagraphql.ngql; - -/** - * DataProcessor will use schema from - */ -public interface DataProcessor { - /** - * process value according field - * @param field - * @param value - * @return - */ - String process(String field,String value); -} diff --git a/src/main/java/com/nebulagraphql/ngql/DataProcessorImpl.java b/src/main/java/com/nebulagraphql/ngql/DataProcessorImpl.java deleted file mode 100644 index 79f0da4..0000000 --- a/src/main/java/com/nebulagraphql/ngql/DataProcessorImpl.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.nebulagraphql.ngql; - -import com.nebulagraphql.schema.SchemaManger; -import com.vesoft.nebula.PropertyType; - -import java.util.HashMap; -import java.util.Map; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class DataProcessorImpl implements DataProcessor{ - private static final Logger logger = LoggerFactory.getLogger(DataProcessorImpl.class); - - private final String space; - - private final String tag; - - private static final String QUOTE_PATTERN = "\"%s\""; - - public DataProcessorImpl(String space,String tag){ - this.space = space; - this.tag = tag; - } - - @Override - public String process(String field, String value) { - logger.debug("processing, key:{}, value:{}",field,value); - Map lookUp = SchemaManger.getSpaceTagsFieldsMap() - .getOrDefault(space,new HashMap<>()) - .getOrDefault(tag,new HashMap<>()); - logger.debug("lookUp table: {}",lookUp); - PropertyType propertyType = lookUp.get(field); - if(propertyType==null){ - throw new RuntimeException(); - } - //TODO support more propertyTYpe - switch (propertyType){ - case STRING: - case FIXED_STRING: - case VID: - return String.format(QUOTE_PATTERN, value); - default: - return value; - } - } -} diff --git a/src/main/java/com/nebulagraphql/schema/NebulaDataFetcher.java b/src/main/java/com/nebulagraphql/schema/NebulaDataFetcher.java index 4670f33..a85dde5 100644 --- a/src/main/java/com/nebulagraphql/schema/NebulaDataFetcher.java +++ b/src/main/java/com/nebulagraphql/schema/NebulaDataFetcher.java @@ -1,7 +1,5 @@ package com.nebulagraphql.schema; -import com.nebulagraphql.ngql.DataProcessor; -import com.nebulagraphql.ngql.DataProcessorImpl; import com.nebulagraphql.ngql.GetVerticesByProperty; import com.nebulagraphql.rsboot.ResultSetBoot; import com.nebulagraphql.rsboot.domain.Vertex; @@ -29,12 +27,10 @@ public class NebulaDataFetcher implements DataFetcher { private static final Logger logger = LoggerFactory.getLogger(NebulaDataFetcher.class); - private String space; private final SessionPool sessionPool; private MetaData metaData; - public NebulaDataFetcher(String space,SessionPool sessionPool,MetaData metaData){ - this.space = space; + public NebulaDataFetcher(SessionPool sessionPool,MetaData metaData){ this.sessionPool = sessionPool; this.metaData = metaData; } @@ -44,7 +40,6 @@ public Object get(DataFetchingEnvironment environment) throws Exception { GraphQLFieldDefinition fieldDefinition = environment.getFieldDefinition(); String field = fieldDefinition.getName(); String tagName = field.substring(0,field.length()-1); - DataProcessor dataProcessor = new DataProcessorImpl(space,tagName); Map arguments = environment.getArguments(); logger.debug("arguments:{}",arguments); Map properties = arguments.entrySet().stream() @@ -67,8 +62,6 @@ public Object get(DataFetchingEnvironment environment) throws Exception { } catch (IOErrorException | ClientServerIncompatibleException | AuthFailedException | BindSpaceFailedException e) { e.printStackTrace(); System.exit(1); - } finally { - sessionPool.close(); } return null; } diff --git a/src/main/java/com/nebulagraphql/schema/SchemaManger.java b/src/main/java/com/nebulagraphql/schema/SchemaManger.java index 9c6e785..39c16a3 100644 --- a/src/main/java/com/nebulagraphql/schema/SchemaManger.java +++ b/src/main/java/com/nebulagraphql/schema/SchemaManger.java @@ -1,5 +1,6 @@ package com.nebulagraphql.schema; +import com.nebulagraphql.session.MetaData; import com.nebulagraphql.util.SchemaUtils; import com.vesoft.nebula.PropertyType; import com.vesoft.nebula.client.graph.SessionPool; @@ -26,24 +27,18 @@ public class SchemaManger { private final MetaClient metaClient; - private static final Map>> spaceTagsFieldsMap = new HashMap<>(); - public SchemaManger(List addresses) throws UnknownHostException { this.metaClient = new MetaClient(addresses,30000,3,3); } - public static Map>> getSpaceTagsFieldsMap() { - return spaceTagsFieldsMap; - } - - public GraphQLSchema generateSchema(String space,SessionPool sessionPool) { + public GraphQLSchema generateSchema(String space,SessionPool sessionPool,MetaData metaData) { logger.debug("Generating graphql schema from space: {}",space); try { metaClient.connect(); List tags = metaClient.getTags(space); GraphQLObjectType.Builder queryTypeBuilder = GraphQLObjectType.newObject(); GraphQLCodeRegistry.Builder codeRegistryBuilder = GraphQLCodeRegistry.newCodeRegistry(); - DataFetcher propertyDataFetcher = new NebulaDataFetcher(space,sessionPool); + DataFetcher propertyDataFetcher = new NebulaDataFetcher(sessionPool,metaData); queryTypeBuilder.name("Query"); Map> tagsFieldsMap = new HashMap<>(); for (TagItem tag : tags) { @@ -97,8 +92,6 @@ public GraphQLSchema generateSchema(String space,SessionPool sessionPool) { codeRegistryBuilder.dataFetcher(FieldCoordinates.coordinates("Query", tagName + "s"), propertyDataFetcher); logger.debug("Generate tag schema success, tagName: {}",tagName); } - spaceTagsFieldsMap.put(space, tagsFieldsMap); - logger.debug("Generated spaceTagsFieldsMap: {}", spaceTagsFieldsMap); GraphQLCodeRegistry codeRegistry = codeRegistryBuilder.build(); GraphQLObjectType queryType = queryTypeBuilder.build(); GraphQLSchema graphQLSchema = GraphQLSchema.newSchema() diff --git a/src/main/java/com/nebulagraphql/session/GraphqlSessionPool.java b/src/main/java/com/nebulagraphql/session/GraphqlSessionPool.java index f6c5d74..00ccaf1 100644 --- a/src/main/java/com/nebulagraphql/session/GraphqlSessionPool.java +++ b/src/main/java/com/nebulagraphql/session/GraphqlSessionPool.java @@ -20,6 +20,7 @@ import com.vesoft.nebula.meta.Schema; import com.vesoft.nebula.meta.TagItem; +import graphql.ExecutionResult; import graphql.GraphQL; import graphql.schema.GraphQLSchema; @@ -32,29 +33,38 @@ public class GraphqlSessionPool { private final GraphQL build; private final GraphQLSchema graphQLSchema; - private final MetaData metaData; + private MetaData metaData; public GraphqlSessionPool(GraphqlSessionPoolConfig config) throws UnknownHostException{ - this.metaData = getMetaData(config.getMetadAddress(), config.getSpaceName(), config.getTimeout(), 3, 3); - + getMetaData(config.getMetadAddress(), config.getSpaceName(), config.getTimeout(), 3, 3); sessionPool = new SessionPool(config.getSessionPoolConfig()); + sessionPool.init(); SchemaManger schemaManger = new SchemaManger(config.getMetadAddress()); - graphQLSchema = schemaManger.generateSchema(config.getSpaceName(),sessionPool); + graphQLSchema = schemaManger.generateSchema(config.getSpaceName(),sessionPool,metaData); build = GraphQL.newGraphQL(graphQLSchema).build(); } - private MetaData getMetaData(List addresses,String spaceName,int timeout,int connectionRetry,int executionRetry) throws UnknownHostException{ + public ExecutionResult execute(String statement){ + return build.execute(statement); + } + + public void close(){ + sessionPool.close(); + } + + private void getMetaData(List addresses,String spaceName,int timeout,int connectionRetry,int executionRetry) throws UnknownHostException{ MetaClient client = new MetaClient(addresses,timeout,connectionRetry,executionRetry); try { client.connect(); List tags = client.getTags(spaceName); Map> tagsFileds = getTagsFields(tags); - return new MetaData(tagsFileds); + this.metaData = new MetaData(tagsFileds); } catch (TException | ClientServerIncompatibleException | ExecuteFailedException e) { // TODO Auto-generated catch block e.printStackTrace(); + }finally{ + client.close(); } - } private String decodeString(byte[] bytes) {