module Neo4j module Core module Property # @return [Hash] all properties plus the id of the node with the key _neo_id def props ret = {"_neo_id" => neo_id} property_keys.each do |key| ret[key] = get_property(key) end ret end # Ids are garbage collected over time so they are only guaranteed to be unique during a specific time span: # if the node is deleted, it's likely that a new node at some point will get the old id. Note: # this makes node ids brittle as public APIs. # @return [Fixnum] the unique id of this node. def neo_id getId end # @param [#to_s] the property we want to check if it exist. # @return [true false] true if the given key exist as a property. def property?(key) has_property?(key.to_s) end # Updates this node/relationship's properties by using the provided struct/hash. # If the option {:strict => true} is given, any properties present on # the node but not present in the hash will be removed from the node. # # @param [Hash, :each_pair] struct_or_hash the key and value to be set # @param [Hash] options further options defining the context of the update # @option options [Boolean] :strict any properties present on the node but not present in the hash will be removed from the node if true # @return self def update(struct_or_hash, options={}) strict = options[:strict] keys_to_delete = props.keys - %w(_neo_id _classname) if strict struct_or_hash.each_pair do |key, value| next if key.to_s[0..0] == '_' # do not allow special properties to be mass assigned keys_to_delete.delete(key.to_s) if strict self[key] = value end keys_to_delete.each { |key| remove_property(key) } if strict self end # @return the value of the given key or nil if the property does not exist. def [](key) return unless property?(key) val = get_property(key.to_s) val.class.superclass == ArrayJavaProxy ? val.to_a : val end # Sets the property of this node. # Property keys are always strings. Valid property value types are the primitives(String, Fixnum, Float, FalseClass, TrueClass) or array of those primitives. # # ==== Gotchas # * Values in the array must be of the same type. # * You can *not* delete or add one item in the array (e.g. person.phones.delete('123')) but instead you must create a new array instead. # # @param [String, Symbol] key of the property to set # @param [String,Fixnum,Float,true,false, Array] value to set def []=(key, value) k = key.to_s if value.nil? remove_property(k) elsif (Array === value) case value[0] when NilClass set_property(k, [].to_java(:string)) when String set_property(k, value.to_java(:string)) when Float set_property(k, value.to_java(:double)) when FalseClass, TrueClass set_property(k, value.to_java(:boolean)) when Fixnum set_property(k, value.to_java(:long)) else raise "Not allowed to store array with value #{value[0]} type #{value[0].class}" end else set_property(k, value) end end end end end