arcology-fastapi/arcology/sigma.py

91 lines
2.3 KiB
Python

# [[file:../arcology-sitemaps.org::*Making SigmaJS Nodes][Making SigmaJS Nodes:1]]
import hashlib
from sqlmodel import Session, select
import arcology.arroyo as arroyo
from arcology.arroyo import Page
def make_loc_hash(page: Page, salt, max_q=700):
key = page.get_file() + str(salt)
hash = hashlib.sha224(key.encode("utf-8")).digest()
return int.from_bytes(hash, byteorder="big") % max_q
def nodes(engine):
# collect all pages
with Session(engine) as s:
pages = s.exec(select(Page)).all()
nodes = [
dict(
key=page.get_key(),
attributes=dict(
label=page.get_title(),
x=make_loc_hash(page, 1),
y=make_loc_hash(page, 2),
size=min((len(page.backlinks) + len(page.outlinks)) / 2, 10),
color=page.get_site().node_color,
href=page.get_arcology_key().to_url()
)
)
for page in pages
]
return nodes
# Making SigmaJS Nodes:1 ends here
# [[file:../arcology-sitemaps.org::*Making SigmaJS Edges][Making SigmaJS Edges:1]]
from sqlmodel import Session, select
import arcology.arroyo as arroyo
from arcology.arroyo import Link, engine
from arcology.parse import parse_sexp
# HACK: https://stackoverflow.com/questions/1151658/python-hashable-dicts
class hashabledict(dict):
def __hash__(self):
return hash(tuple(sorted(self.items())))
def edges(engine):
# collect all pages
with Session(engine) as s:
q_links = s.exec(select(Link)).all()
links = set()
for link in q_links:
source = link.source_page.get_key()
dest = link.dest_page.get_key()
links.add(
hashabledict(
key=f"{source}-{dest}",
source=source,
target=dest,
)
)
return list(links)
# Making SigmaJS Edges:1 ends here
# [[file:../arcology-sitemaps.org::*Making SigmaJS Edges][Making SigmaJS Edges:2]]
import functools
@functools.lru_cache(maxsize=20)
def sigma_lru(cache_key):
return dict(
# this is a different import of the same engine...
nodes=nodes(engine),
edges=edges(engine)
)
def sigma(engine):
with Session(engine) as session:
pages = session.exec(select(Page).order_by(Page.key))
hashes =[page.hash for page in pages]
cache_key = ''.join(
hashes
)
return sigma_lru(cache_key)
# Making SigmaJS Edges:2 ends here