package Foorum::Search::Database; use Moose; our $VERSION = '1.001000'; use Foorum::SUtils qw/schema/; has 'schema' => ( is => 'ro', isa => 'Object', lazy => 1, default => sub { schema() }, ); sub query { my ( $self, $type, $params ) = @_; if ( $self->can($type) ) { return $self->$type($params); } else { return; } } sub topic { my ( $self, $params ) = @_; my $forum_id = $params->{'forum_id'}; my $title = $params->{'title'}; my $author_id = $params->{'author_id'}; my $date = $params->{'date'}; my $page = $params->{'page'} || 1; my $per_page = $params->{per_page} || 20; my $order_by = $params->{order_by} || 'last_update_date'; my $schema = $self->schema; my ( $where, $attr ); $where->{forum_id} = $forum_id if ($forum_id); $where->{author_id} = $author_id if ($author_id); if ( $date and $date =~ /^\d+$/ ) { # date value would be 2, 7, 30, 999 my $now = time(); if ( $date == 999 ) { # more than 30 days $where->{last_update_date} = { '<', $now - 30 * 86400 }; } else { $where->{'-and'} = [ last_update_date => { '>', $now - $date * 86400 }, last_update_date => { '<', $now } ]; } } if ($title) { #$title = $schema->storage->dbh->quote($title); $where->{title} = { 'LIKE', '%' . $title . '%' }; } $attr->{rows} = $per_page; $attr->{page} = $page; $attr->{columns} = ['topic_id']; $attr->{order_by} = ( 'post_on' eq $order_by ) ? \'post_on DESC' : \'last_update_date DESC'; my $rs = $schema->resultset('Topic')->search( $where, $attr ); my @topic_ids; while ( my $r = $rs->next ) { push @topic_ids, $r->topic_id; } return { matches => \@topic_ids, pager => $rs->pager, }; } sub user { my ( $self, $params ) = @_; my $name = $params->{name}; my $gender = $params->{gender}; my $country = $params->{country}; my $page = $params->{'page'} || 1; my $per_page = $params->{per_page} || 20; my $schema = $self->schema; my ( $where, $attr ); $attr->{rows} = $per_page; $attr->{page} = $page; $attr->{columns} = ['user_id']; # prepare $where from $params if ($name) { $name = $schema->storage->dbh->quote($name); # escape title $where->{nickname} = { 'LIKE', '%' . $name . '%' }; } if ( 'F' eq $gender or 'M' eq $gender ) { $where->{gender} = $gender; } if ($country) { $where->{country} = $country; } my $rs = $schema->resultset('User')->search( $where, $attr ); my @user_ids; while ( my $r = $rs->next ) { push @user_ids, $r->user_id; } return { matches => \@user_ids, pager => $rs->pager, }; } no Moose; __PACKAGE__->meta->make_immutable; 1; __END__ =pod =head1 NAME Foorum::Search::Database - search Foorum by DBI =head1 SYNOPSIS use Foorum::Search::Database; my $search = new Foorum::Search::Database; my $ret = $search->query('topic', { author_id => 1, title => 'test', page => 2, per_page => 20 } ); # $ret would be something like: # { matches => \@topic_ids, pager => $instance_of_date_page } =head1 DESCRIPTION This module implements DBI for Foorum Search. so generally you should check L instead. =head1 SEE ALSO L, L =head1 AUTHOR Fayland Lam =cut