Passed
Push — master ( 22c3ff...7f91b6 )
by John
03:33
created

SubmissionModel::countSolution()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 1
nc 1
nop 1
dl 0
loc 3
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
    public $langConfig=[];
32
33
    public function __construct()
34
    {
35
        $tempLangConfig=[[
36
            "id" => "plaintext",
37
            "extensions" => [".txt", ".gitignore"],
38
            "aliases" => ["Plain Text", "text"],
39
            "mimetypes" => ["text/plain"]
40
        ], [
41
            "id" => "json",
42
            "extensions" => [".json", ".bowerrc", ".jshintrc", ".jscsrc", ".eslintrc", ".babelrc"],
43
            "aliases" => ["JSON", "json"],
44
            "mimetypes" => ["application/json"]
45
        ], [
46
            "id" => "bat",
47
            "extensions" => [".bat", ".cmd"],
48
            "aliases" => ["Batch", "bat"]
49
        ], [
50
            "id" => "coffeescript",
51
            "extensions" => [".coffee"],
52
            "aliases" => ["CoffeeScript", "coffeescript", "coffee"],
53
            "mimetypes" => ["text/x-coffeescript", "text/coffeescript"]
54
        ], [
55
            "id" => "c",
56
            "extensions" => [".c", ".h"],
57
            "aliases" => ["C", "c"]
58
        ], [
59
            "id" => "cpp",
60
            "extensions" => [".cpp", ".cc", ".cxx", ".hpp", ".hh", ".hxx"],
61
            "aliases" => ["C++", "Cpp", "cpp"]
62
        ], [
63
            "id" => "csharp",
64
            "extensions" => [".cs", ".csx", ".cake"],
65
            "aliases" => ["C#", "csharp"]
66
        ], [
67
            "id" => "csp",
68
            "extensions" => [],
69
            "aliases" => ["CSP", "csp"]
70
        ], [
71
            "id" => "css",
72
            "extensions" => [".css"],
73
            "aliases" => ["CSS", "css"],
74
            "mimetypes" => ["text/css"]
75
        ], [
76
            "id" => "dockerfile",
77
            "extensions" => [".dockerfile"],
78
            "filenames" => ["Dockerfile"],
79
            "aliases" => ["Dockerfile"]
80
        ], [
81
            "id" => "fsharp",
82
            "extensions" => [".fs", ".fsi", ".ml", ".mli", ".fsx", ".fsscript"],
83
            "aliases" => ["F#", "FSharp", "fsharp"]
84
        ], [
85
            "id" => "go",
86
            "extensions" => [".go"],
87
            "aliases" => ["Go"]
88
        ], [
89
            "id" => "handlebars",
90
            "extensions" => [".handlebars", ".hbs"],
91
            "aliases" => ["Handlebars", "handlebars"],
92
            "mimetypes" => ["text/x-handlebars-template"]
93
        ], [
94
            "id" => "html",
95
            "extensions" => [".html", ".htm", ".shtml", ".xhtml", ".mdoc", ".jsp", ".asp", ".aspx", ".jshtm"],
96
            "aliases" => ["HTML", "htm", "html", "xhtml"],
97
            "mimetypes" => ["text/html", "text/x-jshtm", "text/template", "text/ng-template"]
98
        ], [
99
            "id" => "ini",
100
            "extensions" => [".ini", ".properties", ".gitconfig"],
101
            "filenames" => ["config", ".gitattributes", ".gitconfig", ".editorconfig"],
102
            "aliases" => ["Ini", "ini"]
103
        ], [
104
            "id" => "java",
105
            "extensions" => [".java", ".jav"],
106
            "aliases" => ["Java", "java"],
107
            "mimetypes" => ["text/x-java-source", "text/x-java"]
108
        ], [
109
            "id" => "javascript",
110
            "extensions" => [".js", ".es6", ".jsx"],
111
            "firstLine" => "^#!.*\\bnode",
112
            "filenames" => ["jakefile"],
113
            "aliases" => ["JavaScript", "javascript", "js"],
114
            "mimetypes" => ["text/javascript"]
115
        ], [
116
            "id" => "less",
117
            "extensions" => [".less"],
118
            "aliases" => ["Less", "less"],
119
            "mimetypes" => ["text/x-less", "text/less"]
120
        ], [
121
            "id" => "lua",
122
            "extensions" => [".lua"],
123
            "aliases" => ["Lua", "lua"]
124
        ], [
125
            "id" => "markdown",
126
            "extensions" => [".md", ".markdown", ".mdown", ".mkdn", ".mkd", ".mdwn", ".mdtxt", ".mdtext"],
127
            "aliases" => ["Markdown", "markdown"]
128
        ], [
129
            "id" => "msdax",
130
            "extensions" => [".dax", ".msdax"],
131
            "aliases" => ["DAX", "MSDAX"]
132
        ], [
133
            "id" => "mysql",
134
            "extensions" => [],
135
            "aliases" => ["MySQL", "mysql"]
136
        ], [
137
            "id" => "objective-c",
138
            "extensions" => [".m"],
139
            "aliases" => ["Objective-C"]
140
        ], [
141
            "id" => "pgsql",
142
            "extensions" => [],
143
            "aliases" => ["PostgreSQL", "postgres", "pg", "postgre"]
144
        ], [
145
            "id" => "php",
146
            "extensions" => [".php", ".php4", ".php5", ".phtml", ".ctp"],
147
            "aliases" => ["PHP", "php"],
148
            "mimetypes" => ["application/x-php"]
149
        ], [
150
            "id" => "postiats",
151
            "extensions" => [".dats", ".sats", ".hats"],
152
            "aliases" => ["ATS", "ATS/Postiats"]
153
        ], [
154
            "id" => "powerquery",
155
            "extensions" => [".pq", ".pqm"],
156
            "aliases" => ["PQ", "M", "Power Query", "Power Query M"]
157
        ], [
158
            "id" => "powershell",
159
            "extensions" => [".ps1", ".psm1", ".psd1"],
160
            "aliases" => ["PowerShell", "powershell", "ps", "ps1"]
161
        ], [
162
            "id" => "pug",
163
            "extensions" => [".jade", ".pug"],
164
            "aliases" => ["Pug", "Jade", "jade"]
165
        ], [
166
            "id" => "python",
167
            "extensions" => [".py", ".rpy", ".pyw", ".cpy", ".gyp", ".gypi"],
168
            "aliases" => ["Python", "py"],
169
            "firstLine" => "^#!/.*\\bpython[0-9.-]*\\b"
170
        ], [
171
            "id" => "r",
172
            "extensions" => [".r", ".rhistory", ".rprofile", ".rt"],
173
            "aliases" => ["R", "r"]
174
        ], [
175
            "id" => "razor",
176
            "extensions" => [".cshtml"],
177
            "aliases" => ["Razor", "razor"],
178
            "mimetypes" => ["text/x-cshtml"]
179
        ], [
180
            "id" => "redis",
181
            "extensions" => [".redis"],
182
            "aliases" => ["redis"]
183
        ], [
184
            "id" => "redshift",
185
            "extensions" => [],
186
            "aliases" => ["Redshift", "redshift"]
187
        ], [
188
            "id" => "ruby",
189
            "extensions" => [".rb", ".rbx", ".rjs", ".gemspec", ".pp"],
190
            "filenames" => ["rakefile"],
191
            "aliases" => ["Ruby", "rb"]
192
        ], [
193
            "id" => "rust",
194
            "extensions" => [".rs", ".rlib"],
195
            "aliases" => ["Rust", "rust"]
196
        ], [
197
            "id" => "sb",
198
            "extensions" => [".sb"],
199
            "aliases" => ["Small Basic", "sb"]
200
        ], [
201
            "id" => "scss",
202
            "extensions" => [".scss"],
203
            "aliases" => ["Sass", "sass", "scss"],
204
            "mimetypes" => ["text/x-scss", "text/scss"]
205
        ], [
206
            "id" => "sol",
207
            "extensions" => [".sol"],
208
            "aliases" => ["sol", "solidity", "Solidity"]
209
        ], [
210
            "id" => "sql",
211
            "extensions" => [".sql"],
212
            "aliases" => ["SQL"]
213
        ], [
214
            "id" => "st",
215
            "extensions" => [".st", ".iecst", ".iecplc", ".lc3lib"],
216
            "aliases" => ["StructuredText", "scl", "stl"]
217
        ], [
218
            "id" => "swift",
219
            "aliases" => ["Swift", "swift"],
220
            "extensions" => [".swift"],
221
            "mimetypes" => ["text/swift"]
222
        ], [
223
            "id" => "typescript",
224
            "extensions" => [".ts", ".tsx"],
225
            "aliases" => ["TypeScript", "ts", "typescript"],
226
            "mimetypes" => ["text/typescript"]
227
        ], [
228
            "id" => "vb",
229
            "extensions" => [".vb"],
230
            "aliases" => ["Visual Basic", "vb"]
231
        ], [
232
            "id" => "xml",
233
            "extensions" => [".xml", ".dtd", ".ascx", ".csproj", ".config", ".wxi", ".wxl", ".wxs", ".xaml", ".svg", ".svgz"],
234
            "firstLine" => "(\\<\\?xml.*)|(\\<svg)|(\\<\\!doctype\\s+svg)",
235
            "aliases" => ["XML", "xml"],
236
            "mimetypes" => ["text/xml", "application/xml", "application/xaml+xml", "application/xml-dtd"]
237
        ], [
238
            "id" => "yaml",
239
            "extensions" => [".yaml", ".yml"],
240
            "aliases" => ["YAML", "yaml", "YML", "yml"],
241
            "mimetypes" => ["application/x-yaml"]
242
        ], [
243
            "id" => "scheme",
244
            "extensions" => [".scm", ".ss", ".sch", ".rkt"],
245
            "aliases" => ["scheme", "Scheme"]
246
        ], [
247
            "id" => "clojure",
248
            "extensions" => [".clj", ".clojure"],
249
            "aliases" => ["clojure", "Clojure"]
250
        ], [
251
            "id" => "shell",
252
            "extensions" => [".sh", ".bash"],
253
            "aliases" => ["Shell", "sh"]
254
        ], [
255
            "id" => "perl",
256
            "extensions" => [".pl"],
257
            "aliases" => ["Perl", "pl"]
258
        ], [
259
            "id" => "azcli",
260
            "extensions" => [".azcli"],
261
            "aliases" => ["Azure CLI", "azcli"]
262
        ], [
263
            "id" => "apex",
264
            "extensions" => [".cls"],
265
            "aliases" => ["Apex", "apex"],
266
            "mimetypes" => ["text/x-apex-source", "text/x-apex"]
267
        ]];
268
        foreach($tempLangConfig as $t){
269
            $this->langConfig[$t["id"]]=$t;
270
        }
271
    }
272
273
    public function insert($sub)
274
    {
275
        if (strlen($sub['verdict'])==0) {
276
            $sub['verdict']="Judge Error";
277
        }
278
279
        $sid=DB::table($this->tableName)->insertGetId([
280
            'time' => $sub['time'],
281
            'verdict' => $sub['verdict'],
282
            'solution' => $sub['solution'],
283
            'language' => $sub['language'],
284
            'submission_date' => $sub['submission_date'],
285
            'memory' => $sub['memory'],
286
            'uid' => $sub['uid'],
287
            'pid' => $sub['pid'],
288
            'cid' => $sub['cid'],
289
            'color' => $this->colorScheme[$sub['verdict']],
290
            'remote_id'=>$sub['remote_id'],
291
            'compile_info'=>"",
292
            'coid'=>$sub['coid'],
293
            'score'=>$sub['score']
294
        ]);
295
296
        return $sid;
297
    }
298
299
    public function getJudgeStatus($sid, $uid)
300
    {
301
        $status=DB::table($this->tableName)->where(['sid'=>$sid])->first();
302
        if($uid!=$status["uid"]){
303
            $status["solution"]=null;
304
        }
305
        $compilerModel=new CompilerModel();
306
        $status["lang"]=$compilerModel->detail($status["coid"])["lang"];
307
        return $status;
308
    }
309
310
    public function downloadCode($sid, $uid)
311
    {
312
        $status=DB::table($this->tableName)->where(['sid'=>$sid,'uid'=>$uid])->first();
313
        if(empty($status)){
314
            return [];
315
        }
316
        $lang=DB::table("compiler")->where(['coid'=>$status["coid"]])->first()["lang"];
317
        $curLang=isset($this->langConfig[$lang])?$this->langConfig[$lang]:$this->langConfig["plaintext"];
318
        return [
319
            "content"=>$status["solution"],
320
            "name"=>$status["submission_date"].$curLang["extensions"][0],
321
        ];
322
    }
323
324
    public function getProblemStatus($pid, $uid, $cid=null)
325
    {
326
        if ($cid) {
327
            $end_time=strtotime(DB::table("contest")->where(["cid"=>$cid])->select("end_time")->first()["end_time"]);
328
            // Get the very first AC record
329
            $ac=DB::table($this->tableName)->where([
330
                'pid'=>$pid,
331
                'uid'=>$uid,
332
                'cid'=>$cid,
333
                'verdict'=>'Accepted'
334
            ])->where("submission_date", "<", $end_time)->orderBy('submission_date', 'desc')->first();
335
            if (empty($ac)) {
336
                $pac=DB::table($this->tableName)->where([
337
                    'pid'=>$pid,
338
                    'uid'=>$uid,
339
                    'cid'=>$cid,
340
                    'verdict'=>'Partially Accepted'
341
                ])->where("submission_date", "<", $end_time)->orderBy('submission_date', 'desc')->first();
342
                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;
343
            } else {
344
                return $ac;
345
            }
346
        } else {
347
            $ac=DB::table($this->tableName)->where([
348
                'pid'=>$pid,
349
                'uid'=>$uid,
350
                'cid'=>$cid,
351
                'verdict'=>'Accepted'
352
            ])->orderBy('submission_date', 'desc')->first();
353
            return empty($ac) ? DB::table($this->tableName)->where(['pid'=>$pid, 'uid'=>$uid, 'cid'=>$cid])->orderBy('submission_date', 'desc')->first() : $ac;
354
        }
355
    }
356
357
    public function getProblemSubmission($pid, $uid, $cid=null)
358
    {
359
        $statusList=DB::table($this->tableName)->where(['pid'=>$pid, 'uid'=>$uid, 'cid'=>$cid])->orderBy('submission_date', 'desc')->limit(10)->get()->all();
360
        return $statusList;
361
    }
362
363
    public function countSolution($s)
364
    {
365
        return DB::table($this->tableName)->where(['solution'=>$s])->count();
366
    }
367
368
    public function getEarliestSubmission($oid)
369
    {
370
        return DB::table($this->tableName)  ->join('problem', 'problem.pid', '=', 'submission.pid')
371
                                            ->select("sid", "OJ as oid", "remote_id", "cid")
372
                                            ->where(['verdict'=>'Waiting','OJ'=>$oid])
373
                                            ->orderBy("sid","asc")
374
                                            ->first();
375
    }
376
377
    public function countEarliestWaitingSubmission($oid)
378
    {
379
        $early_sid=$this->getEarliestSubmission($oid);
380
        if($early_sid==null) return 0;
381
        $early_sid=$early_sid["sid"];
382
        return DB::table($this->tableName)  ->join('problem', 'problem.pid', '=', 'submission.pid')
383
                                            ->where(['OJ'=>$oid])
384
                                            ->where("sid",">=",$early_sid)
385
                                            ->count();
386
    }
387
388
389
    public function getWaitingSubmission()
390
    {
391
        return DB::table($this->tableName)  ->join('problem', 'problem.pid', '=', 'submission.pid')
392
                                            ->select("sid", "OJ as oid", "remote_id", "cid", "jid")
393
                                            ->where(['verdict'=>'Waiting'])
394
                                            ->get();
395
    }
396
397
    public function countWaitingSubmission($oid)
398
    {
399
        return DB::table($this->tableName)  ->join('problem', 'problem.pid', '=', 'submission.pid')
400
                                            ->where(['verdict'=>'Waiting', 'OJ'=>$oid])
401
                                            ->count();
402
    }
403
404
    public function updateSubmission($sid, $sub)
405
    {
406
        if (isset($sub['verdict'])) $sub["color"]=$this->colorScheme[$sub['verdict']];
407
        return DB::table($this->tableName)->where(['sid'=>$sid])->update($sub);
408
    }
409
410
    public function formatSubmitTime($date)
411
    {
412
        $periods=["second", "minute", "hour", "day", "week", "month", "year", "decade"];
413
        $lengths=["60", "60", "24", "7", "4.35", "12", "10"];
414
415
        $now=time();
416
        $unix_date=strtotime($date);
417
418
        if (empty($unix_date)) {
419
            return "Bad date";
420
        }
421
422
        if ($now>$unix_date) {
423
            $difference=$now-$unix_date;
424
            $tense="ago";
425
        } else {
426
            $difference=$unix_date-$now;
427
            $tense="from now";
428
        }
429
430
        for ($j=0; $difference>=$lengths[$j] && $j<count($lengths)-1; $j++) {
431
            $difference/=$lengths[$j];
432
        }
433
434
        $difference=round($difference);
435
436
        if ($difference!=1) {
437
            $periods[$j].="s";
438
        }
439
440
        return "$difference $periods[$j] {$tense}";
441
    }
442
443
    public function getRecord()
444
    {
445
        $paginator=DB::table("submission")->where([
446
            'cid'=>null
447
        ])->join(
448
            "users",
449
            "users.id",
450
            "=",
451
            "submission.uid"
452
        )->select(
453
            "sid",
454
            "uid",
455
            "pid",
456
            "name",
457
            "color",
458
            "verdict",
459
            "time",
460
            "memory",
461
            "language",
462
            "score",
463
            "submission_date"
464
        )->orderBy(
465
            'submission_date',
466
            'desc'
467
        )->paginate(50);
468
469
470
        $records= $paginator->all();
471
        foreach ($records as &$r) {
472
            $r["submission_date_parsed"]=$this->formatSubmitTime(date('Y-m-d H:i:s', $r["submission_date"]));
473
            $r["submission_date"]=date('Y-m-d H:i:s', $r["submission_date"]);
474
            $r["nick_name"]="";
475
        }
476
        return [
477
            "paginator"=>$paginator,
478
            "records"=>$records
479
        ];
480
    }
481
}
482