OrientDB - Ganchos
OrientDB Hooksno son más que disparadores en la terminología de la base de datos que habilitan eventos internos antes y después de cada operación CRUD en las aplicaciones de usuario. Puede usar ganchos para escribir reglas de validación personalizadas, para hacer cumplir la seguridad o para organizar eventos externos como replicar contra un DBMS relacional.
OrientDB admite dos tipos de ganchos:
Dynamic Hook - Triggers, que se pueden construir a nivel de clase y / o nivel de documento.
Java (Native) Hook - Triggers, que se pueden construir usando clases de Java.
Ganchos dinámicos
Los enganches dinámicos son más flexibles que los enganches de Java, porque se pueden cambiar en tiempo de ejecución y se pueden ejecutar por documento si es necesario, pero son más lentos que los enganches de Java.
Para ejecutar ganchos contra sus documentos, primero permita que sus clases se extiendan OTriggeredclase base. Luego, defina una propiedad personalizada para el evento interesado. A continuación se muestran los eventos disponibles.
onBeforeCreate - llamado before creando un nuevo documento.
onAfterCreate - llamado after creando un nuevo documento.
onBeforeRead - llamado before leyendo un documento.
onAfterRead - llamado after leyendo un documento.
onBeforeUpdate - llamado before actualizar un documento.
onAfterUpdate - llamado after actualizar un documento.
onBeforeDelete - llamado before eliminar un documento.
onAfterDelete - llamado after eliminar un documento.
Dynamic Hooks puede llamar -
Funciones, escritas en SQL, Javascript o cualquier lenguaje soportado por OrientDB y JVM.
Métodos estáticos de Java.
Ganchos de nivel de clase
Los enlaces de nivel de clase se definen para todos los documentos relacionados con una clase. A continuación se muestra un ejemplo para configurar un enlace que actúa a nivel de clase contra los documentos de factura.
CREATE CLASS Invoice EXTENDS OTriggered
ALTER CLASS Invoice CUSTOM onAfterCreate = invoiceCreated
Creemos la función invoiceCreated en Javascript que imprime en la consola del servidor el número de factura creado.
CREATE FUNCTION invoiceCreated "print('\\nInvoice created: ' + doc.field ('number'));"
LANGUAGE Javascript
Ahora pruebe el gancho creando un nuevo Invoice documento.
INSERT INTO Invoice CONTENT {number: 100, notes: 'This is a test}
Si este comando se ejecuta con éxito, obtendrá el siguiente resultado.
Invoice created: 100
Gancho de nivel de documentos
Puede definir una acción especial solo contra uno o más documentos. Para hacer esto, permita que su clase se extiendaOTriggered clase.
Por ejemplo, ejecutemos un disparador, como función de Javascript, contra una clase de perfil existente, para todos los documentos con cuenta de propiedad = 'Premium'. Se llamará al activador para evitar la eliminación de documentos.
ALTER CLASS Profile SUPERCLASS OTriggered UPDATE Profile
SET onBeforeDelete = 'preventDeletion' WHERE account = 'Premium'
Vamos a crear el preventDeletion() Función Javascript.
CREATE FUNCTION preventDeletion "throw new java.lang.RuntimeException('Cannot
delete Premium profile ' + doc)" LANGUAGE Javascript
Y luego pruebe el gancho intentando eliminar una cuenta 'Premium'.
DELETE FROM #12:1
java.lang.RuntimeException: Cannot delete Premium profile
profile#12:1{onBeforeDelete:preventDeletion,account:Premium,name:Jill} v-1
(<Unknown source>#2) in <Unknown source> at line number 2
Ganchos JAVA
Un caso de uso común para OrientDB Hooks (desencadenadores) es administrar las fechas creadas y actualizadas para alguna o todas las clases. Por ejemplo, puede establecer unCreatedDate cada vez que se crea un registro y establece un UpdatedDate cada vez que se actualice un registro, y hágalo de manera que implemente la lógica una vez en la capa de la base de datos y nunca más tenga que preocuparse por ella en la capa de la aplicación.
Antes de crear, deberá descargar orientdb-core.jararchivo visitando el siguiente enlace descargar OrientDB core . Y luego copie ese archivo jar en la carpeta donde desea almacenar el archivo fuente de Java.
Crear archivo de gancho
Crea un archivo Java llamado HookTest.java, que probará el mecanismo Hook utilizando lenguaje Java.
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.locks.ReentrantLock;
import com.orientechnologies.orient.core.hook.ODocumentHookAbstract;
import com.orientechnologies.orient.core.hook.ORecordHook;
import com.orientechnologies.orient.core.hook.ORecordHookAbstract;
import com.orientechnologies.orient.core.db.ODatabaseLifecycleListener;
import com.orientechnologies.orient.core.db.ODatabase;
import com.orientechnologies.orient.core.record.ORecord;
import com.orientechnologies.orient.core.record.impl.ODocument;
public class HookTest extends ODocumentHookAbstract implements ORecordHook {
public HookTest() {
}
@Override
public DISTRIBUTED_EXECUTION_MODE getDistributedExecutionMode() {
return DISTRIBUTED_EXECUTION_MODE.BOTH;
}
public RESULT onRecordBeforeCreate( ODocument iDocument ) {
System.out.println("Ran create hook");
return ORecordHook.RESULT.RECORD_NOT_CHANGED;
}
public RESULT onRecordBeforeUpdate( ODocument iDocument ) {
System.out.println("Ran update hook");
return ORecordHook.RESULT.RECORD_NOT_CHANGED;
}
}
El código de muestra anterior imprime el comentario apropiado cada vez que crea o actualiza un registro de esa clase.
Agreguemos un archivo de gancho más setCreatedUpdatedDates.java como sigue -
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.locks.ReentrantLock;
import com.orientechnologies.orient.core.hook.ODocumentHookAbstract;
import com.orientechnologies.orient.core.hook.ORecordHook;
import com.orientechnologies.orient.core.hook.ORecordHookAbstract;
import com.orientechnologies.orient.core.db.ODatabaseLifecycleListener;
import com.orientechnologies.orient.core.db.ODatabase;
import com.orientechnologies.orient.core.record.ORecord;
import com.orientechnologies.orient.core.record.impl.ODocument;
public class setCreatedUpdatedDates extends ODocumentHookAbstract implements ORecordHook {
public setCreatedUpdatedDates() {
}
@Override
public DISTRIBUTED_EXECUTION_MODE getDistributedExecutionMode() {
return DISTRIBUTED_EXECUTION_MODE.BOTH;
}
public RESULT onRecordBeforeCreate( ODocument iDocument ) {
if ((iDocument.getClassName().charAt(0) == 't') || (iDocument.getClassName().charAt(0)=='r')) {
iDocument.field("CreatedDate", System.currentTimeMillis() / 1000l);
iDocument.field("UpdatedDate", System.currentTimeMillis() / 1000l);
return ORecordHook.RESULT.RECORD_CHANGED;
} else {
return ORecordHook.RESULT.RECORD_NOT_CHANGED;
}
}
public RESULT onRecordBeforeUpdate( ODocument iDocument ) {
if ((iDocument.getClassName().charAt(0) == 't') || (iDocument.getClassName().charAt(0)=='r')) {
iDocument.field("UpdatedDate", System.currentTimeMillis() / 1000l);
return ORecordHook.RESULT.RECORD_CHANGED;
} else {
return ORecordHook.RESULT.RECORD_NOT_CHANGED;
}
}
}
Lo que hace el código anterior es buscar cualquier clase que comience con las letras 'r'o't'y establece CreatedDate y UpdatedDate cuando se crea el registro y establece sólo UpdatedDate cada vez que se actualiza el registro.
Compilar enlaces de Java
Compile código Java con el siguiente comando. Note: Mantenga el archivo jar descargado y estos archivos Java en la misma carpeta.
$ jar cf hooks-1.0-SNAPSHOT.jar *.java
Mueva el código compilado a donde el servidor OrientDB pueda encontrarlo
Debe copiar el archivo .jar terminado al directorio donde su servidor OrientDB los buscará. Esto significa el './lib'debajo de su directorio raíz de OrientDB Server se verá así:
$ cp hooks-1.0-SNAPSHOT.jar "$ORIENTDB_HOME/lib"
Habilitar Test Hook en el archivo de configuración del servidor OrientDB
Editar $ORIENTDB_HOME/config/orientdb-server-config.xml y agregue la siguiente sección cerca del final del archivo.
<hooks>
<hook class = "HookTest" position = "REGULAR"/>
</hooks>
...
</orient-server>
Reinicie el servidor OrientDB
Una vez que reinicie OrientDB Server, el gancho que definió en orientdb-server-config.xmlahora está activo. Inicie una consola de OrientDB, conéctela a su base de datos y ejecute el siguiente comando:
INSERT INTO V SET ID = 1;
Si este comando se ejecuta con éxito, obtendrá el siguiente resultado.
Ran create hook
Ahora ejecute el siguiente comando:
UPDATE V SET ID = 2 WHERE ID = 1;
Si este comando se ejecuta con éxito, obtendrá el siguiente resultado.
Ran update hook
Habilitar Real Hook en el archivo de configuración del servidor de OrientDB
Editar $ORIENTDB_HOME/config/orientdb-server-config.xml y cambie la sección de ganchos de la siguiente manera:
<hooks>
<hook class="setCreatedUpdatedDates" position="REGULAR"/>
</hooks>
...
</orient-server>
Reinicie el servidor OrientDB
Crea una nueva clase que comience con la letra 'r'o't'-
CREATE CLASS tTest EXTENDS V;
Ahora inserte un registro -
INSERT INTO tTest SET ID = 1
SELECT FROM tTest
Si este comando se ejecuta con éxito, obtendrá el siguiente resultado.
----+-----+------+----+-----------+-----------
# |@RID |@CLASS|ID |CreatedDate|UpdatedDate
----+-----+------+----+-----------+-----------
0 |#19:0|tTest |1 |1427597275 |1427597275
----+-----+------+----+-----------+-----------
Aunque no especificó valores para establecer CreatedDate y UpdatedDate, OrientDB ha configurado estos campos automáticamente para usted.
A continuación, debe actualizar el registro con el siguiente comando:
UPDATE tTest SET ID = 2 WHERE ID = 1;
SELECT FROM tTest;
Si este comando se ejecuta con éxito, obtendrá el siguiente resultado.
----+-----+------+----+-----------+-----------
# |@RID |@CLASS|ID |CreatedDate|UpdatedDate
----+-----+------+----+-----------+-----------
0 |#19:0|tTest |2 |1427597275 |1427597306
----+-----+------+----+-----------+-----------
Puede ver que OrientDB ha cambiado el UpdatedDate pero ha dejado que el CreatedDate permanece inalterable.
OrientDB Java Hooks puede ser una herramienta extremadamente valiosa para ayudar a automatizar el trabajo que de otro modo tendría que hacer en el código de la aplicación. Dado que muchos administradores de bases de datos no siempre son expertos en Java, es de esperar que la información contenida en este tutorial le brinde una ventaja y lo haga sentir cómodo con la tecnología, lo que le permitirá crear con éxito activadores de base de datos cuando surja la necesidad.