代码追查并解释:其他704下载用户数统计

来源:互联网 发布:php app接口开发参数 编辑:程序博客网 时间:2024/05/16 04:17

​早上接到问题,查看市场的问题,同事需要知道

 移除点击此处添加图片说明文字

是什么意思。那么我们就要去查阅代码了。

 移除点击此处添加图片说明文字

​我们可以知道,php的smarty这个api可以提供html和php的映射。

所以,我们去看一下common_frame_1.html

 移除点击此处添加图片说明文字

​在这里,ajax提交了表单,result_path为:

 移除点击此处添加图片说明文字

所以我们去看一看silent_download_result.php​

 移除点击此处添加图片说明文字

​我们定位到这个php界面,提供了展示数据的赋值。选中的即是他想确定的东西。其他704

 移除点击此处添加图片说明文字

​看到,交由这个页面。silent_download_result.html

 移除点击此处添加图片说明文字

​我们把值对应起来。就是这个字段,cnt_uqz.接下来所有的工作是找到他是怎么来的,从原始日志变成这个字段的。然后我们一路追代码追过来,追到了

 移除点击此处添加图片说明文字

​mongodb里面的这个表就是我们抓取数据的来源。那么我们因为知道他也有来源,来源于哪里呢?从java来,我们把所有项目svn下来,

我们在一个工程里面找到了

 移除点击此处添加图片说明文字

​wr=user_cnt_day_report.insert(doc)

看到了对这张表的插入,ok我们分析代码:

 移除点击此处添加图片说明文字

​在此处执行了写入,那么我们向上追述。

 移除点击此处添加图片说明文字

​嗯,我们也看到了,cur、doc都被重新复制为null,初始化了。然后因为代码太多没有拉下来,其实数据来自于这个表;tmp_user_cnt_day_report_apk

 移除点击此处添加图片说明文字

​那好,可以看到,其实是屈查mongodb的。

 移除点击此处添加图片说明文字

ok,接下来,我们要去追tmp_user_cnt_day_report_apk​

我们eclipse全局搜索发现原来他是这么来的。

 移除点击此处添加图片说明文字

​可真的是折腾人啊。

 移除点击此处添加图片说明文字

​可以看到,这个方法没有参数,直接就用bean对象写入了,这里,需要继续研究。

所以,既然是线程,我们就得看run方法了。知道这个最关键的对象到底被放进去了什么。

private HashMap<String, BeanUserCntDayReport> hmBeanUserCntDayReport = null;

 移除点击此处添加图片说明文字

​请看上图,我们发现了大家伙,好多业务逻辑,看来是确实从某些地方读到了数据,在这里分析的,然后装入到这个关键类的,下面让我们从两个角度将其对接。第一,向上继续找到数据源。第二,向下找到装入 hmBeanUserCntDayReport 的方法。评估一下,向上这个找起来比较简单,所以,而且可以快速定位到那些表设数据库,但是我们也会失去丢失,这个cnt_upz字段的意义。所以小心点,找过去。

 移除点击此处添加图片说明文字

​该方法叫分析处理log数据,那么,而且给入的参数是DBObject,不用看都知道是要干嘛的,一会儿我们要找数据源,只要看哪里调用了他就行了。然而客户要看这个cnt_upz到底干了啥,所以呢,我们稍后也得继续看下面到底做了什么,这里业务比较复杂的,必要得求助。

这样吧,一步一步来,先看上面,我们ctrl + f 发现全类只有一处使用到了这个方法。

 移除点击此处添加图片说明文字

 ok,那接下里呢就so easy了,找到doc对象的来源就可以确定数据源,但是字段名我们可能还确定不了,因为可能在刚才的分界点的后面部分,别急,向上吧。分析代码发现。

// 分析市场log数据

query_sub = new BasicDBObject();

query_sub.put("$gte", dtStart);

query_sub.put("$lt", dtEnd);

query = new BasicDBObject();

query.append("u_dt", query_sub);

//query.append("ac_id", CommonReport.APK_DOWNLOAD);

cur = user_log_apk.find(query);

​发现,这些数据来自于user_log_apk的表,而且有一些条件过滤过来的,什么u_dt这么个map,估计一会儿得去找user_log_apk这个表示怎么来的吧(因为想把所有的东西搞懂的话得继续向上了)但是为了先解决这个运营妹子的问题,我们可能得调头回去了,回到刚才的业务那里,好吧,只能先回头了。

回到刚才的分析处理log数据方法中,我们接着看。

这个代码就是,看一下,cnt_uqz数据是怎么来的即可,这个简单,我么你继续全局搜索,发现在这里做了累计。

 移除点击此处添加图片说明文字

来看一下beanUserCntDayReport.cnt_uqz,这个对象的这个属性,我们点进去看一下

 移除点击此处添加图片说明文字

​​请注意条件,这些条件使我们要做的事情。hasCount_gx == false为什么进入,beanUserInfoDT == null

 移除点击此处添加图片说明文字

​放多一点看

 移除点击此处添加图片说明文字

​经过一下午的总结,我大致粘贴一下追读代码的过程。并且也补充了很多注释:

一、现在我们知道,数据其实是从mongo库:user_log_apk

    我们并没有继续追下去了,可以大致了解其实是从远程mysql里面拉过来的,然后在我们本地文件,然后给一个main方法去读取文件解析。

二、doReportApk方法

 移除点击此处添加图片说明文字

​我将注释补全了,注释很清楚。

三、如果用户今天没有被统计过,并且自动更新开关被关了。

 移除点击此处添加图片说明文字

​这个cnt_uqz被自增了。那如果这个用户不为空呢,

else

 移除点击此处添加图片说明文字

​第一次访问日期大于今天的

 移除点击此处添加图片说明文字

​老样子,统计自动更新被关掉的(也就是手动更新、下载的)

这样,我们就在mongo表里面插入了

    // 放回hash表

hmBeanUserCntDayReport.put(ch, beanUserCntDayReport);

然后就接上了。

 移除点击此处添加图片说明文字

​好了,关于 其它704下载用户数

代码追查 完 后续需要继续往下看了,将后续的代码和步骤追到。

原创粉丝点击