Resolve "Optimize search for customer vehicle in incoming JO" #886
5 changed files with 80 additions and 9 deletions
|
|
@ -38,6 +38,8 @@ doctrine:
|
||||||
stcollect: CrEOF\Spatial\ORM\Query\AST\Functions\PostgreSql\STCollect
|
stcollect: CrEOF\Spatial\ORM\Query\AST\Functions\PostgreSql\STCollect
|
||||||
stsnaptogrid: CrEOF\Spatial\ORM\Query\AST\Functions\PostgreSql\STSnapToGrid
|
stsnaptogrid: CrEOF\Spatial\ORM\Query\AST\Functions\PostgreSql\STSnapToGrid
|
||||||
stoverlaps: CrEOF\Spatial\ORM\Query\AST\Functions\PostgreSql\STOverlaps
|
stoverlaps: CrEOF\Spatial\ORM\Query\AST\Functions\PostgreSql\STOverlaps
|
||||||
|
# for match against
|
||||||
|
match_against: App\Doctrine\MatchAgainst
|
||||||
numeric_functions:
|
numeric_functions:
|
||||||
# for postgresql
|
# for postgresql
|
||||||
starea: CrEOF\Spatial\ORM\Query\AST\Functions\PostgreSql\STArea
|
starea: CrEOF\Spatial\ORM\Query\AST\Functions\PostgreSql\STArea
|
||||||
|
|
|
||||||
|
|
@ -509,6 +509,7 @@ class CustomerController extends BaseController
|
||||||
->getRepository(CustomerVehicle::class)
|
->getRepository(CustomerVehicle::class)
|
||||||
->createQueryBuilder('q');
|
->createQueryBuilder('q');
|
||||||
|
|
||||||
|
/*
|
||||||
// build expression now since we're reusing it
|
// build expression now since we're reusing it
|
||||||
$vehicle_label = $qb->expr()->concat(
|
$vehicle_label = $qb->expr()->concat(
|
||||||
'q.plate_number',
|
'q.plate_number',
|
||||||
|
|
@ -520,15 +521,23 @@ class CustomerController extends BaseController
|
||||||
'c.phone_mobile',
|
'c.phone_mobile',
|
||||||
$qb->expr()->literal(')')
|
$qb->expr()->literal(')')
|
||||||
);
|
);
|
||||||
|
*/
|
||||||
|
|
||||||
// count total records
|
// count total records
|
||||||
$tquery = $qb->select('COUNT(q)')
|
$tquery = $qb->select('COUNT(q)');
|
||||||
->join('q.customer', 'c');
|
|
||||||
|
|
||||||
// add filters to count query
|
// add filters to count query
|
||||||
if (!empty($term)) {
|
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')
|
$tquery->where('q.plate_number LIKE :filter')
|
||||||
->setParameter('filter', '%' . $term . '%');
|
->setParameter('filter', '%' . $term . '%');
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
$total = $tquery->getQuery()
|
$total = $tquery->getQuery()
|
||||||
|
|
@ -542,15 +551,25 @@ class CustomerController extends BaseController
|
||||||
$has_more_pages = $page < $pages ? true : false;
|
$has_more_pages = $page < $pages ? true : false;
|
||||||
|
|
||||||
// build main query
|
// build main query
|
||||||
$query = $qb->select('q')
|
$query = $qb->select('q');
|
||||||
|
/*
|
||||||
->addSelect($vehicle_label . ' as vehicle_label')
|
->addSelect($vehicle_label . ' as vehicle_label')
|
||||||
->addSelect('c.first_name as cust_first_name')
|
->addSelect('c.first_name as cust_first_name')
|
||||||
->addSelect('c.last_name as cust_last_name');
|
->addSelect('c.last_name as cust_last_name');
|
||||||
|
*/
|
||||||
|
|
||||||
// add filters if needed
|
// add filters if needed
|
||||||
if (!empty($term)) {
|
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')
|
$query->where('q.plate_number LIKE :filter')
|
||||||
->setParameter('filter', '%' . $term . '%');
|
->setParameter('filter', '%' . $term . '%');
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -566,10 +585,11 @@ class CustomerController extends BaseController
|
||||||
// build vehicles array
|
// build vehicles array
|
||||||
$vehicles = [];
|
$vehicles = [];
|
||||||
|
|
||||||
foreach ($obj_rows as $vehicle) {
|
foreach ($obj_rows as $cv) {
|
||||||
|
$cust = $cv->getCustomer();
|
||||||
$vehicles[] = [
|
$vehicles[] = [
|
||||||
'id' => $vehicle[0]->getID(),
|
'id' => $cv->getID(),
|
||||||
'text' => $vehicle['vehicle_label']
|
'text' => $cv->getPlateNumber() . ' ' . $cust->getFirstName() . ' ' . $cust->getLastName() . ' (+63' . $cust->getPhoneMobile() . ')',
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1647,7 +1647,7 @@ class JobOrderController extends BaseController
|
||||||
{
|
{
|
||||||
foreach ($items as $item)
|
foreach ($items as $item)
|
||||||
{
|
{
|
||||||
error_log('ITEMS');
|
// error_log('ITEMS');
|
||||||
// check if this is a valid battery
|
// check if this is a valid battery
|
||||||
$battery = $em->getRepository(Battery::class)->find($item['battery']);
|
$battery = $em->getRepository(Battery::class)->find($item['battery']);
|
||||||
|
|
||||||
|
|
@ -1682,7 +1682,7 @@ class JobOrderController extends BaseController
|
||||||
|
|
||||||
public function generateInvoice(Request $req, InvoiceCreator $ic)
|
public function generateInvoice(Request $req, InvoiceCreator $ic)
|
||||||
{
|
{
|
||||||
error_log('generating invoice...');
|
// error_log('generating invoice...');
|
||||||
$error = false;
|
$error = false;
|
||||||
|
|
||||||
$stype = $req->request->get('stype');
|
$stype = $req->request->get('stype');
|
||||||
|
|
|
||||||
49
src/Doctrine/MatchAgainst.php
Normal file
49
src/Doctrine/MatchAgainst.php
Normal 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -9,7 +9,7 @@ use DateTime;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @ORM\Entity
|
* @ORM\Entity
|
||||||
* @ORM\Table(name="customer_vehicle")
|
* @ORM\Table(name="customer_vehicle", indexes={@ORM\Index(columns={"plate_number"}, flags={"fulltext"})})
|
||||||
*/
|
*/
|
||||||
class CustomerVehicle
|
class CustomerVehicle
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue