-
Notifications
You must be signed in to change notification settings - Fork 5
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Factoring out Neo4j base classes from application code.
- Loading branch information
John Paul Lewicke
committed
Sep 10, 2010
1 parent
228a9f9
commit bc3b666
Showing
7 changed files
with
319 additions
and
71 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,95 @@ | ||
require 'neo_classes' | ||
require 'neo4j/extensions/graph_algo' | ||
require 'neo4j/extensions/find_path' | ||
|
||
#Various classes that provide an abstract way of managing the flow of credit between | ||
#a source and a destination user. | ||
|
||
#The CreditRelationship class tracks the direct credit that two users have placed in | ||
#each other, such as the credit limits in place and the stock of credit between the two. | ||
|
||
#The CreditPath class tracks the indirect credit present between two users via a | ||
#chain of trusted intermediaries. A CreditPath thus consists of a number of | ||
#CreditRelationships that are strung together in a network of trust. Since the | ||
#availability of intermediate nodes may fluctuate over time, a CreditPath | ||
#is inherently volatile. | ||
|
||
|
||
class CreditRelationship | ||
attr_accessor :source, :dest, :source_offer, :dest_offer | ||
|
||
def initialize(source, dest) | ||
@source = source | ||
@dest = dest | ||
|
||
@source_offer = @source.trustrel(@dest) | ||
@dest_offer = @dest.trustrel(@source) | ||
end | ||
|
||
# How much more can dest draw from source? | ||
def slack_givable | ||
return @source_offer.usable + @dest_offer.amount_used | ||
end | ||
|
||
# How much more can source draw from dest? | ||
def slack_returnable | ||
return @dest_offer.usable + @source_offer.amount_used | ||
end | ||
|
||
|
||
|
||
#Deletes dummy :trusts relationships that we created and resets the | ||
#:activelytrusts flag in both directions. | ||
def save!() | ||
|
||
#Kind of ugly at the moment -- TODO cleanup. | ||
|
||
if (@source.activelytrusts.include?(@dest) and self.slack_givable <= 0.0) | ||
@source.rels.outgoing(:activelytrusts)[@dest].delete | ||
end | ||
if (not @source.activelytrusts.include?(@dest) and self.slack_givable > 0.0) | ||
@source.activelytrusts << @dest | ||
end | ||
if (@dest.activelytrusts.include?(@source) and self.slack_returnable <= 0.0) | ||
@dest.rels.outgoing(:activelytrusts)[@source].delete | ||
end | ||
if (not @dest.activelytrusts.include?(@source) and self.slack_returnable > 0.0) | ||
@dest.activelytrusts << @source | ||
end | ||
|
||
|
||
[@source_offer,@dest_offer].each do |o| | ||
if o.empty? | ||
o.del | ||
|
||
end | ||
end | ||
end | ||
|
||
#Transfers amount from @source to @dest. | ||
|
||
def give!(amount) | ||
|
||
if self.slack_givable < amount | ||
raise "Cannot transfer amount." | ||
end | ||
|
||
debt_to_use = [amount, @dest_offer.amount_used].min | ||
credit_to_use = [0, amount - debt_to_use].max | ||
|
||
@dest_offer.amount_used -= debt_to_use | ||
@source_offer.amount_used += credit_to_use | ||
end | ||
|
||
end | ||
|
||
|
||
class CreditPath | ||
attr_accessor :source, :dest | ||
|
||
#Accepts either | ||
def initialize(source, dest) | ||
|
||
end | ||
end | ||
|
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,76 @@ | ||
require 'Neo4j' | ||
|
||
Neo4j::Config[:storage_path] = '/Users/jplewicke/rivulet/accounts/dbneo' | ||
Lucene::Config[:storage_path] = '/Users/jplewicke/rivulet/accounts/dblucene' | ||
Lucene::Config[:store_on_file] = true | ||
|
||
|
||
#Neo4j-based classes. Objects with these types are the ones that are actually persisted | ||
#in the Neo4j graph store. Changing the properties for them may require a special | ||
#migration for ALL existing database data. Changing the few helper methods we | ||
#have for them shouldn't have a similar impact, but it's best to be cautious here. | ||
|
||
class CreditOffer | ||
include Neo4j::RelationshipMixin | ||
|
||
property :max_offered, :max_desired, :amount_used, :amount_held | ||
|
||
def max | ||
return [self.max_offered, self.max_desired].min | ||
end | ||
|
||
def usable | ||
return self.max - self.amount_used | ||
end | ||
|
||
def empty? | ||
return [self.max_offered, self.max_desired, self.amount_used, | ||
self.amount_held] == [0,0,0,0] | ||
end | ||
end | ||
|
||
|
||
class User | ||
include Neo4j::NodeMixin | ||
|
||
property :user_id | ||
#property :secret | ||
|
||
has_n(:trusts).relationship(CreditOffer) | ||
|
||
has_n(:activelytrusts) | ||
|
||
has_n(:trusted_by).relationship(CreditOffer).from(User) | ||
|
||
index :user_id | ||
|
||
def trustrel(dest) | ||
|
||
if self.trusts.include?(dest) | ||
puts "yippee" | ||
rel = self.rels.outgoing(:trusts)[dest] | ||
else | ||
rel = self.trusts.new(dest) | ||
rel.max_offered = 0.0 | ||
rel.max_desired = 0.0 | ||
rel.amount_used = 0.0 | ||
rel.amount_held = 0.0 | ||
end | ||
|
||
return rel | ||
end | ||
|
||
|
||
def self.fromid(id) | ||
ret = nil | ||
|
||
result = User.find(:user_id => id) | ||
result.each {|x| ret = x} | ||
|
||
if ret == nil | ||
raise "No such user found." | ||
end | ||
return ret | ||
end | ||
|
||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.