Commit 116a22d2 authored by sim's avatar sim

Add relationships and repr implementation to nodes and ngrams related models

parent 5a41a731
......@@ -7,17 +7,32 @@ __all__ = ['Ngram', 'NodeNgram', 'NodeNodeNgram', 'NodeNgramNgram']
class Ngram(Base):
__tablename__ = 'ngrams'
id = Column(Integer, primary_key=True)
terms = Column(String(255), unique=True)
n = Column(Integer)
def __str__(self):
return '<{0.terms}>#{0.n}'.format(self)
def __repr__(self):
return '<Ngram(id={0.id}, terms={0.terms!r}, n={0.n})>'.format(self)
class NodeNgram(Base):
__tablename__ = 'nodes_ngrams'
node_id = Column(Integer, ForeignKey(Node.id, ondelete='CASCADE'), primary_key=True)
ngram_id = Column(Integer, ForeignKey(Ngram.id, ondelete='CASCADE'), primary_key=True)
weight = Column(Float)
node = relationship(Node)
ngram = relationship(Ngram)
def __repr__(self):
return '<NodeNgram(node_id={0.node_id}, ngram={0.ngram}, weight={0.weight})>'.format(self)
class NodeNodeNgram(Base):
""" for instance for TFIDF
(
......@@ -28,6 +43,7 @@ class NodeNodeNgram(Base):
)
"""
__tablename__ = 'nodes_nodes_ngrams'
node1_id = Column(Integer, ForeignKey(Node.id, ondelete='CASCADE'), primary_key=True)
node2_id = Column(Integer, ForeignKey(Node.id, ondelete='CASCADE'), primary_key=True)
ngram_id = Column(Integer, ForeignKey(Ngram.id, ondelete='CASCADE'), primary_key=True)
......@@ -36,6 +52,14 @@ class NodeNodeNgram(Base):
# sinon par défaut on aurait un type sql "double_precision" (soit 15 chiffres)
# (cf. www.postgresql.org/docs/9.4/static/datatype-numeric.html#DATATYPE-FLOAT)
node1 = relationship(Node, foreign_keys=[node1_id])
node2 = relationship(Node, foreign_keys=[node2_id])
ngram = relationship(Ngram)
def __repr__(self):
return '<NodeNodeNgram(node1_id={0.node1_id}, node2_id={0.node2_id}, ngram={0.ngram}, score={0.score})>'.format(self)
class NodeNgramNgram(Base):
""" for instance for COOCCURRENCES and GROUPLIST
(
......@@ -46,7 +70,15 @@ class NodeNgramNgram(Base):
)
"""
__tablename__ = 'nodes_ngrams_ngrams'
node_id = Column(Integer, ForeignKey(Node.id, ondelete='CASCADE'), primary_key=True)
ngram1_id = Column(Integer, ForeignKey(Ngram.id, ondelete='CASCADE'), primary_key=True)
ngram2_id = Column(Integer, ForeignKey(Ngram.id, ondelete='CASCADE'), primary_key=True)
weight = Column(Float(precision=24)) # see comment for NodeNodeNgram.score
node = relationship(Node)
ngram1 = relationship(Ngram, foreign_keys=[ngram1_id])
ngram2 = relationship(Ngram, foreign_keys=[ngram2_id])
def __repr__(self):
return '<NodeNgramNgram(node_id={0.node_id}, ngram1={0.ngram1}, ngram2={0.ngram2}, weight={0.weight})>'.format(self)
......@@ -19,6 +19,7 @@ class NodeType(TypeDecorator):
def process_result_value(self, typeindex, dialect):
return NODETYPES[typeindex]
class Node(Base):
"""This model can fit many purposes.
It intends to provide a generic model, allowing hierarchical structure
......@@ -26,6 +27,7 @@ class Node(Base):
The possible types are defined in `gargantext.constants.NODETYPES`.
"""
__tablename__ = 'nodes'
id = Column(Integer, primary_key=True)
typename = Column(NodeType, index=True)
# foreign keys
......@@ -37,6 +39,8 @@ class Node(Base):
# metadata (see https://bashelton.com/2014/03/updating-postgresql-json-fields-via-sqlalchemy/)
hyperdata = Column(JSONB, default=dict)
parent = relationship('Node', remote_side=[id])
def __init__(self, **kwargs):
"""Node's constructor.
Initialize the `hyperdata` as a dictionary if no value was given.
......@@ -55,6 +59,10 @@ class Node(Base):
"""
self.hyperdata[key] = value
def __repr__(self):
return '<Node(typename={0.typename}, user_id={0.user_id}, parent_id={0.parent_id}, ' \
'name={0.name!r}, date={0.date})>'.format(self)
@property
def ngrams(self):
"""Pseudo-attribute allowing to retrieve a node's ngrams.
......@@ -187,8 +195,16 @@ class Node(Base):
))
return self['statuses'][-1]
class NodeNode(Base):
__tablename__ = 'nodes_nodes'
node1_id = Column(Integer, ForeignKey(Node.id, ondelete='CASCADE'), primary_key=True)
node2_id = Column(Integer, ForeignKey(Node.id, ondelete='CASCADE'), primary_key=True)
score = Column(Float(precision=24))
node1 = relationship(Node, foreign_keys=[node1_id])
node2 = relationship(Node, foreign_keys=[node2_id])
def __repr__(self):
return '<NodeNode(node1_id={0.node1_id}, node2_id={0.node2_id}, score={0.score})>'.format(self)
......@@ -39,7 +39,7 @@ Double = DOUBLE_PRECISION
########################################################################
# useful for queries
########################################################################
from sqlalchemy.orm import aliased
from sqlalchemy.orm import aliased, relationship
from sqlalchemy import func, desc
########################################################################
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment