much faster means of computing matrices
diff --git a/planetstack/core/plus/views.py b/planetstack/core/plus/views.py
index 886db20..7a11315 100644
--- a/planetstack/core/plus/views.py
+++ b/planetstack/core/plus/views.py
@@ -802,11 +802,14 @@
matrix = []
slices = list(Slice.objects.all())
- slices = [x for x in slices if not self.isEmpty(x,name)]
+ ids_by_slice = self.build_id_list(slices, name)
+
+ slices = [x for x in slices if (len(ids_by_slice[x])>0)]
for i,slice in enumerate(slices):
groups.append({"name": slice.name, "color": colors[i%len(colors)]})
- matrix.append(self.buildMatrix(slice, slices, name))
+ row=self.buildMatrix(slice, slices, name, ids_by_slice)
+ matrix.append(row)
result = {"groups": groups, "matrix": matrix}
@@ -828,41 +831,48 @@
return HttpResponse(json.dumps(result), mimetype='application/javascript')
- def buildMatrix(self, slice, slices, name):
+ def build_id_list(self, slices, name):
+ ids_by_slice = {}
+ for slice in slices:
+ # build up a list of object ids that are used by each slice
+ ids_by_slice[slice] = self.getIds(slice, name)
+
+ return ids_by_slice
+
+ def buildMatrix(self, slice, slices, name, ids_by_slice):
+ not_only_my_ids = []
+
+ # build up a list of object ids that are used by other slices
+ for otherSlice in ids_by_slice.keys():
+ if (slice != otherSlice):
+ for id in ids_by_slice[otherSlice]:
+ if not id in not_only_my_ids:
+ not_only_my_ids.append(id)
+
+ # build up a list of ids that are used only by the slice, and not
+ # shared with any other slice
+ only_my_ids = []
+ for id in ids_by_slice[slice]:
+ if id not in not_only_my_ids:
+ only_my_ids.append(id)
+
row = []
- for otherSlice in slices:
+ for otherSlice in ids_by_slice.keys():
if (otherSlice == slice):
- row.append(self.getCount(slice, name))
+ row.append(len(only_my_ids))
else:
- row.append(self.getInCommon(slice, otherSlice, name))
+ row.append(self.inCommonIds(ids_by_slice[slice], ids_by_slice[otherSlice]))
+
return row
- def other_slice_sites(self, slice):
- ids=[]
- for sliver in Sliver.objects.all():
- if sliver.slice!=slice:
- if sliver.node.site.id not in ids:
- ids.append(sliver.node.site.id)
- return ids
-
- def other_slice_nodes(self, slice):
- ids=[]
- for sliver in Sliver.objects.all():
- if sliver.slice!=slice:
- if sliver.node.id not in ids:
- ids.append(sliver.node.id)
- return ids
-
- def getIds(self, slice, name, onlySelf=False):
+ def getIds(self, slice, name):
ids=[]
if name=="users":
for sp in slice.slice_privileges.all():
- if (not onlySelf) or (len(sp.user.slice_privileges.all())==1):
if sp.user.id not in ids:
ids.append(sp.user.id)
elif name=="networks":
for sp in slice.networkslice_set.all():
- if (not onlySelf) or (len(sp.network.networkslice_set.all())==1):
if sp.network.id not in ids:
ids.append(sp.network.id)
elif name=="sites":
@@ -871,17 +881,10 @@
for sp in slice.slivers.all():
if sp.node.site.id not in ids:
ids.append(sp.node.site.id)
- if onlySelf:
- other_slice_sites = self.other_slice_sites(slice)
- ids = [x for x in ids if x not in other_slice_sites]
elif name=="sliver_nodes":
for sp in slice.slivers.all():
if sp.node.id not in ids:
ids.append(sp.node.id)
- if onlySelf:
- other_slice_nodes = self.other_slice_nodes(slice)
- ids = [x for x in ids if x not in other_slice_nodes]
-
return ids
def inCommonIds(self, ids1, ids2):
@@ -891,16 +894,6 @@
count+=1
return count
- def getCount(self, slice, name):
- if (name in ["users", "networks", "sites", "sliver_nodes", "sliver_sites"]):
- return len(self.getIds(slice,name,onlySelf=True))
-
- def getInCommon(self, slice, otherSlice, name):
- if (name in ["users", "networks", "sites", "sliver_nodes", "sliver_sites"]):
- slice_ids = self.getIds(slice,name)
- otherSlice_ids = self.getIds(otherSlice,name)
- return self.inCommonIds(slice_ids, otherSlice_ids)
-
def isEmpty(self, slice, name):
if (name in ["users", "networks", "sites", "sliver_nodes", "sliver_sites"]):
return (len(self.getIds(slice,name)) == 0)