123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784 |
- //
- // RQQuestionDBManager.m
- // SDJK
- //
- // Created by 张嵘 on 2021/8/20.
- //
- #import "RQQuestionDBManager.h"
- static NSString *dbNameStr = @"question";
- static NSString *dbTypeStr = @"db";
- static NSString *questionTableNameStr = @"question_info";
- @interface RQQuestionDBManager ()
- @property (nonatomic, readwrite, strong) FMDatabaseQueue *databaseQueue;
- @end
- @implementation RQQuestionDBManager
- static id rq_questionDBManager = nil;
- #pragma mark - init
- + (instancetype)sharedInstance {
- static dispatch_once_t onceToken;
- dispatch_once(&onceToken, ^{
- rq_questionDBManager = [[self alloc] init];
- });
- return rq_questionDBManager;
- }
- - (instancetype)init {
- if (self = [super init]) {
- NSString *resourcePath = [[NSBundle mainBundle] pathForResource:@"question" ofType:@"db"];
- [self initDatabaseQueueWithResourcePath:resourcePath];
- }
- return self;
- }
- - (void)initDatabaseQueueWithResourcePath:(NSString *)resourcePath {
- NSError *error;
- NSString *dbPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject] stringByAppendingPathComponent:[NSString stringWithFormat:@"question.db"]];
- if ([RQFileManager isPathExist:dbPath]) {
- self.databaseQueue = [FMDatabaseQueue databaseQueueWithPath:dbPath];
- NSLog(@"数据库path-----%@",dbPath);
- if ([self getQuestionVersion] >= [self getQuestionVersionWithResourcePath:resourcePath]) {
- } else {
- [[RQFileManager fileManager] removeItemAtPath:dbPath error:&error];
- [[RQFileManager fileManager] copyItemAtPath:resourcePath toPath:[[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject] stringByAppendingPathComponent:[NSString stringWithFormat:@"question.db"]] error:&error];
- self.databaseQueue = [FMDatabaseQueue databaseQueueWithPath:dbPath];
- }
- } else {
- [[RQFileManager fileManager] copyItemAtPath:resourcePath toPath:[[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject] stringByAppendingPathComponent:[NSString stringWithFormat:@"question.db"]] error:&error];
- self.databaseQueue = [FMDatabaseQueue databaseQueueWithPath:dbPath];
- NSLog(@"数据库path-----%@",dbPath);
- }
- }
- #pragma mark - Public Method
- - (NSArray *)getColumnWithCarType:(RQHomePageCarType)carType subject:(RQHomePageSubjectType)subject pageType:(RQHomeSubPageType)pageType {
-
- /// 默认为轿车 cart,bus,truck
- NSString *queryCarTypeStr = @"model LIKE '%cart%'";
-
- switch (carType) {
- case RQHomePageCarType_Car:
- queryCarTypeStr = @"model LIKE '%cart%'";
- break;
- case RQHomePageCarType_Bus:
- queryCarTypeStr = @"model LIKE '%bus%'";
- break;
- case RQHomePageCarType_Truck:
- queryCarTypeStr = @"model LIKE '%truck%'";
- break;
- case RQHomePageCarType_Motorcycle:
- queryCarTypeStr = @"model LIKE '%mtc%'";
- break;
-
- default:
- break;
- }
- /// 默认科目一
- NSString *querySubjectTypeStr = @"k1";
-
- switch (subject) {
- case RQHomePageSubjectType_SubjectOne:
- querySubjectTypeStr = @"k1";
- break;
- case RQHomePageSubjectType_SubjectTwo:
- querySubjectTypeStr = @"k2";
- break;
- case RQHomePageSubjectType_SubjectThree:
- querySubjectTypeStr = @"k3";
- break;
- case RQHomePageSubjectType_SubjectFour:
- querySubjectTypeStr = @"k4";
- break;
-
- default:
- break;
- }
-
- /// 默认顺序练习
- NSString *pageTypeStr = @"title";
- NSString *pageTypeByOrderStr = @"sort";
- switch (pageType) {
- case RQHomeSubPageType_SequentialPractice:/// 顺序练习
- pageTypeStr = @"title,column_id";
- pageTypeByOrderStr = @"sort";
- querySubjectTypeStr = [NSString stringWithFormat:@"subject = '%@'",querySubjectTypeStr];
- break;
- case RQHomeSubPageType_LocalTopics: /// 地方专题
- pageTypeStr = @"title,column_id";
- pageTypeByOrderStr = @"sort";
- querySubjectTypeStr = [NSString stringWithFormat:@"%@_4",querySubjectTypeStr];
- querySubjectTypeStr = [NSString stringWithFormat:@"subject = '%@'",querySubjectTypeStr];
- break;
- case RQHomeSubPageType_ClassificationExercise:/// 分类练习
- pageTypeStr = @"title,column_id";
- pageTypeByOrderStr = @"sort";
- querySubjectTypeStr = [NSString stringWithFormat:@"%@_3",querySubjectTypeStr];
- querySubjectTypeStr = [NSString stringWithFormat:@"subject = '%@'",querySubjectTypeStr];
- break;
- case RQHomeSubPageType_SelectedTestQuestions: //精选考题
- pageTypeStr = @"title,column_id";
- pageTypeByOrderStr = @"sort";
- querySubjectTypeStr = [NSString stringWithFormat:@"%@_2",querySubjectTypeStr];
- querySubjectTypeStr = [NSString stringWithFormat:@"subject = '%@'",querySubjectTypeStr];
- break;
-
- default:
- break;
- }
-
- //v1.1.2 旧逻辑
- // NSString *queryStr = [NSString stringWithFormat:@"select distinct %@ from question_info where %@ and %@ %@ order by %@ + 0 ASC", pageTypeStr, queryCarTypeStr, querySubjectTypeStr, (pageType == RQHomeSubPageType_LocalTopics)? @"and place_issue IS NOT NULL" : @"", pageTypeByOrderStr];
- //v1.1.3
- NSString *queryStr = [NSString stringWithFormat:@"select distinct %@ from question_column where %@ and %@ order by %@ + 0 ASC", pageTypeStr, queryCarTypeStr, querySubjectTypeStr, pageTypeByOrderStr];
- // select distinct * from WHERE subject = 'k1_2' AND model LIKE '%cart%' order by sort ASC
- NSMutableArray *arr = @[].mutableCopy;
- @weakify(arr)
- [_databaseQueue inTransaction:^(FMDatabase * _Nonnull db, BOOL * _Nonnull rollback) {
- @try {
- @strongify(arr)
- FMResultSet *resultSet = [db executeQuery:queryStr];
- while ([resultSet next]) {
- if([pageTypeStr containsString:@","]){
- NSString *str = [resultSet stringForColumn:@"title"];
- NSString *strCol = [resultSet stringForColumn:@"column_id"];
- NSString *str_title = [NSString stringWithFormat:@"%@,%@",str,strCol];
- // 对应字段来取数据
- [arr addObject:str_title? : @"地方题"];
- }else{
- NSString *str = [resultSet stringForColumn:pageTypeStr];
- // 对应字段来取数据
- [arr addObject:str? : @"地方题"];
- }
-
- }
- if ([arr containsObject:@"地方题"] && [arr indexOfObject:@"地方题"] == 0) {
- NSString *saveStr = arr.firstObject;
- [arr removeFirstObject];
- [arr addObject:saveStr];
- }
- } @catch (NSException *exception) {
- *rollback = YES;
- } @finally {
- *rollback = NO;
- }
- }];
-
- return arr.copy;
- }
- - (NSArray *)getQuestionWithCarType:(RQHomePageCarType)carType subject:(RQHomePageSubjectType)subject pageType:(RQHomeSubPageType)pageType name:(NSString *)name exerciseType:(RQExerciseType)exerciseType {
-
-
- NSMutableArray *arr = @[].mutableCopy;
- /// 默认为轿车 cart,bus,truck
- NSString *queryCarTypeStr = @"model LIKE '%cart%'";
- NSString *carTypeStr = @"cart";
- switch (carType) {
- case RQHomePageCarType_Car:
- queryCarTypeStr = @"model LIKE '%cart%'";
- carTypeStr = @"cart";
- break;
- case RQHomePageCarType_Bus:
- queryCarTypeStr = @"model LIKE '%bus%'";
- carTypeStr = @"bus";
- break;
- case RQHomePageCarType_Truck:
- queryCarTypeStr = @"model LIKE '%truck%'";
- carTypeStr = @"truck";
- break;
- case RQHomePageCarType_Motorcycle:
- queryCarTypeStr = @"model LIKE '%mtc%'";
- break;
-
- default:
- break;
- }
- /// 默认科目一
- NSString *querySubjectTypeStr = @"subject = 1";
- NSString *subjectTypeStr = @"1";
- switch (subject) {
- case RQHomePageSubjectType_SubjectOne:
- querySubjectTypeStr = @"subject = 1";
- subjectTypeStr = @"1";
- break;
- case RQHomePageSubjectType_SubjectTwo:
- querySubjectTypeStr = @"subject = 2";
- subjectTypeStr = @"2";
- break;
- case RQHomePageSubjectType_SubjectThree:
- querySubjectTypeStr = @"subject = 3";
- subjectTypeStr = @"3";
- break;
- case RQHomePageSubjectType_SubjectFour:
- querySubjectTypeStr = @"subject = 4";
- subjectTypeStr = @"4";
- break;
-
- default:
- break;
- }
-
- /// 默认顺序练习
- // NSString *pageTypeStr = @"seque_issue_name";
- // NSString *pageTypeByOrderStr = @"seque_issue";
- NSString *nameStr = @"";
- NSString *orderStr = @"";
- NSString *colidStr = @"";
- if([name containsString:@","]){
- colidStr = [[name componentsSeparatedByString:@","] lastObject];
- }
- switch (pageType) {
-
- //// pageTypeStr = @"place_issue_name";
- //// pageTypeByOrderStr = @"place_issue";
- // nameStr = [NSString stringWithFormat:@"and place_issue_name = '%@'",name];
- // orderStr = @"number";
- // break;
- case RQHomeSubPageType_LocalTopics:
- case RQHomeSubPageType_ClassificationExercise:
- case RQHomeSubPageType_SequentialPractice:
- case RQHomeSubPageType_SelectedTestQuestions:
- // pageTypeStr = @"excell_issue_name";
- // pageTypeByOrderStr = @"excell_issue";
-
- nameStr = [NSString stringWithFormat:@"(INSTR ( column_all, ',' || '%@' || ',' ) > 0 OR INSTR ( column_all, '%@' || ',' ) = 1 OR INSTR ( column_all, ',' || '%@' ) = ( length( column_all ) - length( ',' || '%@' ) ) + 1 OR column_all = '%@')",colidStr,colidStr,colidStr,colidStr,colidStr];
- orderStr = @"number";
- break;
-
- default:
- break;
- }
- if (RQStringIsEmpty(name)) {
- nameStr = @"";
- }
-
-
-
-
- /// excell_sort
- /// 默认按_id排序
- NSString *exerciseTypeStr = [NSString stringWithFormat:@"%@ + 0 ASC", orderStr];
- switch (exerciseType) {
- case RQExerciseType_Sequential:
- // exerciseTypeStr = [NSString stringWithFormat:@"%@ + 0 ASC", orderStr];
- break;
- case RQExerciseType_Random:
- // exerciseTypeStr = @"random()";
- break;
- case RQExerciseType_Recitation:
- // exerciseTypeStr = [NSString stringWithFormat:@"%@ + 0 ASC", orderStr];
- break;
- case RQExerciseType_Test:
- // exerciseTypeStr = @"random() limit 50";
- break;
- case RQExerciseType_Exam:
- // exerciseTypeStr = @"random() limit 5";
- break;
-
- default:
- break;
- }
-
- // resultSet = [_db executeQuery:@"select * from question_info where answer like '%-%'"];
- NSString *queryStr = [NSString stringWithFormat:@"select * from question_info where %@ and %@ order by %@", queryCarTypeStr, nameStr, exerciseTypeStr];
-
-
- @weakify(queryStr)
- if (pageType == RQHomeSubPageType_MockExamination && exerciseType == RQExerciseType_Test) {
- NSString *excellIssueNameStr = (carType == RQHomePageCarType_Motorcycle)? @"" : @"AND excell_issue_name LIKE '%%必%%'";
- NSString *newExcellIssueNameStr = (carType == RQHomePageCarType_Motorcycle)? @"" : @"AND excell_issue_name LIKE '%%新%%'";
- RACSignal *signal1 = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
- @strongify(queryStr)
- queryStr = [NSString stringWithFormat:@"select * from question_info where %@ and %@ %@ and question_type = 1 and place_issue IS NULL %@ order by %@", queryCarTypeStr, querySubjectTypeStr, nameStr, excellIssueNameStr, [self getQuestionNumQueryStrWithCarType:carType subject:subject questionType:RQQuestionType_Judgment isNew:NO]];
- [subscriber sendNext:[self queryQuestionWithQueryStr:queryStr exerciseType:exerciseType]];
- [subscriber sendCompleted];
- return [RACDisposable disposableWithBlock:^{
- }];
- }];
-
- RACSignal *signal2 = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
- @strongify(queryStr)
- queryStr = [NSString stringWithFormat:@"select * from question_info where %@ and %@ %@ and question_type = 1 and place_issue IS NULL %@ order by %@", queryCarTypeStr, querySubjectTypeStr, nameStr, newExcellIssueNameStr, [self getQuestionNumQueryStrWithCarType:carType subject:subject questionType:RQQuestionType_Judgment isNew:YES]];
- [subscriber sendNext:[self queryQuestionWithQueryStr:queryStr exerciseType:exerciseType]];
- [subscriber sendCompleted];
- return [RACDisposable disposableWithBlock:^{
- }];
- }];
-
- RACSignal *signal3 = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
- @strongify(queryStr)
- queryStr = [NSString stringWithFormat:@"select * from question_info where %@ and %@ %@ and question_type = 2 and place_issue IS NULL %@ order by %@", queryCarTypeStr, querySubjectTypeStr, nameStr, excellIssueNameStr, [self getQuestionNumQueryStrWithCarType:carType subject:subject questionType:RQQuestionType_SingleChoice isNew:NO]];
- [subscriber sendNext:[self queryQuestionWithQueryStr:queryStr exerciseType:exerciseType]];
- [subscriber sendCompleted];
- return [RACDisposable disposableWithBlock:^{
- }];
- }];
-
- RACSignal *signal4 = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
- @strongify(queryStr)
- queryStr = [NSString stringWithFormat:@"select * from question_info where %@ and %@ %@ and question_type = 2 and place_issue IS NULL %@ order by %@", queryCarTypeStr, querySubjectTypeStr, nameStr, newExcellIssueNameStr, [self getQuestionNumQueryStrWithCarType:carType subject:subject questionType:RQQuestionType_SingleChoice isNew:YES]];
- [subscriber sendNext:[self queryQuestionWithQueryStr:queryStr exerciseType:exerciseType]];
- [subscriber sendCompleted];
- return [RACDisposable disposableWithBlock:^{
- }];
- }];
-
- RACSignal *signal5 = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
- @strongify(queryStr)
- queryStr = [NSString stringWithFormat:@"select * from question_info where %@ and %@ %@ and question_type = 3 and place_issue IS NULL %@ order by %@", queryCarTypeStr, querySubjectTypeStr, nameStr, excellIssueNameStr, [self getQuestionNumQueryStrWithCarType:carType subject:subject questionType:RQQuestionType_MultipleChoice isNew:NO]];
- [subscriber sendNext:[self queryQuestionWithQueryStr:queryStr exerciseType:exerciseType]];
- [subscriber sendCompleted];
- return [RACDisposable disposableWithBlock:^{
- }];
- }];
-
- RACSignal *signal6 = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
- @strongify(queryStr)
- queryStr = [NSString stringWithFormat:@"select * from question_info where %@ and %@ %@ and question_type = 3 and place_issue IS NULL %@ order by %@", queryCarTypeStr, querySubjectTypeStr, nameStr, newExcellIssueNameStr, [self getQuestionNumQueryStrWithCarType:carType subject:subject questionType:RQQuestionType_MultipleChoice isNew:YES]];
- [subscriber sendNext:[self queryQuestionWithQueryStr:queryStr exerciseType:exerciseType]];
- [subscriber sendCompleted];
- return [RACDisposable disposableWithBlock:^{
- }];
- }];
-
- RACSignal *signal = [RACSignal combineLatest:@[signal1, signal2, signal3, signal4, signal5, signal6] reduce:^id (NSArray *arr1, NSArray *arr2, NSArray *arr3, NSArray *arr4, NSArray *arr5, NSArray *arr6) {
- NSMutableArray *judgmentArr = @[].mutableCopy;
- [judgmentArr addObjectsFromArray:arr1];
- [judgmentArr addObjectsFromArray:arr2];
- judgmentArr = [judgmentArr rq_randomArray].mutableCopy;
-
- NSMutableArray *singleChoiceArr = @[].mutableCopy;
- [singleChoiceArr addObjectsFromArray:arr3];
- [singleChoiceArr addObjectsFromArray:arr4];
- singleChoiceArr = [singleChoiceArr rq_randomArray].mutableCopy;
-
- NSMutableArray *multipleChoiceArr = @[].mutableCopy;
- [multipleChoiceArr addObjectsFromArray:arr5];
- [multipleChoiceArr addObjectsFromArray:arr6];
- multipleChoiceArr = [multipleChoiceArr rq_randomArray].mutableCopy;
-
-
- [arr addObjectsFromArray:judgmentArr];
- [arr addObjectsFromArray:singleChoiceArr];
- [arr addObjectsFromArray:multipleChoiceArr];
- return arr.copy;
- }];
- [signal subscribeNext:^(NSArray *allArr) {
-
- }];
- return arr.copy;
- } else if (pageType == RQHomeSubPageType_MockExamination && exerciseType == RQExerciseType_Exam) {
- @weakify(self)
- RACSignal *signal0 = [RQ_HTTP_Service getSelectTestK14QuestionInfoList:carTypeStr subject:subjectTypeStr];
- [[signal0 takeUntil:self.rac_willDeallocSignal] subscribeNext:^(NSArray *array) {
- NSLog(@"%@",array);
- } error:^(NSError * _Nullable error) {
- }];
- RACSignal *signal = [RACSignal combineLatest:@[signal0] reduce:^id (NSArray *arr1) {
- NSLog(@"signal0=========%@",arr1);
- [arr addObjectsFromArray:arr1];
- return arr.copy;
- }];
- [signal subscribeNext:^(NSArray *allArr) {
-
- }];
- return arr.copy;
- // RACSignal *signal0 = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
- // @strongify(self)
- // NSMutableArray *difficultArr = @[].mutableCopy;
- //
- //// [[[self getExamRuleWithCarType:carType subject:subject].rac_sequence.signal map:^id _Nullable(RQExamRuleModel *examRuleModel) {
- //// NSString *chapterIdStr = [NSString stringWithFormat:@"chapter_id = %ld",(long)examRuleModel.chapter_id];
- //// NSString *typeStr = [NSString stringWithFormat:@"question_type IN %@",(subject == RQHomePageSubjectType_SubjectOne)? @"(1, 2)" : @"(1, 2, 3)"];
- //// NSString *randomStr = [NSString stringWithFormat:@"RANDOM() LIMIT %@",[NSString qmui_stringWithNSInteger:examRuleModel.difficult_count]];
- //// NSString *difficultQueryStr = [NSString stringWithFormat:@"SELECT * FROM %@ WHERE %@ AND %@ AND diff_degree IN (4, 5) AND place_issue IS NULL AND %@ AND %@ ORDER BY %@",questionTableNameStr , queryCarTypeStr, querySubjectTypeStr, chapterIdStr, typeStr, randomStr];
- //// return difficultQueryStr;
- //// }].toArray.rac_sequence.signal subscribeNext:^(NSString *difficultQueryStr) {
- //// @strongify(self)
- //// [difficultArr addObjectsFromArray:[self queryQuestionWithQueryStr:difficultQueryStr]];
- //// } completed:^{
- //// [subscriber sendNext:difficultArr.copy];
- //// [subscriber sendCompleted];
- //// }];
- // return [RACDisposable disposableWithBlock:^{}];
- // }];
-
- // RACSignal *signal1 = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
- // NSMutableArray *judgeArr = @[].mutableCopy;
- // [[[self getExamRuleWithCarType:carType subject:subject].rac_sequence.signal map:^id _Nullable(RQExamRuleModel *examRuleModel) {
- // NSString *chapterIdStr = [NSString stringWithFormat:@"AND chapter_id = %ld",(long)examRuleModel.chapter_id];
- // NSString *judgeCountStr = [NSString stringWithFormat:@"RANDOM() LIMIT %ld",(long)examRuleModel.judge_count];
- // NSString *judgeQueryStr = [NSString stringWithFormat:@"SELECT * FROM %@ WHERE %@ AND %@ AND question_type = 1 AND diff_degree IN (0,1,2,3) AND place_issue IS NULL %@ ORDER BY %@",questionTableNameStr , queryCarTypeStr, querySubjectTypeStr, chapterIdStr, judgeCountStr];
- // NSMutableArray *judgeChapterArr = [self queryQuestionWithQueryStr:judgeQueryStr].mutableCopy;
- // if (judgeChapterArr.count < examRuleModel.judge_count) {
- // NSString *judgeQueryAddStr = [NSString stringWithFormat:@"SELECT DISTINCT * FROM %@ WHERE %@ AND %@ AND question_type = 1 AND diff_degree IN (4,5) AND place_issue IS NULL %@ ORDER BY RANDOM() LIMIT %@",questionTableNameStr , queryCarTypeStr, querySubjectTypeStr, chapterIdStr, [NSString stringWithFormat:@"%ld",(long)(examRuleModel.judge_count - judgeChapterArr.count)]];
- // NSArray *judgeChapterAddArr = [self queryQuestionWithQueryStr:judgeQueryAddStr];
- // [judgeChapterArr addObjectsFromArray:judgeChapterAddArr];
- // return judgeChapterArr.copy;
- // } else {
- // return judgeChapterArr.copy;
- // }
- // }].toArray.rac_sequence.signal subscribeNext:^(NSArray *judgeChapterArr) {
- // [judgeArr addObjectsFromArray:judgeChapterArr];
- // } completed:^{
- // [subscriber sendNext:judgeArr.copy];
- // [subscriber sendCompleted];
- // }];
- // return [RACDisposable disposableWithBlock:^{}];
- // }];
- //
- // RACSignal *signal2 = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
- // NSMutableArray *choiceArr = @[].mutableCopy;
- // [[[self getExamRuleWithCarType:carType subject:subject].rac_sequence.signal map:^id _Nullable(RQExamRuleModel *examRuleModel) {
- // NSString *chapterIdStr = [NSString stringWithFormat:@"AND chapter_id = %ld",(long)examRuleModel.chapter_id];
- // NSString *choiceCountStr = [NSString stringWithFormat:@"RANDOM() LIMIT %ld",(long)examRuleModel.choice_count];
- // NSString *choiceQueryStr = [NSString stringWithFormat:@"SELECT * FROM %@ WHERE %@ AND %@ AND question_type = 2 AND diff_degree IN (0,1,2,3) AND place_issue IS NULL %@ ORDER BY %@",questionTableNameStr , queryCarTypeStr, querySubjectTypeStr, chapterIdStr, choiceCountStr];
- // NSMutableArray *choiceChapterArr = [self queryQuestionWithQueryStr:choiceQueryStr].mutableCopy;
- // if (choiceChapterArr.count < examRuleModel.choice_count) {
- // NSString *choiceQueryAddStr = [NSString stringWithFormat:@"SELECT DISTINCT * FROM %@ WHERE %@ AND %@ AND question_type = 2 AND diff_degree IN (4,5) AND place_issue IS NULL %@ ORDER BY RANDOM() LIMIT %@",questionTableNameStr , queryCarTypeStr, querySubjectTypeStr, chapterIdStr, [NSString stringWithFormat:@"%ld",(long)(examRuleModel.choice_count - choiceChapterArr.count)]];
- // NSArray *choiceChapterAddArr = [self queryQuestionWithQueryStr:choiceQueryAddStr];
- // [choiceChapterArr addObjectsFromArray:choiceChapterAddArr];
- // return choiceChapterArr.copy;
- // } else {
- // return choiceChapterArr.copy;
- // }
- // }].toArray.rac_sequence.signal subscribeNext:^(NSArray *choiceChapterArr) {
- // [choiceArr addObjectsFromArray:choiceChapterArr];
- // } completed:^{
- // [subscriber sendNext:choiceArr.copy];
- // [subscriber sendCompleted];
- // }];
- // return [RACDisposable disposableWithBlock:^{}];
- // }];
- // RACSignal *signal3 = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
- // NSMutableArray *multipleChoiceArr = @[].mutableCopy;
- // [[[self getExamRuleWithCarType:carType subject:subject].rac_sequence.signal map:^id _Nullable(RQExamRuleModel *examRuleModel) {
- // NSString *chapterIdStr = [NSString stringWithFormat:@"AND chapter_id = %ld",(long)examRuleModel.chapter_id];
- // NSString *multipleChoiceCountStr = [NSString stringWithFormat:@"RANDOM() LIMIT %ld",(long)examRuleModel.multiple_choice_count];
- // NSString *multipleChoiceQueryStr = [NSString stringWithFormat:@"SELECT * FROM %@ WHERE %@ AND %@ AND question_type = 3 AND diff_degree IN (0,1,2,3) AND place_issue IS NULL %@ ORDER BY %@",questionTableNameStr , queryCarTypeStr, querySubjectTypeStr, chapterIdStr, multipleChoiceCountStr];
- // NSMutableArray *multipleChoiceChapterArr = [self queryQuestionWithQueryStr:multipleChoiceQueryStr].mutableCopy;
- // if (multipleChoiceChapterArr.count < examRuleModel.multiple_choice_count) {
- // NSString *multipleChoiceQueryAddStr = [NSString stringWithFormat:@"SELECT DISTINCT * FROM %@ WHERE %@ AND %@ AND question_type = 3 AND diff_degree IN (4,5) AND place_issue IS NULL %@ ORDER BY RANDOM() LIMIT %@",questionTableNameStr , queryCarTypeStr, querySubjectTypeStr, chapterIdStr, [NSString stringWithFormat:@"%ld",(long)(examRuleModel.multiple_choice_count - multipleChoiceChapterArr.count)]];
- // NSArray *multipleChoiceChapterAddArr = [self queryQuestionWithQueryStr:multipleChoiceQueryAddStr];
- // [multipleChoiceChapterArr addObjectsFromArray:multipleChoiceChapterAddArr];
- // return multipleChoiceChapterArr.copy;
- // } else {
- // return multipleChoiceChapterArr.copy;
- // }
- // }].toArray.rac_sequence.signal subscribeNext:^(NSArray *multipleChoiceChapterArr) {
- // [multipleChoiceArr addObjectsFromArray:multipleChoiceChapterArr];
- // } completed:^{
- // [subscriber sendNext:multipleChoiceArr.copy];
- // [subscriber sendCompleted];
- // }];
- // return [RACDisposable disposableWithBlock:^{}];
- // }];
-
- // return [[[RACSignal combineLatest:@[signal0] reduce:^id (NSArray *arr0){
- // NSMutableArray *judgeArr = [NSMutableArray array];
- // dispatch_semaphore_t sema = dispatch_semaphore_create(0);
- // [[arr0.rac_sequence.signal filter:^BOOL(RQExerciseModel *difficultQuestionModel) {
- // return ![judgeArr containsObject:difficultQuestionModel];
- // }].toArray.rac_sequence.signal subscribeNext:^(RQExerciseModel *difficultQuestionModel) {
- // if (difficultQuestionModel.question_type == 1) {
- // NSMutableArray *sortChapterArr = [judgeArr.rac_sequence.signal filter:^BOOL(RQExerciseModel *judgeQuestionModel) {
- // return (judgeQuestionModel.chapter_id == difficultQuestionModel.chapter_id) && ![arr0 containsObject:judgeQuestionModel];
- // }].toArray.mutableCopy;
- // if (sortChapterArr.count > 0) {
- // [judgeArr replaceObjectAtIndex:[judgeArr indexOfObject:sortChapterArr.lastObject] withObject:difficultQuestionModel];
- // }
- // }
- //// else if (difficultQuestionModel.question_type == 2) {
- //// NSMutableArray *sortChapterArr = [choiceArr.rac_sequence.signal filter:^BOOL(RQExerciseModel *choiceQuestionModel) {
- //// return (choiceQuestionModel.chapter_id == difficultQuestionModel.chapter_id) && ![arr0 containsObject:choiceQuestionModel];
- //// }].toArray.mutableCopy;
- //// if (sortChapterArr.count > 0) {
- //// [choiceArr replaceObjectAtIndex:[choiceArr indexOfObject:sortChapterArr.lastObject] withObject:difficultQuestionModel];
- //// }
- //// } else {
- //// NSMutableArray *sortChapterArr = [multipleChoiceArr.rac_sequence.signal filter:^BOOL(RQExerciseModel *multiChoiceQuestionModel) {
- //// return (multiChoiceQuestionModel.chapter_id == difficultQuestionModel.chapter_id) && ![arr0 containsObject:multiChoiceQuestionModel];
- //// }].toArray.mutableCopy;
- //// if (sortChapterArr.count > 0) {
- //// [multipleChoiceArr replaceObjectAtIndex:[multipleChoiceArr indexOfObject:sortChapterArr.lastObject] withObject:difficultQuestionModel];
- //// }
- //// }
- // } completed:^{
- // /// Key: 按照排序的key; ascending: YES为升序, NO为降序。
- // NSSortDescriptor *strTppeSorter = [[NSSortDescriptor alloc] initWithKey:@"chapter_id" ascending:YES];
- //// NSSortDescriptor *diff_degreeSorter = [NSSortDescriptor sortDescriptorWithKey:@"diff_degree" ascending:YES];
- // NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:strTppeSorter, nil];
- //
- // [arr addObjectsFromArray:[judgeArr sortedArrayUsingDescriptors:sortDescriptors]];
- //// [arr addObjectsFromArray:[choiceArr sortedArrayUsingDescriptors:sortDescriptors]];
- //// [arr addObjectsFromArray:[multipleChoiceArr sortedArrayUsingDescriptors:sortDescriptors]];
- // dispatch_semaphore_signal(sema);
- // }];
- // dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
- //
- // return arr.copy;
- // }] map:^id _Nullable(NSArray *examArr) {
- // return examArr;
- // }].toArray firstObject];
- // return arr.copy;
- } else if (pageType == RQHomeSubPageType_FreeTry) {
- queryStr = [NSString stringWithFormat:@"SELECT * FROM question_info INNER JOIN question_free ON question_info.id = question_free.id AND question_free.subject = '%@' ORDER BY %@", [RQ_COMMON_MANAGER getSubjectTypeNumStrWithSubjectType:subject],(exerciseType == RQExerciseType_Random)? @"random()" : @"question_free.free_sort + 0 ASC"];
- return [self queryQuestionWithQueryStr:queryStr exerciseType:exerciseType];
- } else if (pageType == RQHomeSubPageType_MockExamination && exerciseType == RQExerciseType_MiExam) {
- queryStr = [NSString stringWithFormat:@"SELECT * FROM (SELECT * FROM question_info AS a JOIN (SELECT id_ydt, MAX(id) AS id FROM question_info GROUP BY id_ydt) AS t ON a.id = t.id) AS q JOIN t_app_question_category AS c ON q.id_ydt = c.question_id AND c.kemu = %@ AND c.gs = '%@' AND c.category = %@ ORDER BY c.sort_order + 0 ASC", [RQ_COMMON_MANAGER getSubjectTypeNumStrWithSubjectType:subject],[RQ_COMMON_MANAGER getCarTypeSimpleCNStrWithCarType:carType],[RQ_COMMON_MANAGER getMiExamTypeNumStrWithMiExamType:RQ_COMMON_MANAGER.miExamType]];
- return [self queryQuestionWithQueryStr:queryStr];
- } else {
- return [self queryQuestionWithQueryStr:queryStr exerciseType:exerciseType];
- }
- }
- - (RQExerciseModel *)getQuestionWithQuestionId:(NSInteger )questionId {
- __block RQExerciseModel *exerciseModel;
- if (_databaseQueue) {
- [_databaseQueue inDatabase:^(FMDatabase * _Nonnull db) {
- exerciseModel = [self getQuestionWithDataBase:db questionId:questionId];
- }];
- }
- return exerciseModel;
- }
- - (void)getQuestionsWithQuestionIdArr:(NSArray *)questionIdArr complete:(VoidBlock_id)complete {
- NSMutableArray *arr = @[].mutableCopy;
- if (_databaseQueue) {
- [_databaseQueue inTransaction:^(FMDatabase * _Nonnull db, BOOL * _Nonnull rollback) {
- @try {
- [questionIdArr.rac_sequence.signal subscribeNext:^(NSString *questionIdStr) {
- RQExerciseModel *exerciseModel = [self getQuestionWithDataBase:db questionId:questionIdStr.integerValue];
- [arr addObject:exerciseModel];
- } completed:^{
- if (complete) {
- complete(arr.copy);
- }
- }];
- } @catch (NSException *exception) {
- *rollback = YES;
- } @finally {
- *rollback = NO;
- }
- }];
- }
- }
- #pragma mark - Private Method
- - (NSArray *)queryQuestionWithQueryStr:(NSString *)queryStr exerciseType:(RQExerciseType)exerciseType {
- NSMutableArray *arr = @[].mutableCopy;
- if (_databaseQueue) {
- [_databaseQueue inDatabase:^(FMDatabase * _Nonnull db) {
- FMResultSet *resultSet;
- resultSet = [db executeQuery:queryStr];
- while ([resultSet next]) {
- RQExerciseModel *exerciseModel = [RQExerciseModel exerciseModelWithFMResultSet:resultSet];
- if (exerciseType == RQExerciseType_Recitation) {
- exerciseModel.userAnswer = exerciseModel.answer;
- }
- [arr addObject:exerciseModel];
- }
- }];
- }
- return arr.copy;
- }
- - (NSArray *)queryQuestionWithQueryStr:(NSString *)queryStr {
- NSMutableArray *arr = @[].mutableCopy;
- if (_databaseQueue) {
- [_databaseQueue inDatabase:^(FMDatabase * _Nonnull db) {
- FMResultSet *resultSet;
- resultSet = [db executeQuery:queryStr];
- while ([resultSet next]) {
- RQExerciseModel *exerciseModel = [RQExerciseModel exerciseModelWithFMResultSet:resultSet];
- [arr addObject:exerciseModel];
- }
- }];
- }
- return arr.copy;
- }
- - (NSString *)getQuestionNumQueryStrWithCarType:(RQHomePageCarType)carType subject:(RQHomePageSubjectType)subject questionType:(RQQuestionType)questionType isNew:(BOOL)isNew {
- switch (subject) {
- case RQHomePageSubjectType_SubjectOne: {
- switch (questionType) {
- case RQQuestionType_Judgment: {
- switch (carType) {
- case RQHomePageCarType_Car:
- return isNew? @"random() limit 20" : @"random() limit 20";
- case RQHomePageCarType_Bus:
- return isNew? @"random() limit 20" : @"random() limit 20";
- case RQHomePageCarType_Truck:
- return isNew? @"random() limit 20" : @"random() limit 20";
- case RQHomePageCarType_Motorcycle:
- return isNew? @"random() limit 10" : @"random() limit 10";
- default:
- return isNew? @"random() limit 20" : @"random() limit 20";
- }
- }
- case RQQuestionType_SingleChoice: {
- switch (carType) {
- case RQHomePageCarType_Car:
- return isNew? @"random() limit 10" : @"random() limit 50";
- case RQHomePageCarType_Bus:
- return isNew? @"random() limit 10" : @"random() limit 50";
- case RQHomePageCarType_Truck:
- return isNew? @"random() limit 10" : @"random() limit 50";
- case RQHomePageCarType_Motorcycle:
- return isNew? @"random() limit 5" : @"random() limit 25";
- default:
- return isNew? @"random() limit 10" : @"random() limit 50";
- }
- }
- case RQQuestionType_MultipleChoice: {
- switch (carType) {
- case RQHomePageCarType_Car:
- return @"random() limit 0";
- case RQHomePageCarType_Bus:
- return @"random() limit 0";
- case RQHomePageCarType_Truck:
- return @"random() limit 0";
- case RQHomePageCarType_Motorcycle:
- return @"random() limit 0";
- default:
- return @"random() limit 0";
- }
- }
- }
- }
- case RQHomePageSubjectType_SubjectFour: {
- switch (questionType) {
- case RQQuestionType_Judgment: {
- switch (carType) {
- case RQHomePageCarType_Car:
- return @"random() limit 10";
- case RQHomePageCarType_Bus:
- return @"random() limit 10";
- case RQHomePageCarType_Truck:
- return @"random() limit 10";
- case RQHomePageCarType_Motorcycle:
- return @"random() limit 10";
- default:
- return @"random() limit 10";
- }
- }
- case RQQuestionType_SingleChoice: {
- switch (carType) {
- case RQHomePageCarType_Car:
- return @"random() limit 10";
- case RQHomePageCarType_Bus:
- return @"random() limit 10";
- case RQHomePageCarType_Truck:
- return @"random() limit 10";
- case RQHomePageCarType_Motorcycle:
- return @"random() limit 10";
- default:
- return @"random() limit 10";
- }
- }
- case RQQuestionType_MultipleChoice: {
- switch (carType) {
- case RQHomePageCarType_Car:
- return @"random() limit 5";
- case RQHomePageCarType_Bus:
- return @"random() limit 5";
- case RQHomePageCarType_Truck:
- return @"random() limit 5";
- case RQHomePageCarType_Motorcycle:
- return @"random() limit 5";
- default:
- return @"random() limit 5";
- }
- }
- }
- }
- default:
- return @"random() limit 5";
- }
- }
- - (RQExerciseModel *)getQuestionWithDataBase:(FMDatabase *)dataBase questionId:(NSInteger )questionId {
- RQExerciseModel *exerciseModel;
- FMResultSet *resultSet;
- resultSet = [dataBase executeQuery:[NSString stringWithFormat:@"select * from question_info where id = %ld or id_ydt = %ld", questionId, questionId]];
- while ([resultSet next]) {
- exerciseModel = [RQExerciseModel exerciseModelWithFMResultSet:resultSet];
- }
- return exerciseModel;
- }
- - (NSInteger)getQuestionVersion {
- __block NSInteger version = 0;
- if (_databaseQueue) {
- [_databaseQueue inDatabase:^(FMDatabase * _Nonnull db) {
- FMResultSet *resultSet;
- resultSet = [db executeQuery:@"select version_num from question_version"];
- while ([resultSet next]) {
- version = [resultSet longLongIntForColumn:@"version_num"];
- }
- }];
- }
- return version;
- }
- - (NSInteger)getQuestionVersionWithResourcePath:(NSString *)resourcePath {
- __block NSInteger version = 0;
- [[FMDatabaseQueue databaseQueueWithPath:resourcePath] inDatabase:^(FMDatabase * _Nonnull db) {
- FMResultSet *resultSet;
- resultSet = [db executeQuery:@"SELECT version_num FROM question_version"];
- while ([resultSet next]) {
- version = [resultSet longLongIntForColumn:@"version_num"];
- }
- }];
- return version;
- }
- - (NSArray *)getExamRuleWithCarType:(RQHomePageCarType)carType subject:(RQHomePageSubjectType)subject {
- NSString *queryCarTypeStr = [NSString stringWithFormat:@"gs LIKE '%%%@%%'",[RQ_COMMON_MANAGER getCarTypeSimpleCNStrWithCarType:carType]];
- NSString *querySubjectTypeStr = [NSString stringWithFormat:@"kemu = '%@'",[RQ_COMMON_MANAGER getSubjectTypeNumStrWithSubjectType:subject]];
- NSString *examRuleTableName = @"t_app_exam_rule";
- NSString *queryStr = [NSString stringWithFormat:@"SELECT * FROM %@ WHERE %@ AND %@ AND areacode = 0 ", examRuleTableName, queryCarTypeStr, querySubjectTypeStr];
- return [self queryExamRuleWithQueryStr:queryStr];
- }
- - (NSArray *)queryExamRuleWithQueryStr:(NSString *)queryStr {
- NSMutableArray *arr = @[].mutableCopy;
- if (_databaseQueue) {
- [_databaseQueue inDatabase:^(FMDatabase * _Nonnull db) {
- FMResultSet *resultSet;
- resultSet = [db executeQuery:queryStr];
- while ([resultSet next]) {
- RQExamRuleModel *examRuleModel = [RQExamRuleModel sdjkExamRuleModelWithFMResultSet:resultSet];
- [arr addObject:examRuleModel];
- }
- }];
- }
- return arr.copy;
- }
- - (RQExplainModel *)getExplainWithExerciseModel:(RQExerciseModel *)exerciseModel {
- __block RQExplainModel *explainModel;
- if (_databaseQueue) {
- [_databaseQueue inDatabase:^(FMDatabase * _Nonnull db) {
- FMResultSet *resultSet;
- NSString *queryStr = [NSString stringWithFormat:@"SELECT * FROM %@ WHERE questionIds = %ld", @"question_sd_js", (long)exerciseModel.id_ydt];
- resultSet = [db executeQuery:queryStr];
- while ([resultSet next]) {
- explainModel = [RQExplainModel questionExplainWithFMResultSet:resultSet];
- }
- }];
- }
- return explainModel;
- }
- @end
|