lib/grumlin/repository.rb in grumlin-0.18.1 vs lib/grumlin/repository.rb in grumlin-0.19.0

- old
+ new

@@ -7,95 +7,15 @@ none: :iterate, single: :next, traversal: :nil }.freeze - module InstanceMethods - include Grumlin::Expressions - - def __ - TraversalStart.new(self.class.shortcuts) - end - - def g - TraversalStart.new(self.class.shortcuts) - end - - def drop_vertex(id) - g.V(id).drop.iterate - end - - def drop_edge(id = nil, from: nil, to: nil, label: nil) # rubocop:disable Metrics/AbcSize - raise ArgumentError, "either id or from:, to: and label: must be passed" if [id, from, to, label].all?(&:nil?) - return g.E(id).drop.iterate unless id.nil? - - raise ArgumentError, "from:, to: and label: must be passed" if [from, to, label].any?(&:nil?) - - g.V(from).outE(label).where(__.inV.hasId(to)).limit(1).drop.iterate - end - - def add_vertex(label, id = nil, **properties) - id ||= properties[T.id] - properties = except(properties, T.id) - - t = g.addV(label) - t = t.props(T.id => id) unless id.nil? - t.props(**properties).next - end - - def add_edge(label, id = nil, from:, to:, **properties) - id ||= properties[T.id] - properties = except(properties, T.label) - properties[T.id] = id - - g.addE(label).from(__.V(from)).to(__.V(to)).props(**properties).next - end - - def upsert_vertex(label, id, create_properties: {}, update_properties: {}) # rubocop:disable Metrics/AbcSize - create_properties = except(create_properties, T.id, T.label) - update_properties = except(update_properties, T.id, T.label) - g.V(id) - .fold - .coalesce( - __.unfold, - __.addV(label).props(**create_properties.merge(T.id => id)) - ).props(**update_properties) - .next - end - - # Only from and to are used to find the existing edge, if one wants to assign an id to a created edge, - # it must be passed as T.id in via create_properties. - def upsert_edge(label, from:, to:, create_properties: {}, update_properties: {}) # rubocop:disable Metrics/AbcSize - create_properties = except(create_properties, T.label) - update_properties = except(update_properties, T.id, T.label) - - g.V(from) - .outE(label).where(__.inV.hasId(to)) - .fold - .coalesce( - __.unfold, - __.addE(label).from(__.V(from)).to(__.V(to)).props(**create_properties) - ).props(**update_properties).next - end - - private - - # A polyfill for Hash#except for ruby 2.x environments without ActiveSupport - # TODO: delete and use native Hash#except when after ruby 2.7 is deprecated. - def except(hash, *keys) - return hash.except(*keys) if hash.respond_to?(:except) - - hash.each_with_object({}) do |(k, v), res| - res[k] = v unless keys.include?(k) - end - end - end - def self.extended(base) base.extend(Grumlin::Shortcuts) - base.include(InstanceMethods) + base.include(Repository::InstanceMethods) base.shortcuts_from(Grumlin::Shortcuts::Properties) + base.shortcuts_from(Grumlin::Shortcuts::Upserts) end def query(name, return_mode: :list, postprocess_with: nil, &query_block) # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity return_mode = validate_return_mode!(return_mode) postprocess_with = validate_postprocess_with!(postprocess_with)