From c9dd1f6b0b72d9d850d8fc2a665f731f8896b43d Mon Sep 17 00:00:00 2001 From: Darrick Wiebe Date: Sat, 4 Oct 2014 19:03:27 -0400 Subject: [PATCH] Transaction data wrapper --- lib/pacer-orient.rb | 1 + lib/pacer-orient/tx_data_wrapper.rb | 95 +++++++++++++++++++++++++++++ 2 files changed, 96 insertions(+) create mode 100644 lib/pacer-orient/tx_data_wrapper.rb diff --git a/lib/pacer-orient.rb b/lib/pacer-orient.rb index 01b95a6..1b3b285 100644 --- a/lib/pacer-orient.rb +++ b/lib/pacer-orient.rb @@ -8,6 +8,7 @@ require Pacer::Orient::JAR require 'pacer-orient/graph' +require 'pacer-orient/tx_data_wrapper' Pacer::FunctionResolver.clear_cache diff --git a/lib/pacer-orient/tx_data_wrapper.rb b/lib/pacer-orient/tx_data_wrapper.rb new file mode 100644 index 0000000..5aa4991 --- /dev/null +++ b/lib/pacer-orient/tx_data_wrapper.rb @@ -0,0 +1,95 @@ +module Pacer + module Orient + class TxDataWrapper + attr_reader :tx, :entries, :v_base, :e_base, :graph, :blueprints_graph + + def initialize(odb, graph) + @graph = graph + @blueprints_graph = graph.blueprints_graph + @tx = odb.getTransaction + @entries = tx.getAllRecordEntries + @v_base = graph.orient_graph.getMetadata.getSchema.getClass("V") + @e_base = graph.orient_graph.getMetadata.getSchema.getClass("E") + end + + def created_v + keep(ORecordOperation::CREATED, v_base) { |e| wrap_vertex e } + end + + def deleted_v + keep(ORecordOperation::DELETED, v_base) { |e| wrap_vertex e } + end + + def changed_v + keep(ORecordOperation::UPDATED, v_base) { |e| changes e, :vertex }.flatten + end + + def created_e + keep(ORecordOperation::CREATED, e_base) { |e| wrap_edge e } + end + + def deleted_e + keep(ORecordOperation::DELETED, e_base) { |e| wrap_edge e } + end + + def changed_e + keep(ORecordOperation::UPDATED, e_base) { |e| changes e, :edge }.flatten + end + + def created_v_ids + keep(ORecordOperation::CREATED, v_base) { |e| e.getIdentity } + end + + def deleted_v_ids + keep(ORecordOperation::DELETED, v_base) { |e| e.getIdentity } + end + + def created_e_ids + keep(ORecordOperation::CREATED, e_base) { |e| e.getIdentity } + end + + def deleted_e_ids + keep(ORecordOperation::DELETED, e_base) { |e| e.getIdentity } + end + + def deleted?(e) + entry = tx.getRecordEntry e.element_id + entry and entry.type == ORecordOperation::DELETED + end + + private + + # !!!!!!!!!!!!!!!!!!!! + # !!!!!!!!!!!!!!!!!!!! + # TODO: how do I deal with lightweight edges? + # !!!!!!!!!!!!!!!!!!!! + # !!!!!!!!!!!!!!!!!!!! + + def keep(op, klass) + entries.map do |e| + if e.type == op and e.getSchemaClass.isSubClassOf(klass) + yield e.getRecord + end + end.compact + end + + def changes(doc, type) + doc.getDirtyFields.map do |field| + { element_type: type, + id: doc.getIdentity, + key: field, + was: graph.decode_property(doc.getOriginalValue(field)), + is: graph.decode_property(doc.field(field)) } + end + end + + def wrap_edge(e) + Pacer::Wrappers::VertexWrapper.new graph, OrientVertex.new(blueprints_graph, e) + end + + def wrap_vertex(e) + Pacer::Wrappers::VertexWrapper.new graph, OrientVertex.new(blueprints_graph, e) + end + end + end +end