Passed
Push — master ( 51123c...cc1e68 )
by John
03:45 queued 10s
created

SubmissionModel::countWaitingSubmission()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 3
nc 1
nop 1
dl 0
loc 5
rs 10
c 0
b 0
f 0
1
<?php
2
3
namespace App\Models;
4
5
use Illuminate\Database\Eloquent\Model;
6
use Illuminate\Support\Facades\DB;
7
8
class SubmissionModel extends Model
9
{
10
    protected $tableName='submission';
11
    public $colorScheme=[
12
        "Waiting"                => "wemd-blue-text",
13
        "Judge Error"            => "wemd-black-text",
14
        "System Error"           => "wemd-black-text",
15
        "Compile Error"          => "wemd-orange-text",
16
        "Runtime Error"          => "wemd-red-text",
17
        "Wrong Answer"           => "wemd-red-text",
18
        "Time Limit Exceed"      => "wemd-deep-purple-text",
19
        "Real Time Limit Exceed" => "wemd-deep-purple-text",
20
        "Accepted"               => "wemd-green-text",
21
        "Memory Limit Exceed"    => "wemd-deep-purple-text",
22
        "Presentation Error"     => "wemd-red-text",
23
        "Submitted"              => "wemd-blue-text",
24
        "Pending"                => "wemd-blue-text",
25
        "Judging"                => "wemd-blue-text",
26
        "Partially Accepted"     => "wemd-cyan-text",
27
        'Submission Error'       => 'wemd-black-text',
28
        'Output Limit Exceeded'  => 'wemd-deep-purple-text',
29
        "Idleness Limit Exceed"  => 'wemd-deep-purple-text'
30
    ];
31
32
    public function insert($sub)
33
    {
34
        if (strlen($sub['verdict'])==0) {
35
            $sub['verdict']="Judge Error";
36
        }
37
38
        $sid=DB::table($this->tableName)->insertGetId([
39
            'time' => $sub['time'],
40
            'verdict' => $sub['verdict'],
41
            'solution' => $sub['solution'],
42
            'language' => $sub['language'],
43
            'submission_date' => $sub['submission_date'],
44
            'memory' => $sub['memory'],
45
            'uid' => $sub['uid'],
46
            'pid' => $sub['pid'],
47
            'cid' => $sub['cid'],
48
            'color' => $this->colorScheme[$sub['verdict']],
49
            'remote_id'=>$sub['remote_id'],
50
            'compile_info'=>"",
51
            'coid'=>$sub['coid'],
52
            'score'=>$sub['score']
53
        ]);
54
55
        return $sid;
56
    }
57
58
    public function getJudgeStatus($sid)
59
    {
60
        $status=DB::table($this->tableName)->where(['sid'=>$sid])->first();
61
        return $status;
62
    }
63
64
    public function getProblemStatus($pid, $uid, $cid=null)
65
    {
66
        if ($cid) {
67
            $end_time=strtotime(DB::table("contest")->where(["cid"=>$cid])->select("end_time")->first()["end_time"]);
68
            // Get the very first AC record
69
            $ac=DB::table($this->tableName)->where([
70
                'pid'=>$pid,
71
                'uid'=>$uid,
72
                'cid'=>$cid,
73
                'verdict'=>'Accepted'
74
            ])->where("submission_date", "<", $end_time)->orderBy('submission_date', 'desc')->first();
75
            if (empty($ac)) {
76
                $pac=DB::table($this->tableName)->where([
77
                    'pid'=>$pid,
78
                    'uid'=>$uid,
79
                    'cid'=>$cid,
80
                    'verdict'=>'Partially Accepted'
81
                ])->where("submission_date", "<", $end_time)->orderBy('submission_date', 'desc')->first();
82
                return empty($pac) ? DB::table($this->tableName)->where(['pid'=>$pid, 'uid'=>$uid, 'cid'=>$cid])->where("submission_date", "<", $end_time)->orderBy('submission_date', 'desc')->first() : $pac;
83
            } else {
84
                return $ac;
85
            }
86
        } else {
87
            $ac=DB::table($this->tableName)->where([
88
                'pid'=>$pid,
89
                'uid'=>$uid,
90
                'cid'=>$cid,
91
                'verdict'=>'Accepted'
92
            ])->orderBy('submission_date', 'desc')->first();
93
            return empty($ac) ? DB::table($this->tableName)->where(['pid'=>$pid, 'uid'=>$uid, 'cid'=>$cid])->orderBy('submission_date', 'desc')->first() : $ac;
94
        }
95
    }
96
97
    public function getProblemSubmission($pid, $uid, $cid=null)
98
    {
99
        $statusList=DB::table($this->tableName)->where(['pid'=>$pid, 'uid'=>$uid, 'cid'=>$cid])->orderBy('submission_date', 'desc')->limit(10)->get()->all();
100
        return $statusList;
101
    }
102
103
    public function countSolution($s)
104
    {
105
        return DB::table($this->tableName)->where(['solution'=>$s])->count();
106
    }
107
108
    public function getEarliestSubmission($oid)
109
    {
110
        return DB::table($this->tableName)  ->join('problem', 'problem.pid', '=', 'submission.pid')
111
                                            ->select("sid", "OJ as oid", "remote_id", "cid")
112
                                            ->where(['verdict'=>'Waiting','OJ'=>$oid])
113
                                            ->orderBy("sid","asc")
114
                                            ->first();
115
    }
116
117
    public function countEarliestWaitingSubmission($oid)
118
    {
119
        $early_sid=$this->getEarliestSubmission($oid);
120
        if($early_sid==null) return 0;
121
        $early_sid=$early_sid["sid"];
122
        return DB::table($this->tableName)  ->join('problem', 'problem.pid', '=', 'submission.pid')
123
                                            ->where(['OJ'=>$oid])
124
                                            ->where("sid",">=",$early_sid)
125
                                            ->count();
126
    }
127
128
129
    public function getWaitingSubmission()
130
    {
131
        return DB::table($this->tableName)  ->join('problem', 'problem.pid', '=', 'submission.pid')
132
                                            ->select("sid", "OJ as oid", "remote_id", "cid")
133
                                            ->where(['verdict'=>'Waiting'])
134
                                            ->get();
135
    }
136
137
    public function countWaitingSubmission($oid)
138
    {
139
        return DB::table($this->tableName)  ->join('problem', 'problem.pid', '=', 'submission.pid')
140
                                            ->where(['verdict'=>'Waiting', 'OJ'=>$oid])
141
                                            ->count();
142
    }
143
144
    public function updateSubmission($sid, $sub)
145
    {
146
        if (isset($sub['verdict'])) $sub["color"]=$this->colorScheme[$sub['verdict']];
147
        return DB::table($this->tableName)->where(['sid'=>$sid])->update($sub);
148
    }
149
150
    public function formatSubmitTime($date)
151
    {
152
        $periods=["second", "minute", "hour", "day", "week", "month", "year", "decade"];
153
        $lengths=["60", "60", "24", "7", "4.35", "12", "10"];
154
155
        $now=time();
156
        $unix_date=strtotime($date);
157
158
        if (empty($unix_date)) {
159
            return "Bad date";
160
        }
161
162
        if ($now>$unix_date) {
163
            $difference=$now-$unix_date;
164
            $tense="ago";
165
        } else {
166
            $difference=$unix_date-$now;
167
            $tense="from now";
168
        }
169
170
        for ($j=0; $difference>=$lengths[$j] && $j<count($lengths)-1; $j++) {
171
            $difference/=$lengths[$j];
172
        }
173
174
        $difference=round($difference);
175
176
        if ($difference!=1) {
177
            $periods[$j].="s";
178
        }
179
180
        return "$difference $periods[$j] {$tense}";
181
    }
182
183
    public function getRecord()
184
    {
185
        $paginator=DB::table("submission")->where([
186
            'cid'=>null
187
        ])->join(
188
            "users",
189
            "users.id",
190
            "=",
191
            "submission.uid"
192
        )->select(
193
            "sid",
194
            "uid",
195
            "pid",
196
            "name",
197
            "color",
198
            "verdict",
199
            "time",
200
            "memory",
201
            "language",
202
            "score",
203
            "submission_date"
204
        )->orderBy(
205
            'submission_date',
206
            'desc'
207
        )->paginate(50);
208
209
210
        $records= $paginator->all();
211
        foreach ($records as &$r) {
212
            $r["submission_date_parsed"]=$this->formatSubmitTime(date('Y-m-d H:i:s', $r["submission_date"]));
213
            $r["submission_date"]=date('Y-m-d H:i:s', $r["submission_date"]);
214
            $r["nick_name"]="";
215
        }
216
        return [
217
            "paginator"=>$paginator,
218
            "records"=>$records
219
        ];
220
    }
221
}
222