11package com .raysmond .blog .services ;
22
33import com .raysmond .blog .models .Post ;
4+ import com .raysmond .blog .models .SeoRobotAgent ;
45import com .raysmond .blog .models .User ;
56import com .raysmond .blog .models .Visit ;
7+ import com .raysmond .blog .repositories .SeoRobotAgentRepository ;
68import com .raysmond .blog .repositories .VisitRepository ;
9+ import org .hibernate .Hibernate ;
10+ import org .hibernate .SQLQuery ;
11+ import org .hibernate .Session ;
12+ import org .hibernate .SessionFactory ;
713import org .springframework .beans .factory .annotation .Autowired ;
14+ import org .springframework .boot .autoconfigure .orm .jpa .JpaProperties ;
15+ import org .springframework .data .jpa .provider .HibernateUtils ;
816import org .springframework .stereotype .Service ;
917
18+ import javax .persistence .EntityManager ;
19+ import java .math .BigInteger ;
20+ import java .util .ArrayList ;
21+ import java .util .List ;
22+ import java .util .regex .Matcher ;
23+ import java .util .regex .Pattern ;
24+
1025@ Service
1126public class VisitService {
1227
1328 @ Autowired
1429 private VisitRepository visitRepository ;
1530
31+ @ Autowired
32+ private SeoRobotAgentRepository seoRobotAgentRepository ;
33+
1634 @ Autowired
1735 private UserService userService ;
1836
37+ @ Autowired
38+ private EntityManager entityManager ;
39+
1940 public void saveVisit (Post post , String clientIp , String userAgent ) {
2041// if (this.userService.currentUser().isAdmin())
2142// return;
@@ -32,7 +53,51 @@ public void saveVisit(Post post, String clientIp, String userAgent) {
3253 }
3354
3455 public Long getUniqueVisitsCount (Post post ) {
35- return this .visitRepository .getUniquePostVisitsCount (post );
56+
57+ Session session = (Session ) this .entityManager .getDelegate ();
58+ SQLQuery query = session .createSQLQuery (
59+ "SELECT COUNT(DISTINCT v.clientIp) " +
60+ "FROM visits AS v " +
61+ "LEFT JOIN seo_robots_agents AS ra " +
62+ "ON v.userAgent LIKE concat('%', ra.userAgent, '%') " +
63+ "WHERE v.post_id = :post_id AND v.isAdmin = FALSE " +
64+ "AND ra.id IS NULL " );
65+ query .setLong ("post_id" , post .getId ());
66+ List <Object > result = query .list ();
67+ if (result .size () > 0L ) {
68+ return ((BigInteger )result .get (0 )).longValue ();
69+ }
70+
71+ return 0L ;
72+
73+ }
74+
75+ public Long getUniqueVisitsCount_old (Post post ) {
76+ //return this.visitRepository.getUniquePostVisitsCount(post);
77+
78+ // exclude queries from robots if matches by UserAgent
79+ List <SeoRobotAgent > robotsAgents = this .seoRobotAgentRepository .findAll ();
80+
81+ final Long [] count = {0L };
82+
83+ this .visitRepository .getVisitsByPostAndIsAdminIsFalse (post ).forEach (vr -> {
84+
85+ Object [] v = (Object []) vr ;
86+
87+ if (robotsAgents .size () == 0 || v [1 ] == null ) {
88+ count [0 ]++;
89+ } else {
90+ robotsAgents .forEach (ra -> {
91+ Pattern p = Pattern .compile (".*(" +ra .getUserAgent ()+").*" , Pattern .CASE_INSENSITIVE );
92+ Matcher m = p .matcher ((String ) v [1 ]);
93+ if (!m .matches ()) {
94+ count [0 ]++;
95+ }
96+ });
97+ }
98+ });
99+
100+ return count [0 ];
36101 }
37102
38103}
0 commit comments