Authored by all4you

update socialUser

package com.yohomars.search.index.builder.impls;
import com.yoho.search.dal.SocialUserDetailMapper;
import com.yoho.search.dal.SocialUserMapper;
import com.yoho.search.dal.model.SocialUser;
import com.yoho.search.dal.model.UserFollower;
import com.yoho.search.dal.model.UserFollowing;
import com.yoho.tools.common.redis.RedisValueHelper;
import com.yohomars.search.index.builder.IIndexBuilder;
import com.yohomars.search.utils.Index;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
... ... @@ -19,32 +25,96 @@ import java.util.*;
@Component
public class SocialUserIndexBuilder extends IIndexBuilder {
private static final Logger LOGGER = LoggerFactory.getLogger(SocialUserIndexBuilder.class);
@Autowired
private SocialUserMapper socialUserMapper;
@Autowired
private SocialUserDetailMapper socialUserDetailMapper;
@Autowired
private RedisValueHelper redisValueHelper;
private Long lastUpdateTime;
private Long getLastUpdateTime(){
// return 1504050513724L;
return redisValueHelper.get(Index.social_user.getKey(),Long.class);
}
private List<UserFollowing> getFollowings(List<Integer> suids){
List<UserFollowing> followings = socialUserDetailMapper.selectUserFollowing(suids);
if(CollectionUtils.isNotEmpty(followings)){
Set<Integer> uids = new HashSet<>();
for(UserFollowing following : followings){
uids.add(following.getT_uid());
}
List<Integer> tuids = new ArrayList<>();
tuids.addAll(uids);
// 获取关注的用户的详情
List<SocialUser> users = socialUserMapper.selectByUids(tuids);
if(CollectionUtils.isNotEmpty(users)){
for(UserFollowing following : followings){
for(SocialUser user : users){
if(user.getS_uid().equals(following.getT_uid())){
following.setT_nick_name(user.getS_nick_name());
following.setT_head_pic(user.getS_head_pic());
}
}
}
}
}
return followings;
}
@Override
public int getTotalCount() throws Exception {
lastUpdateTime = getLastUpdateTime();
return socialUserMapper.selectCount(lastUpdateTime);
int totalCount = socialUserMapper.selectCount(lastUpdateTime);
LOGGER.info("[SocialUserIndexBuilder] getTotalCount with totalCount={}",totalCount);
return totalCount;
}
@Override
public List<?> getPageLists(int offset, int limit) throws Exception {
List<SocialUser> list = socialUserMapper.selectPageList(offset,limit,lastUpdateTime);
if(CollectionUtils.isEmpty(list)){
LOGGER.info("[SocialUserIndexBuilder] getPageLists with offset={},limit={}",offset,limit);
List<SocialUser> socialUsers = socialUserMapper.selectPageList(offset,limit,lastUpdateTime);
if(CollectionUtils.isEmpty(socialUsers)){
return Collections.emptyList();
}
List<Map<String, Object>> dataList = new ArrayList<>(list.size());
for(SocialUser socialUser : list) {
// TODO socialUser transfer
List<Integer> suids = new ArrayList<>(socialUsers.size());
for(SocialUser socialUser : socialUsers) {
suids.add(socialUser.getS_uid());
}
List<UserFollower> followers = socialUserDetailMapper.selectUserFollower(suids);
// 设置socialUser的s_followers_number等属性
if(CollectionUtils.isNotEmpty(followers)){
for(UserFollower follower : followers){
for(SocialUser socialUser : socialUsers) {
if(socialUser.getS_uid().equals(follower.getS_uid())){
socialUser.setS_followers_number(follower.getS_followers_number());
socialUser.setS_talent(follower.getS_talent());
}
}
}
}
List<UserFollowing> followings = getFollowings(suids);
// 设置socialUser的s_following等属性
if(CollectionUtils.isNotEmpty(followings)){
for(UserFollowing following : followings){
for(SocialUser socialUser : socialUsers) {
if(socialUser.getS_uid().equals(following.getS_uid())){
SocialUser.UserFollowing userFollowing = new SocialUser.UserFollowing();
BeanUtils.copyProperties(following,userFollowing);
socialUser.addFollowing(userFollowing);
}
}
}
}
List<Map<String, Object>> dataList = new ArrayList<>(socialUsers.size());
for(SocialUser socialUser : socialUsers) {
dataList.add(beanToMap(socialUser));
}
return dataList;
... ... @@ -62,10 +132,13 @@ public class SocialUserIndexBuilder extends IIndexBuilder {
*/
public Map<String, Object> beanToMap(SocialUser socialUser) {
Map<String, Object> map = new LinkedHashMap<>();
map.put("id", socialUser.getId());
map.put("uid", socialUser.getUid());
map.put("nick_name", StringUtils.isBlank(socialUser.getNickName())?"":socialUser.getNickName());
map.put("head_pic", StringUtils.isBlank(socialUser.getHeadPic())?"":socialUser.getHeadPic());
map.put("id", socialUser.getS_uid());
map.put("s_uid", socialUser.getS_uid());
map.put("s_nick_name", StringUtils.isBlank(socialUser.getS_nick_name())?"":socialUser.getS_nick_name());
map.put("s_head_pic", StringUtils.isBlank(socialUser.getS_head_pic())?"":socialUser.getS_head_pic());
map.put("s_talent",socialUser.getS_talent());
map.put("s_followers_number",socialUser.getS_followers_number());
map.put("s_following",CollectionUtils.isNotEmpty(socialUser.getS_following())?socialUser.getS_following():Collections.emptyList());
return map;
}
}
... ...
package com.yoho.search.dal;
import com.yoho.search.dal.model.UserFollowing;
import com.yoho.search.dal.model.UserFollower;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* @author gris.wang
* @since 2018/2/12
**/
public interface SocialUserDetailMapper {
List<UserFollower> selectUserFollower(@Param("uids") List<Integer> uids);
List<UserFollowing> selectUserFollowing(@Param("uids") List<Integer> uids);
}
... ...
... ... @@ -10,4 +10,6 @@ public interface SocialUserMapper {
List<SocialUser> selectPageList(@Param(value = "offset") Integer offset, @Param(value = "pageSize") Integer pageSize,@Param(value = "updateTime") Long updateTime);
int selectCount(@Param(value = "updateTime") Long updateTime);
List<SocialUser> selectByUids(@Param("uids") List<Integer> uids);
}
\ No newline at end of file
... ...
package com.yoho.search.dal.model;
import java.util.ArrayList;
import java.util.List;
/**
* @author gris.wang
* @since 2018/2/6
... ... @@ -8,11 +11,23 @@ public class SocialUser {
private Integer id;
private Integer uid;
private Integer s_uid;
private String s_nick_name;
private String s_head_pic;
private String nickName;
/**
* 用户的粉丝数
*/
private Integer s_followers_number = 0;
private String headPic;
/**
* 用户是否为达人
*/
private Integer s_talent = 0;
private List<UserFollowing> s_following;
public Integer getId() {
return id;
... ... @@ -22,27 +37,128 @@ public class SocialUser {
this.id = id;
}
public Integer getUid() {
return uid;
public Integer getS_uid() {
return s_uid;
}
public void setS_uid(Integer s_uid) {
this.s_uid = s_uid;
}
public String getS_nick_name() {
return s_nick_name;
}
public void setS_nick_name(String s_nick_name) {
this.s_nick_name = s_nick_name;
}
public String getS_head_pic() {
return s_head_pic;
}
public void setS_head_pic(String s_head_pic) {
this.s_head_pic = s_head_pic;
}
public Integer getS_followers_number() {
return s_followers_number;
}
public void setS_followers_number(Integer s_followers_number) {
this.s_followers_number = s_followers_number;
}
public Integer getS_talent() {
return s_talent;
}
public void setUid(Integer uid) {
this.uid = uid;
public void setS_talent(Integer s_talent) {
this.s_talent = s_talent;
}
public String getNickName() {
return nickName;
public List<UserFollowing> getS_following() {
return s_following;
}
public void setNickName(String nickName) {
this.nickName = nickName;
public void setS_following(List<UserFollowing> s_following) {
this.s_following = s_following;
}
public String getHeadPic() {
return headPic;
public void addFollowing(UserFollowing following){
if(s_following==null){
s_following = new ArrayList<>();
}
s_following.add(following);
}
public void setHeadPic(String headPic) {
this.headPic = headPic;
/**
* 关注的用户
*/
public static class UserFollowing{
/**
* 关注的用户id
*/
private Integer t_uid;
/**
* 关注的用户的昵称
*/
private String t_nick_name;
/**
* 关注的用户的头像
*/
private String t_head_pic;
/**
* 关注的用户粉丝数
*/
private Integer t_follower_numbers = 0;
/**
* 关注的用户是否跟当前用户互相关注
*/
private Integer t_follow_back = 0;
public Integer getT_uid() {
return t_uid;
}
public void setT_uid(Integer t_uid) {
this.t_uid = t_uid;
}
public String getT_nick_name() {
return t_nick_name;
}
public void setT_nick_name(String t_nick_name) {
this.t_nick_name = t_nick_name;
}
public String getT_head_pic() {
return t_head_pic;
}
public void setT_head_pic(String t_head_pic) {
this.t_head_pic = t_head_pic;
}
public Integer getT_follower_numbers() {
return t_follower_numbers;
}
public void setT_follower_numbers(Integer t_follower_numbers) {
this.t_follower_numbers = t_follower_numbers;
}
public Integer getT_follow_back() {
return t_follow_back;
}
public void setT_follow_back(Integer t_follow_back) {
this.t_follow_back = t_follow_back;
}
}
}
... ...
package com.yoho.search.dal.model;
/**
* @author gris.wang
* @since 2018/2/12
**/
public class UserFollower {
/**
* 用户id
*/
private Integer s_uid;
/**
* 用户的粉丝数
*/
private Integer s_followers_number = 0;
/**
* 用户是否为达人
*/
private Integer s_talent = 0;
public Integer getS_uid() {
return s_uid;
}
public void setS_uid(Integer s_uid) {
this.s_uid = s_uid;
}
public Integer getS_followers_number() {
return s_followers_number;
}
public void setS_followers_number(Integer s_followers_number) {
this.s_followers_number = s_followers_number;
}
public Integer getS_talent() {
return s_talent;
}
public void setS_talent(Integer s_talent) {
this.s_talent = s_talent;
}
}
... ...
package com.yoho.search.dal.model;
/**
* @author gris.wang
* @since 2018/2/12
**/
public class UserFollowing {
/**
* 用户id
*/
private Integer s_uid;
/**
* 关注的用户id
*/
private Integer t_uid;
/**
* 关注的用户的昵称
*/
private String t_nick_name;
/**
* 关注的用户的头像
*/
private String t_head_pic;
/**
* 关注的用户粉丝数
*/
private Integer t_followers_number = 0;
/**
* 关注的用户是否跟当前用户互相关注
*/
private Integer t_follow_back = 0;
public Integer getS_uid() {
return s_uid;
}
public void setS_uid(Integer s_uid) {
this.s_uid = s_uid;
}
public Integer getT_uid() {
return t_uid;
}
public void setT_uid(Integer t_uid) {
this.t_uid = t_uid;
}
public String getT_nick_name() {
return t_nick_name;
}
public void setT_nick_name(String t_nick_name) {
this.t_nick_name = t_nick_name;
}
public String getT_head_pic() {
return t_head_pic;
}
public void setT_head_pic(String t_head_pic) {
this.t_head_pic = t_head_pic;
}
public Integer getT_followers_number() {
return t_followers_number;
}
public void setT_followers_number(Integer t_followers_number) {
this.t_followers_number = t_followers_number;
}
public Integer getT_follow_back() {
return t_follow_back;
}
public void setT_follow_back(Integer t_follow_back) {
this.t_follow_back = t_follow_back;
}
}
... ...
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.yoho.search.dal.SocialUserDetailMapper" >
<resultMap id="followerMap" type="com.yoho.search.dal.model.UserFollower" >
<result column="s_uid" property="s_uid" jdbcType="INTEGER" />
<result column="s_followers_number" property="s_followers_number" jdbcType="INTEGER" />
<result column="s_talent" property="s_talent" jdbcType="INTEGER" />
</resultMap>
<resultMap id="followingMap" type="com.yoho.search.dal.model.UserFollowing" >
<result column="s_uid" property="s_uid" jdbcType="INTEGER" />
<result column="t_uid" property="t_uid" jdbcType="INTEGER" />
<result column="t_followers_number" property="t_followers_number" jdbcType="INTEGER" />
<result column="t_follow_back" property="t_follow_back" jdbcType="INTEGER" />
</resultMap>
<select id="selectUserFollower" resultMap="followerMap" timeout="20000">
select s.uid_attention as s_uid,
count(distinct s.uid) as s_followers_number,
(
select 1
from tbl_shoes_doctor_talent tal
where tal.uid=s.uid_attention
and tal.is_certification=1
) as s_talent
from tbl_attention_user s
where
s.uid_attention
<foreach collection="uids" item="uid" open="in(" separator="," close=")">
#{uid}
</foreach>
group by s.uid_attention
</select>
<select id="selectUserFollowing" resultMap="followingMap" timeout="20000">
select distinct s.uid as s_uid,s.uid_attention as t_uid,
(
select count(distinct t.uid)
from tbl_attention_user t
where t.uid_attention=s.uid_attention
) as t_followers_number,
(
select 1
from tbl_attention_user t
where t.uid=s.uid_attention
and t.uid_attention=s.uid
) as t_follow_back
from tbl_attention_user s
where
s.uid
<foreach collection="uids" item="uid" open="in(" separator="," close=")">
#{uid}
</foreach>
</select>
</mapper>
\ No newline at end of file
... ...
... ... @@ -3,9 +3,9 @@
<mapper namespace="com.yoho.search.dal.SocialUserMapper" >
<resultMap id="BaseResultMap" type="com.yoho.search.dal.model.SocialUser" >
<result column="id" property="id" jdbcType="INTEGER" />
<result column="uid" property="uid" jdbcType="INTEGER" />
<result column="nickname" property="nickName" jdbcType="VARCHAR" />
<result column="head_icon" property="headPic" jdbcType="VARCHAR" />
<result column="uid" property="s_uid" jdbcType="INTEGER" />
<result column="nickname" property="s_nick_name" jdbcType="VARCHAR" />
<result column="head_icon" property="s_head_pic" jdbcType="VARCHAR" />
</resultMap>
<sql id="Base_Column_List" >
id,uid,nickname,head_icon
... ... @@ -28,4 +28,13 @@
from community_user
<include refid="param"/>
</select>
<select id="selectByUids" resultMap="BaseResultMap" timeout="20000">
select
<include refid="Base_Column_List" />
from community_user
where uid
<foreach collection="uids" item="uid" open="in(" separator="," close=")">
#{uid}
</foreach>
</select>
</mapper>
\ No newline at end of file
... ...
... ... @@ -20,7 +20,7 @@ search.default.field.store=store_name^1000,store_english_name^1000,store_name_tc
search.default.field.topic=title^300,title_tc^200
search.default.field.line=title^300,title_tc^200
search.default.field.comment=description^300
search.default.field.socialUser=nick_name^1000
search.default.field.socialUser=s_nick_name^1000
#web.content
web.context=yohomars-search
... ...
... ... @@ -14,4 +14,14 @@ datasources:
password: 9nm0icOwt6bMHjMusIfMLw==
daos:
- com.yoho.search.dal.SocialUserMapper
yh_cms:
servers:
- 192.168.102.17:3306
- 192.168.102.17:3306
username: yh_test
password: 9nm0icOwt6bMHjMusIfMLw==
daos:
- com.yoho.search.dal.SocialUserDetailMapper
readOnlyInSlave: true
\ No newline at end of file
... ...
... ... @@ -10,16 +10,25 @@
"id": {
"type": "integer"
},
"uid": {
"s_uid": {
"type": "integer"
},
"nick_name": {
"s_nick_name": {
"type": "string",
"analyzer": "ik_max_word_syno"
},
"head_pic": {
"s_head_pic": {
"type": "string",
"analyzer": "ik_max_word_syno"
},
"s_talent": {
"type": "integer"
},
"s_followers_number": {
"type": "integer"
},
"s_following": {
"type": "nested"
}
}
}
... ...
... ... @@ -94,6 +94,24 @@
</encoder>
</appender>
<!-- 慢sql appender -->
<appender name="SLOW_SQL" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>/Data/logs/mars-search/slow-sql.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- daily rollover -->
<fileNamePattern>/Data/logs/mars-search/archived/slow-sql.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<!-- or whenever the file size reaches 100MB -->
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!-- keep 30 days' worth of history -->
<maxHistory>7</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger:%line - %msg%n</pattern>
</encoder>
</appender>
<!-- 服务请求统计 appender -->
<appender name="REQUEST_STAT" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>/Data/logs/mars-search/request-stat.log</file>
... ... @@ -180,6 +198,12 @@
<appender-ref ref="DATABASE_TIMEOUT"/>
</logger>
<!-- 慢sql -->
<logger name="com.yoho.core.dal.datasource.intercepor.DaoInterceptor" additivity="false">
<level value="INFO"/>
<appender-ref ref="SLOW_SQL"/>
</logger>
<!-- 服务请求统计 -->
<logger name="com.yoho.core.common.monitor" additivity="false">
<level value="INFO"/>
... ...
... ... @@ -20,7 +20,7 @@ search.default.field.store=store_name^300,store_english_name^200,store_name_tc^2
search.default.field.topic=title^300,title_tc^200
search.default.field.line=title^300,title_tc^200
search.default.field.comment=description^300
search.default.field.socialUser=nick_name^1000
search.default.field.socialUser=s_nick_name^1000
#web.content
web.context=yohomars-search
... ...
... ... @@ -6,12 +6,22 @@ datasources:
username: ${jdbc.mysql.yohomarssearch.username}
password: ${jdbc.mysql.yohomarssearch.password}
${jdbc.mysql.yohosocialssearch.datasources}:
servers:
- ${jdbc.mysql.yohosocialssearch.master}
- ${jdbc.mysql.yohosocialssearch.slave}
username: ${jdbc.mysql.yohosocialssearch.username}
password: ${jdbc.mysql.yohosocialssearch.password}
daos:
- com.yoho.search.dal.SocialUserMapper
${jdbc.mysql.yohosocialsearch.datasources}:
servers:
- ${jdbc.mysql.yohosocialsearch.master}
- ${jdbc.mysql.yohosocialsearch.slave}
username: ${jdbc.mysql.yohosocialsearch.username}
password: ${jdbc.mysql.yohosocialsearch.password}
daos:
- com.yoho.search.dal.SocialUserMapper
${jdbc.mysql.yohosocialdetailsearch.datasources}:
servers:
- ${jdbc.mysql.yohosocialdetailsearch.master}
- ${jdbc.mysql.yohosocialdetailsearch.slave}
username: ${jdbc.mysql.yohosocialdetailsearch.username}
password: ${jdbc.mysql.yohosocialdetailsearch.password}
daos:
- com.yoho.search.dal.SocialUserDetailMapper
readOnlyInSlave: ${readOnlyInSlave}
\ No newline at end of file
... ...
... ... @@ -86,6 +86,24 @@
</encoder>
</appender>
<!-- 慢sql appender -->
<appender name="SLOW_SQL" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${yoho.logs.basedir}/${yohomars.search.service.env.namespace}/slow-sql.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- daily rollover -->
<fileNamePattern>${yoho.logs.basedir}/${yohomars.search.service.env.namespace}/archived/slow-sql.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<!-- or whenever the file size reaches 100MB -->
<maxFileSize>${yoho.logs.maxFileSize}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!-- keep 30 days' worth of history -->
<maxHistory>${yoho.logs.maxHistory}</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger:%line - %msg%n</pattern>
</encoder>
</appender>
<!-- 服务请求统计 appender -->
<appender name="REQUEST_STAT" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${yoho.logs.basedir}/${yohomars.search.service.env.namespace}/request-stat.log</file>
... ... @@ -170,6 +188,12 @@
<appender-ref ref="DATABASE_TIMEOUT"/>
</logger>
<!-- 慢sql -->
<logger name="com.yoho.core.dal.datasource.intercepor.DaoInterceptor" additivity="false">
<level value="INFO"/>
<appender-ref ref="SLOW_SQL"/>
</logger>
<!-- 服务请求统计 -->
<logger name="com.yoho.core.common.monitor" additivity="true">
<level value="INFO"/>
... ...