Exemple #1
0
    def __init__(self, desc, srid=4326, geometry_type='GEOMETRY'):
        assert isinstance(desc, (basestring, buffer))
        self.desc = desc
        self.srid = srid
        self.geometry_type = geometry_type

        Function.__init__(self, "")
Exemple #2
0
 def __init__(self, desc, srid=4326, geometry_type='GEOMETRY'):
     assert isinstance(desc, (basestring, buffer))
     self.desc = desc
     self.srid = srid
     self.geometry_type = geometry_type
     
     Function.__init__(self, "")
Exemple #3
0
    def __init__(self, desc, srid=4326, geometry_type='GEOMETRY'):
        assert isinstance(
            desc, (str, bytes)), "Expected str/bytes for {!r}, got {}".format(
                desc, type(desc))
        self.desc = desc
        self.srid = srid
        self.geometry_type = geometry_type

        Function.__init__(self, "")
Exemple #4
0
def _get_function(element, compiler, params, within_column_clause):
    """For elements of type BaseFunction, the database specific function data 
    is looked up and a executable sqlalchemy.sql.expression.Function object 
    is returned.
    """
    from geoalchemy.dialect import DialectManager
    database_dialect = DialectManager.get_spatial_dialect(compiler.dialect)
    for kls in element.__class__.__mro__:
        try:
            function_data = database_dialect.get_function(kls)
        except KeyError:
            continue
    if function_data is None:
        raise Exception("Unsupported function for this dialect")

    if isinstance(function_data, list):
        """if we have a list of function names, create cascaded Function objects
        for all function names in the list::
        
            ['TO_CHAR', 'SDO_UTIL.TO_WKTGEOMETRY'] --> TO_CHAR(SDO_UTIL.TO_WKTGEOMETRY(..))
        """
        function = None
        for name in reversed(function_data):
            packages = name.split('.')

            if function is None:
                """for the innermost function use the passed-in parameters as argument,
                otherwise use the prior created function
                """
                args = params
            else:
                args = [function]

            function = Function(packages.pop(-1), packagenames=packages, *args)

        return function

    elif isinstance(function_data, types.FunctionType):
        """if we have a function, call this function with the parameters and return the
        created Function object
        """
        if hasattr(element, 'flags'):
            # when element is a BaseFunction
            flags = element.flags
        else:
            flags = {}

        return function_data(params, within_column_clause, **flags)

    else:
        packages = function_data.split('.')

        return Function(packages.pop(-1), packagenames=packages, *params)
Exemple #5
0
 def sql_write(self, bindvalue):
     # 2. Writing - SQL layer - wrap in call to ST_GeomFromWKB to convert WKB to MySQL binary.
     return Function("ST_GeomFromWKB",
                     bindvalue,
                     self.crs_id,
                     self.AXIS_ORDER,
                     type_=self)
Exemple #6
0
def search_for_seriesname(name, nid):

    similarity = Function('similarity', AlternateNames.cleanname, (name))
    query = select([
        AlternateNames.series, AlternateNames.cleanname, AlternateNames.name,
        similarity
    ],
                   from_obj=[AlternateNames],
                   order_by=desc(similarity)).where(
                       and_(
                           AlternateNames.cleanname.op("%%")(name),
                           AlternateNames.series != nid)).limit(10)
    # print("Query:", query)
    results = db.session.execute(query).fetchall()

    data = {}

    for mgid, mcleanname, mname, similarity in results:
        if not mgid in data:
            data[mgid] = []

        distance = lv.distance(name, mcleanname)
        data[mgid].append((mgid, mcleanname, mname, distance))

    return data
Exemple #7
0
def title_search(searchterm, page=1):
    searchtermclean = bleach.clean(searchterm, strip=True)
    searchterm = nt.prepFilenameForMatching(searchtermclean)

    if not searchterm:
        return render_template(
            'not-implemented-yet.html',
            message=
            'No search term entered (or search term collapsed down to nothing).'
        )

    similarity = Function('similarity', AlternateNames.cleanname, (searchterm))
    query = select([
        AlternateNames.series, AlternateNames.cleanname, AlternateNames.name,
        similarity
    ],
                   from_obj=[AlternateNames],
                   order_by=desc(similarity)).where(
                       or_(
                           AlternateNames.cleanname.op("%%")(searchterm),
                           AlternateNames.cleanname.like(searchterm +
                                                         "%%"))).limit(50)

    results = db.session.execute(query).fetchall()

    data = collections.OrderedDict()

    uid = g.user.get_id()
    for result in results:
        dbid = result[0]
        if not dbid in data:
            data[dbid] = {}
            data[dbid]['row'] = Series.query.filter(Series.id == dbid).one()
            if uid:
                data[dbid]['watch'] = Watches            \
                  .query                           \
                  .filter(Watches.series_id==dbid) \
                  .filter(Watches.user_id==uid)    \
                  .scalar()
            else:
                data[dbid]['watch'] = []

            data[dbid]['results'] = []
        # We only care about relative ordering, and
        # since we're ordered when we iterate, if we
        # just append here, things will stay in the correct
        # order.
        data[dbid]['results'].append(result)

    # print(results)
    # print(data)

    return render_template(
        'text-search.html',
        results=data,
        name_key="tag",
        page_url_prefix='tag-id',
        searchTarget="Titles",
        searchValue=searchtermclean,
        title='Search for \'{name}\''.format(name=searchtermclean))
Exemple #8
0
def title_search(searchterm, page=1):
    searchtermclean = bleach.clean(searchterm, strip=True)
    # searchterm = nt.prepFilenameForMatching(searchtermclean)
    searchterm = searchtermclean

    if not searchterm:
        return render_template(
            'not-implemented-yet.html',
            message=
            'No search term entered (or search term collapsed down to nothing).'
        )

    similarity = Function('similarity', Story.title, (searchterm))
    query = select([Story.id, Story.title, similarity],
                   from_obj=[Story],
                   order_by=desc(similarity)).where(
                       or_(
                           Story.title.op("%%")(searchterm),
                           Story.title.like(searchterm + "%%"))).limit(50)

    results = db.session.execute(query).fetchall()

    data = collections.OrderedDict()

    return render_template(
        'text-search.html',
        results=data,
        name_key="tag",
        page_url_prefix='tag-id',
        searchTarget="Titles",
        searchValue=searchtermclean,
        title='Search for \'{name}\''.format(name=searchtermclean))
Exemple #9
0
def generate_similarity_query(searchterm, cols=None):

	searchtermclean = bleach.clean(searchterm, strip=True)
	searchtermprocessed = nt.prepFilenameForMatching(searchtermclean)

	similarity = Function('similarity', AlternateNames.cleanname, (searchtermprocessed))
	if cols is None:
		cols = [AlternateNames.series, AlternateNames.cleanname, AlternateNames.name, similarity]

	if not searchterm:
		return None, None

	query = select(
			cols,
			from_obj=[AlternateNames],
			order_by=desc(similarity)
		).where(
			or_(
				AlternateNames.cleanname.op("%%")(searchtermprocessed),
				AlternateNames.cleanname.like(searchtermprocessed + "%%")
				)
		).limit(
			50
		)
	return query, searchtermprocessed
Exemple #10
0
 def sql_write(self, bindvalue):
     # 2. Writing - SQL layer - wrap in call to STGeomFromWKB to convert WKB to MS binary.
     # POINT EMPTY is handled specially since it doesn't have a WKB value the SQL Server accepts.
     return sa.case(
         (
             sa.cast(bindvalue, sa.VARBINARY)
             == sa.literal_column(self.EMPTY_POINT_WKB),
             Function(
                 quoted_name("geometry::STGeomFromText", False),
                 "POINT EMPTY",
                 self.crs_id,
                 type_=self,
             ),
         ),
         else_=Function(
             quoted_name("geometry::STGeomFromWKB", False),
             bindvalue,
             self.crs_id,
             type_=self,
         ),
     )
Exemple #11
0
def search_for_tlname(name, nid, alts):

    # print("Searching:", (nid, name))

    similarity = Function('similarity', AlternateTranslatorNames.cleanname,
                          (name))
    query = select([
        AlternateTranslatorNames.group, AlternateTranslatorNames.cleanname,
        AlternateTranslatorNames.name, similarity
    ],
                   from_obj=[AlternateTranslatorNames],
                   order_by=desc(similarity)).where(
                       and_(
                           AlternateTranslatorNames.cleanname.op("%%")(name),
                           AlternateTranslatorNames.group != nid)).limit(10)

    results = db.session.execute(query).fetchall()

    data = {}

    for mgid, mcleanname, mname, similarity in results:
        if not mgid in data:
            data[mgid] = []

        distance = lv.distance(name, mcleanname)
        data[mgid].append((mgid, mcleanname, mname, distance))

    for mgid, mcleanname, mname, similarity in results:
        if not mgid in data:
            data[mgid] = []
        distance = lv.distance(mcleanname, name)
        data[mgid].append((mgid, mcleanname, mname, distance))

    for oid, altn, caltn in alts:
        if not altn:
            continue

        if name.lower().startswith(altn.lower()) or altn.lower().startswith(
                name.lower()) and altn and name:
            if not oid in data:
                data[oid] = []

            # rows = get_rows(altn)
            # for row in rows:
            # 	data[oid].append(row)

    return data
Exemple #12
0
def add_similarity_query(searchterm, query):

	searchtermclean = bleach.clean(searchterm, strip=True)
	searchtermprocessed = nt.prepFilenameForMatching(searchtermclean)

	similarity = Function('similarity', AlternateNames.cleanname, (searchtermprocessed))

	if not searchterm:
		return None, None

	query = query.filter(
		Series.id.in_(
			db.session.query(AlternateNames.series).filter(
				or_(
					AlternateNames.cleanname.op("%%")(searchtermprocessed),
					AlternateNames.cleanname.like(searchtermprocessed + "%%")
					)
				).order_by(
					desc(similarity)
				)
			)
		)

	return query
Exemple #13
0
 def sql_read(self, column):
     return Function("to_char", column, "HH24:MI:SS", type_=self)
Exemple #14
0
 def sql_read(self, column):
     return Function("to_char", column, "YYYY-MM-DD", type_=self)
Exemple #15
0
 def sql_read(self, column):
     return Function("FORMAT", column, "yyyy-MM-ddTHH:mm:ss", type_=self)
Exemple #16
0
 def sql_read(self, column):
     return Function("FORMAT", column, r"hh\:mm\:ss", type_=self)
 def get_term_query(self, column_alias, column_name, value, default_op=or_):
     tq = AlchemyMixin.get_tsquery(value, default_op)
     if column_name is None:
         column_name = column_alias.name
     return Function('to_tsvector', column_name).op('@@')(tq)
Exemple #18
0
 def sql_read(self, column):
     # 3. Reading - SQL layer - wrap in call to ST_AsBinary() to convert MySQL binary to WKB.
     return Function("ST_AsBinary", column, self.AXIS_ORDER, type_=self)
Exemple #19
0
 def __init__(self, desc):
     self.desc = desc
     Function.__init__(self, "", desc)
Exemple #20
0
 def __init__(self, *arguments, **kwargs):
     self.arguments = arguments
     self.flags = kwargs.copy()
     
     Function.__init__(self, self.__class__.__name__, **kwargs)
Exemple #21
0
 def sql_read(self, column):
     # Reading - SQL layer - convert date to string in ISO8601.
     # https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html
     return Function("DATE_FORMAT", column, "%Y-%m-%d", type_=self)
Exemple #22
0
 def __init__(self, desc):
     self.desc = desc
     Function.__init__(self, "", desc)
Exemple #23
0
 def sql_read(self, column):
     return Function("to_char",
                     column,
                     'YYYY-MM-DD"T"HH24:MI:SS',
                     type_=self)
Exemple #24
0
 def sql_read(self, col):
     # 2. Reading - SQL layer - convert timestamp to string in ISO8601 with Z as the timezone specifier.
     # https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html
     return Function("DATE_FORMAT", col, "%Y-%m-%dT%H:%i:%S", type_=self)
Exemple #25
0
 def sql_read(self, col):
     # Reading - SQL layer - convert timestamp to string in ISO8601.
     # https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html
     return Function("DATE_FORMAT", col, "%H:%i:%S", type_=self)
Exemple #26
0
 def __init__(self, desc):
     assert isinstance(desc, basestring)
     self.desc = desc
     Function.__init__(self, "")
Exemple #27
0
    def __init__(self, *arguments, **kwargs):
        self.arguments = arguments
        self.flags = kwargs.copy()

        Function.__init__(self, self.__class__.__name__, **kwargs)