[ https://issues.apache.org/jira/browse/GORA-513?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16089065#comment-16089065 ]
ASF GitHub Bot commented on GORA-513: ------------------------------------- Github user renato2099 commented on a diff in the pull request: https://github.com/apache/gora/pull/112#discussion_r127613861 --- Diff: gora-orientdb/src/main/java/org/apache/gora/orientdb/store/OrientDBStore.java --- @@ -0,0 +1,922 @@ +/** + * 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. + */ + +package org.apache.gora.orientdb.store; + +import java.io.IOException; +import java.nio.ByteBuffer; +import java.util.Map; +import java.util.Properties; +import java.util.List; +import java.util.HashMap; +import java.util.HashSet; +import java.util.ArrayList; +import java.util.Date; +import java.util.Calendar; +import java.util.Collection; +import java.util.TimeZone; +import java.util.Locale; + +import com.github.raymanrt.orientqb.query.Parameter; +import com.gitub.raymanrt.orientqb.delete.Delete; +import com.orientechnologies.orient.client.remote.OServerAdmin; +import com.orientechnologies.orient.core.db.OPartitionedDatabasePool; +import com.orientechnologies.orient.core.db.OPartitionedDatabasePoolFactory; +import com.orientechnologies.orient.core.db.document.ODatabaseDocumentTx; +import com.orientechnologies.orient.core.db.record.OTrackedList; +import com.orientechnologies.orient.core.db.record.OTrackedMap; +import com.orientechnologies.orient.core.db.record.OTrackedSet; +import com.orientechnologies.orient.core.metadata.schema.OClass; +import com.orientechnologies.orient.core.metadata.schema.OType; +import com.orientechnologies.orient.core.record.impl.ODocument; +import com.orientechnologies.orient.core.sql.OCommandSQL; +import com.orientechnologies.orient.core.sql.query.OConcurrentResultSet; +import com.orientechnologies.orient.core.sql.query.OSQLSynchQuery; +import org.apache.avro.Schema; +import org.apache.avro.util.Utf8; +import org.apache.gora.orientdb.query.OrientDBQuery; +import org.apache.gora.orientdb.query.OrientDBResult; +import org.apache.gora.persistency.impl.BeanFactoryImpl; +import org.apache.gora.persistency.impl.DirtyListWrapper; +import org.apache.gora.persistency.impl.DirtyMapWrapper; +import org.apache.gora.persistency.impl.PersistentBase; +import org.apache.gora.query.PartitionQuery; +import org.apache.gora.query.Query; +import org.apache.gora.query.Result; +import org.apache.gora.query.impl.PartitionQueryImpl; +import org.apache.gora.store.impl.DataStoreBase; +import org.apache.gora.util.AvroUtils; +import org.apache.gora.util.ClassLoadingUtils; + +import javax.xml.bind.DatatypeConverter; + +import static com.github.raymanrt.orientqb.query.Projection.projection; + +/** + * {@link org.apache.gora.orientdb.store.OrientDBStore} is the primary class + * responsible for facilitating GORA CRUD operations on OrientDB documents. + */ +public class OrientDBStore<K, T extends PersistentBase> extends DataStoreBase<K, T> { + + public static final String DEFAULT_MAPPING_FILE = "/gora-orientdb-mapping.xml"; + private String ROOT_URL; + private String ROOT_DATABASE_URL; + private OrientDBStoreParameters orientDbStoreParams; + private OrientDBMapping orientDBMapping; + private OServerAdmin remoteServerAdmin; + private OPartitionedDatabasePool connectionPool; + private List<ODocument> docBatch = new ArrayList<>(); + + /** + * Initialize the OrientDB dataStore by {@link Properties} parameters. + * + * @param keyClass key class type for dataStore. + * @param persistentClass persistent class type for dataStore. + * @param properties OrientDB dataStore properties EG:- OrientDB client credentials. + */ + @Override + public void initialize(Class<K> keyClass, Class<T> persistentClass, Properties properties) { + super.initialize(keyClass, persistentClass, properties); + try { + orientDbStoreParams = OrientDBStoreParameters.load(properties); + ROOT_URL = "remote:".concat(orientDbStoreParams.getServerHost()).concat(":") + .concat(orientDbStoreParams.getServerPort()); + ROOT_DATABASE_URL = ROOT_URL.concat("/").concat(orientDbStoreParams.getDatabaseName()); + remoteServerAdmin = new OServerAdmin(ROOT_URL).connect(orientDbStoreParams.getUserName(), + orientDbStoreParams.getUserPassword()); + if (!remoteServerAdmin.existsDatabase(orientDbStoreParams.getDatabaseName(), "memory")) { + remoteServerAdmin.createDatabase(orientDbStoreParams.getDatabaseName(), "document", "memory"); + } + + if (orientDbStoreParams.getConnectionPoolSize() != null) { + int connPoolSize = Integer.valueOf(orientDbStoreParams.getConnectionPoolSize()); + connectionPool = new OPartitionedDatabasePoolFactory(connPoolSize) + .get(ROOT_DATABASE_URL, orientDbStoreParams.getUserName(), + orientDbStoreParams.getUserPassword()); + } else { + connectionPool = new OPartitionedDatabasePoolFactory().get(ROOT_DATABASE_URL, + orientDbStoreParams.getUserName(), orientDbStoreParams.getUserPassword()); + } + + OrientDBMappingBuilder<K, T> builder = new OrientDBMappingBuilder<>(this); + orientDBMapping = builder.fromFile(orientDbStoreParams.getMappingFile()).build(); + + if (!schemaExists()) { + createSchema(); + } + } catch (Exception e) { + LOG.error("Error while initializing OrientDB dataStore: {}", + new Object[]{e.getMessage()}); + throw new RuntimeException(e); + } + } + + @Override + public String getSchemaName(final String mappingSchemaName, + final Class<?> persistentClass) { + return super.getSchemaName(mappingSchemaName, persistentClass); + } + + @Override + public String getSchemaName() { + return orientDBMapping.getDocumentClass(); + } + + /** + * Create a new class of OrientDB documents if necessary. Enforce specified schema over the document class. + * + */ + @Override + public void createSchema() { + if (schemaExists()) { + return; + } + + ODatabaseDocumentTx schemaTx = connectionPool.acquire(); + schemaTx.activateOnCurrentThread(); + try { + + OClass documentClass = schemaTx.getMetadata().getSchema().createClass(orientDBMapping.getDocumentClass()); + documentClass.createProperty("_id", + OType.getTypeByClass(super.getKeyClass())).createIndex(OClass.INDEX_TYPE.UNIQUE); + for (String docField : orientDBMapping.getDocumentFields()) { + documentClass.createProperty(docField, + OType.valueOf(orientDBMapping.getDocumentFieldType(docField).name())); + } + schemaTx.getMetadata().getSchema().reload(); + } finally { + schemaTx.close(); + } + } + + /** + * Deletes enforced schema over OrientDB Document class. + * + */ + @Override + public void deleteSchema() { + ODatabaseDocumentTx schemaTx = connectionPool.acquire(); + schemaTx.activateOnCurrentThread(); + try { + schemaTx.getMetadata().getSchema().dropClass(orientDBMapping.getDocumentClass()); + } finally { + schemaTx.close(); + } + } + + /** + * Check whether there exist a schema enforced over OrientDB document class. + * + */ + @Override + public boolean schemaExists() { + ODatabaseDocumentTx schemaTx = connectionPool.acquire(); + schemaTx.activateOnCurrentThread(); + try { + return schemaTx.getMetadata().getSchema() + .existsClass(orientDBMapping.getDocumentClass()); + } finally { + schemaTx.close(); + } + } + + @Override + public T get(K key, String[] fields) { + String[] dbFields = getFieldsToQuery(fields); + com.github.raymanrt.orientqb.query.Query selectQuery = new com.github.raymanrt.orientqb.query.Query(); + for (String k : dbFields) { + String dbFieldName = orientDBMapping.getDocumentField(k); + if (dbFieldName != null && dbFieldName.length() > 0) { + selectQuery.select(dbFieldName); + } + } + selectQuery.from(orientDBMapping.getDocumentClass()) + .where(projection("_id").eq(Parameter.parameter("key"))); + Map<String, Object> params = new HashMap<String, Object>(); + params.put("key", key); + OSQLSynchQuery<ODocument> query = new OSQLSynchQuery<ODocument>(selectQuery.toString()); + ODatabaseDocumentTx selectTx = connectionPool.acquire(); + selectTx.activateOnCurrentThread(); + try { + List<ODocument> result = selectTx.command(query).execute(params); + if (result.size() == 1) { + return convertOrientDocToAvroBean(result.get(0), dbFields); + } else { + return null; + } + } finally { + selectTx.close(); + } + } + + @Override + public void put(K key, T val) { + if (val.isDirty()) { + OrientDBQuery<K, T> dataStoreQuery = new OrientDBQuery<>(this); + dataStoreQuery.setStartKey(key); + dataStoreQuery.setEndKey(key); + dataStoreQuery.populateOrientDBQuery(orientDBMapping, getFieldsToQuery(null), getFields()); + + ODatabaseDocumentTx selectTx = connectionPool.acquire(); + selectTx.activateOnCurrentThread(); + try { + List<ODocument> result = selectTx.command(dataStoreQuery.getOrientDBQuery()) + .execute(dataStoreQuery.getParams()); + if (result.size() == 1) { + ODocument document = updateOrientDocFromAvroBean(key, val, result.get(0)); + docBatch.add(document); + } else { + ODocument document = convertAvroBeanToOrientDoc(key, val); + docBatch.add(document); + } + } finally { + selectTx.close(); + } + } else { + LOG.info("Ignored putting persistent bean {} in the store as it is neither " --- End diff -- Maybe this should a debug instead of info so we don't get overflowed with logging ;) > Implement OrientDB Datastore. > ----------------------------- > > Key: GORA-513 > URL: https://issues.apache.org/jira/browse/GORA-513 > Project: Apache Gora > Issue Type: New Feature > Reporter: Kevin Ratnasekera > Assignee: Kevin Ratnasekera > > OrientDB [1] client [2] query builder [3] comes under Apache license. > [1] http://orientdb.com/orientdb/ > [2] https://github.com/orientechnologies/orientdb > [3] https://github.com/raymanrt/orientqb -- This message was sent by Atlassian JIRA (v6.4.14#64029)