"""Demonstration of the Remote View protocol for adding
   specially implemented Views in an application."""
from gadfly import gadfly

# create the database
g = gadfly()
g.startup("dbtest", "dbtest")	# assume directory "dbtest" exists

# define a remote view class
import gfintrospect

class myTable(gfintrospect.RemoteView):

    """A remote view must define self.column_names
       to return a (fixed) list of string column names and
       self.listing() to return a possibly varying
       list of row values.  If there is a single column
       the listing() list must return a list of values,
       but for multiple columns it must return a list
       of tuples with one entry for each column.
       
       The remote view implementation may optionally
       redefine __init__ also, please see gfintrospect.py
    """

    # static: don't reconstruct internal structure for each query
    # for more interesting views static will generally be 0
    static = 1
   
    def __init__(self, column_names=None, rowlist=None):
        """do whatever needed for initialization"""
        if column_names is None:
            column_names = ['a', 'b', 'c']
        if rowlist is None:
            rowlist = [(1,2,3), (4,5,6), (7,8,9)]
        self.column_names = column_names
        self.rowlist = rowlist
       
    def listing(self):
        """return list of tuples of right sizes to match column_names.
           for more interesting views this will do something more
           complex ;).
        """
        return self.rowlist
    
# create a table using default cols and rows
### Python code adding ANY remote views must be EXECUTED
### EACH TIME THE DATABASE LOADS!

g.add_remote_view("test", myTable())

# create a table using specified cols and rows
# NOTE: for single column give list of values
#   NOT list of tuples of values!
g.add_remote_view("test2", myTable(["x"], [1,6,7]))

print g.database

c = g.cursor()

c.execute("select * from test")
print "test::"
print c.pp()
print
c.execute("select * from test2")
print "test2::"
print c.pp()
print
c.execute("select * from test, test2 where x=a")
print "join"
print c.pp()
print

g.add_remote_view("test3", myTable(["z", "w"], [(2,3), (7,8), (4,6)]))
c.execute("select * from test3")
print "test3::"
print c.pp()
print

c.execute(
 "select * from test, test2, test3 where x=a and z=b and w=c")
print "join 2::"
print c.pp()
print

