Resolve "Optimize search for customer vehicle in incoming JO" #886

Merged
jankstudio merged 3 commits from 89-optimize-search-for-customer-vehicle-in-incoming-jo into master 2018-04-10 15:38:42 +00:00
5 changed files with 80 additions and 9 deletions

View file

@ -38,6 +38,8 @@ doctrine:
stcollect: CrEOF\Spatial\ORM\Query\AST\Functions\PostgreSql\STCollect
stsnaptogrid: CrEOF\Spatial\ORM\Query\AST\Functions\PostgreSql\STSnapToGrid
stoverlaps: CrEOF\Spatial\ORM\Query\AST\Functions\PostgreSql\STOverlaps
# for match against
match_against: App\Doctrine\MatchAgainst
numeric_functions:
# for postgresql
starea: CrEOF\Spatial\ORM\Query\AST\Functions\PostgreSql\STArea

View file

@ -509,6 +509,7 @@ class CustomerController extends BaseController
->getRepository(CustomerVehicle::class)
->createQueryBuilder('q');
/*
// build expression now since we're reusing it
$vehicle_label = $qb->expr()->concat(
'q.plate_number',
@ -520,15 +521,23 @@ class CustomerController extends BaseController
'c.phone_mobile',
$qb->expr()->literal(')')
);
*/
// count total records
$tquery = $qb->select('COUNT(q)')
->join('q.customer', 'c');
$tquery = $qb->select('COUNT(q)');
// add filters to count query
if (!empty($term)) {
$tquery->where('q.plate_number like :search')
->setParameter('search', $term . '%');
/*
$tquery->where('match_against (q.plate_number, :search \'in boolean mode\') > 0.1')
->setParameter('search', $term . '*');
*/
/*
$tquery->where('q.plate_number LIKE :filter')
->setParameter('filter', '%' . $term . '%');
*/
}
$total = $tquery->getQuery()
@ -542,15 +551,25 @@ class CustomerController extends BaseController
$has_more_pages = $page < $pages ? true : false;
// build main query
$query = $qb->select('q')
$query = $qb->select('q');
/*
->addSelect($vehicle_label . ' as vehicle_label')
->addSelect('c.first_name as cust_first_name')
->addSelect('c.last_name as cust_last_name');
*/
// add filters if needed
if (!empty($term)) {
$query->where('q.plate_number like :search')
->setParameter('search', $term . '%');
/*
$query->where('match_against (q.plate_number, :search \'in boolean mode\') > 0.1')
->setParameter('search', $term . '*');
*/
/*
$query->where('q.plate_number LIKE :filter')
->setParameter('filter', '%' . $term . '%');
*/
}
@ -566,10 +585,11 @@ class CustomerController extends BaseController
// build vehicles array
$vehicles = [];
foreach ($obj_rows as $vehicle) {
foreach ($obj_rows as $cv) {
$cust = $cv->getCustomer();
$vehicles[] = [
'id' => $vehicle[0]->getID(),
'text' => $vehicle['vehicle_label']
'id' => $cv->getID(),
'text' => $cv->getPlateNumber() . ' ' . $cust->getFirstName() . ' ' . $cust->getLastName() . ' (+63' . $cust->getPhoneMobile() . ')',
];
}

View file

@ -1647,7 +1647,7 @@ class JobOrderController extends BaseController
{
foreach ($items as $item)
{
error_log('ITEMS');
// error_log('ITEMS');
// check if this is a valid battery
$battery = $em->getRepository(Battery::class)->find($item['battery']);
@ -1682,7 +1682,7 @@ class JobOrderController extends BaseController
public function generateInvoice(Request $req, InvoiceCreator $ic)
{
error_log('generating invoice...');
// error_log('generating invoice...');
$error = false;
$stype = $req->request->get('stype');

View file

@ -0,0 +1,49 @@
<?php
namespace App\Doctrine;
use Doctrine\ORM\Query\Lexer;
use Doctrine\ORM\Query\AST\Functions\FunctionNode;
/**
* "MATCH_AGAINST" "(" {StateFieldPathExpression ","}* InParameter {Literal}? ")"
*/
class MatchAgainst extends FunctionNode {
public $columns = array();
public $needle;
public $mode;
public function parse(\Doctrine\ORM\Query\Parser $parser) {
$parser->match(Lexer::T_IDENTIFIER);
$parser->match(Lexer::T_OPEN_PARENTHESIS);
do {
$this->columns[] = $parser->StateFieldPathExpression();
$parser->match(Lexer::T_COMMA);
} while ($parser->getLexer()->isNextToken(Lexer::T_IDENTIFIER));
$this->needle = $parser->InParameter();
while ($parser->getLexer()->isNextToken(Lexer::T_STRING)) {
$this->mode = $parser->Literal();
}
$parser->match(Lexer::T_CLOSE_PARENTHESIS);
}
public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker) {
$haystack = null;
$first = true;
foreach ($this->columns as $column) {
$first ? $first = false : $haystack .= ', ';
$haystack .= $column->dispatch($sqlWalker);
}
$query = "MATCH(" . $haystack .
") AGAINST (" . $this->needle->dispatch($sqlWalker);
if ($this->mode) {
$query .= " " . $this->mode->dispatch($sqlWalker) . " )";
} else {
$query .= " )";
}
return $query;
}
}

View file

@ -9,7 +9,7 @@ use DateTime;
/**
* @ORM\Entity
* @ORM\Table(name="customer_vehicle")
* @ORM\Table(name="customer_vehicle", indexes={@ORM\Index(columns={"plate_number"}, flags={"fulltext"})})
*/
class CustomerVehicle
{