Skip to content
This repository

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse code

Add apachesolr_views

  • Loading branch information...
commit 248cd97fe2104bf3f8f1737c8766ec5f8d7bc5fe 1 parent ded7dbd
Sam Boyer authored October 30, 2012
339  sites/all/modules/contrib/apachesolr_views/LICENSE.txt
... ...
@@ -0,0 +1,339 @@
  1
+                    GNU GENERAL PUBLIC LICENSE
  2
+                       Version 2, June 1991
  3
+
  4
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
  5
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  6
+ Everyone is permitted to copy and distribute verbatim copies
  7
+ of this license document, but changing it is not allowed.
  8
+
  9
+                            Preamble
  10
+
  11
+  The licenses for most software are designed to take away your
  12
+freedom to share and change it.  By contrast, the GNU General Public
  13
+License is intended to guarantee your freedom to share and change free
  14
+software--to make sure the software is free for all its users.  This
  15
+General Public License applies to most of the Free Software
  16
+Foundation's software and to any other program whose authors commit to
  17
+using it.  (Some other Free Software Foundation software is covered by
  18
+the GNU Lesser General Public License instead.)  You can apply it to
  19
+your programs, too.
  20
+
  21
+  When we speak of free software, we are referring to freedom, not
  22
+price.  Our General Public Licenses are designed to make sure that you
  23
+have the freedom to distribute copies of free software (and charge for
  24
+this service if you wish), that you receive source code or can get it
  25
+if you want it, that you can change the software or use pieces of it
  26
+in new free programs; and that you know you can do these things.
  27
+
  28
+  To protect your rights, we need to make restrictions that forbid
  29
+anyone to deny you these rights or to ask you to surrender the rights.
  30
+These restrictions translate to certain responsibilities for you if you
  31
+distribute copies of the software, or if you modify it.
  32
+
  33
+  For example, if you distribute copies of such a program, whether
  34
+gratis or for a fee, you must give the recipients all the rights that
  35
+you have.  You must make sure that they, too, receive or can get the
  36
+source code.  And you must show them these terms so they know their
  37
+rights.
  38
+
  39
+  We protect your rights with two steps: (1) copyright the software, and
  40
+(2) offer you this license which gives you legal permission to copy,
  41
+distribute and/or modify the software.
  42
+
  43
+  Also, for each author's protection and ours, we want to make certain
  44
+that everyone understands that there is no warranty for this free
  45
+software.  If the software is modified by someone else and passed on, we
  46
+want its recipients to know that what they have is not the original, so
  47
+that any problems introduced by others will not reflect on the original
  48
+authors' reputations.
  49
+
  50
+  Finally, any free program is threatened constantly by software
  51
+patents.  We wish to avoid the danger that redistributors of a free
  52
+program will individually obtain patent licenses, in effect making the
  53
+program proprietary.  To prevent this, we have made it clear that any
  54
+patent must be licensed for everyone's free use or not licensed at all.
  55
+
  56
+  The precise terms and conditions for copying, distribution and
  57
+modification follow.
  58
+
  59
+                    GNU GENERAL PUBLIC LICENSE
  60
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
  61
+
  62
+  0. This License applies to any program or other work which contains
  63
+a notice placed by the copyright holder saying it may be distributed
  64
+under the terms of this General Public License.  The "Program", below,
  65
+refers to any such program or work, and a "work based on the Program"
  66
+means either the Program or any derivative work under copyright law:
  67
+that is to say, a work containing the Program or a portion of it,
  68
+either verbatim or with modifications and/or translated into another
  69
+language.  (Hereinafter, translation is included without limitation in
  70
+the term "modification".)  Each licensee is addressed as "you".
  71
+
  72
+Activities other than copying, distribution and modification are not
  73
+covered by this License; they are outside its scope.  The act of
  74
+running the Program is not restricted, and the output from the Program
  75
+is covered only if its contents constitute a work based on the
  76
+Program (independent of having been made by running the Program).
  77
+Whether that is true depends on what the Program does.
  78
+
  79
+  1. You may copy and distribute verbatim copies of the Program's
  80
+source code as you receive it, in any medium, provided that you
  81
+conspicuously and appropriately publish on each copy an appropriate
  82
+copyright notice and disclaimer of warranty; keep intact all the
  83
+notices that refer to this License and to the absence of any warranty;
  84
+and give any other recipients of the Program a copy of this License
  85
+along with the Program.
  86
+
  87
+You may charge a fee for the physical act of transferring a copy, and
  88
+you may at your option offer warranty protection in exchange for a fee.
  89
+
  90
+  2. You may modify your copy or copies of the Program or any portion
  91
+of it, thus forming a work based on the Program, and copy and
  92
+distribute such modifications or work under the terms of Section 1
  93
+above, provided that you also meet all of these conditions:
  94
+
  95
+    a) You must cause the modified files to carry prominent notices
  96
+    stating that you changed the files and the date of any change.
  97
+
  98
+    b) You must cause any work that you distribute or publish, that in
  99
+    whole or in part contains or is derived from the Program or any
  100
+    part thereof, to be licensed as a whole at no charge to all third
  101
+    parties under the terms of this License.
  102
+
  103
+    c) If the modified program normally reads commands interactively
  104
+    when run, you must cause it, when started running for such
  105
+    interactive use in the most ordinary way, to print or display an
  106
+    announcement including an appropriate copyright notice and a
  107
+    notice that there is no warranty (or else, saying that you provide
  108
+    a warranty) and that users may redistribute the program under
  109
+    these conditions, and telling the user how to view a copy of this
  110
+    License.  (Exception: if the Program itself is interactive but
  111
+    does not normally print such an announcement, your work based on
  112
+    the Program is not required to print an announcement.)
  113
+
  114
+These requirements apply to the modified work as a whole.  If
  115
+identifiable sections of that work are not derived from the Program,
  116
+and can be reasonably considered independent and separate works in
  117
+themselves, then this License, and its terms, do not apply to those
  118
+sections when you distribute them as separate works.  But when you
  119
+distribute the same sections as part of a whole which is a work based
  120
+on the Program, the distribution of the whole must be on the terms of
  121
+this License, whose permissions for other licensees extend to the
  122
+entire whole, and thus to each and every part regardless of who wrote it.
  123
+
  124
+Thus, it is not the intent of this section to claim rights or contest
  125
+your rights to work written entirely by you; rather, the intent is to
  126
+exercise the right to control the distribution of derivative or
  127
+collective works based on the Program.
  128
+
  129
+In addition, mere aggregation of another work not based on the Program
  130
+with the Program (or with a work based on the Program) on a volume of
  131
+a storage or distribution medium does not bring the other work under
  132
+the scope of this License.
  133
+
  134
+  3. You may copy and distribute the Program (or a work based on it,
  135
+under Section 2) in object code or executable form under the terms of
  136
+Sections 1 and 2 above provided that you also do one of the following:
  137
+
  138
+    a) Accompany it with the complete corresponding machine-readable
  139
+    source code, which must be distributed under the terms of Sections
  140
+    1 and 2 above on a medium customarily used for software interchange; or,
  141
+
  142
+    b) Accompany it with a written offer, valid for at least three
  143
+    years, to give any third party, for a charge no more than your
  144
+    cost of physically performing source distribution, a complete
  145
+    machine-readable copy of the corresponding source code, to be
  146
+    distributed under the terms of Sections 1 and 2 above on a medium
  147
+    customarily used for software interchange; or,
  148
+
  149
+    c) Accompany it with the information you received as to the offer
  150
+    to distribute corresponding source code.  (This alternative is
  151
+    allowed only for noncommercial distribution and only if you
  152
+    received the program in object code or executable form with such
  153
+    an offer, in accord with Subsection b above.)
  154
+
  155
+The source code for a work means the preferred form of the work for
  156
+making modifications to it.  For an executable work, complete source
  157
+code means all the source code for all modules it contains, plus any
  158
+associated interface definition files, plus the scripts used to
  159
+control compilation and installation of the executable.  However, as a
  160
+special exception, the source code distributed need not include
  161
+anything that is normally distributed (in either source or binary
  162
+form) with the major components (compiler, kernel, and so on) of the
  163
+operating system on which the executable runs, unless that component
  164
+itself accompanies the executable.
  165
+
  166
+If distribution of executable or object code is made by offering
  167
+access to copy from a designated place, then offering equivalent
  168
+access to copy the source code from the same place counts as
  169
+distribution of the source code, even though third parties are not
  170
+compelled to copy the source along with the object code.
  171
+
  172
+  4. You may not copy, modify, sublicense, or distribute the Program
  173
+except as expressly provided under this License.  Any attempt
  174
+otherwise to copy, modify, sublicense or distribute the Program is
  175
+void, and will automatically terminate your rights under this License.
  176
+However, parties who have received copies, or rights, from you under
  177
+this License will not have their licenses terminated so long as such
  178
+parties remain in full compliance.
  179
+
  180
+  5. You are not required to accept this License, since you have not
  181
+signed it.  However, nothing else grants you permission to modify or
  182
+distribute the Program or its derivative works.  These actions are
  183
+prohibited by law if you do not accept this License.  Therefore, by
  184
+modifying or distributing the Program (or any work based on the
  185
+Program), you indicate your acceptance of this License to do so, and
  186
+all its terms and conditions for copying, distributing or modifying
  187
+the Program or works based on it.
  188
+
  189
+  6. Each time you redistribute the Program (or any work based on the
  190
+Program), the recipient automatically receives a license from the
  191
+original licensor to copy, distribute or modify the Program subject to
  192
+these terms and conditions.  You may not impose any further
  193
+restrictions on the recipients' exercise of the rights granted herein.
  194
+You are not responsible for enforcing compliance by third parties to
  195
+this License.
  196
+
  197
+  7. If, as a consequence of a court judgment or allegation of patent
  198
+infringement or for any other reason (not limited to patent issues),
  199
+conditions are imposed on you (whether by court order, agreement or
  200
+otherwise) that contradict the conditions of this License, they do not
  201
+excuse you from the conditions of this License.  If you cannot
  202
+distribute so as to satisfy simultaneously your obligations under this
  203
+License and any other pertinent obligations, then as a consequence you
  204
+may not distribute the Program at all.  For example, if a patent
  205
+license would not permit royalty-free redistribution of the Program by
  206
+all those who receive copies directly or indirectly through you, then
  207
+the only way you could satisfy both it and this License would be to
  208
+refrain entirely from distribution of the Program.
  209
+
  210
+If any portion of this section is held invalid or unenforceable under
  211
+any particular circumstance, the balance of the section is intended to
  212
+apply and the section as a whole is intended to apply in other
  213
+circumstances.
  214
+
  215
+It is not the purpose of this section to induce you to infringe any
  216
+patents or other property right claims or to contest validity of any
  217
+such claims; this section has the sole purpose of protecting the
  218
+integrity of the free software distribution system, which is
  219
+implemented by public license practices.  Many people have made
  220
+generous contributions to the wide range of software distributed
  221
+through that system in reliance on consistent application of that
  222
+system; it is up to the author/donor to decide if he or she is willing
  223
+to distribute software through any other system and a licensee cannot
  224
+impose that choice.
  225
+
  226
+This section is intended to make thoroughly clear what is believed to
  227
+be a consequence of the rest of this License.
  228
+
  229
+  8. If the distribution and/or use of the Program is restricted in
  230
+certain countries either by patents or by copyrighted interfaces, the
  231
+original copyright holder who places the Program under this License
  232
+may add an explicit geographical distribution limitation excluding
  233
+those countries, so that distribution is permitted only in or among
  234
+countries not thus excluded.  In such case, this License incorporates
  235
+the limitation as if written in the body of this License.
  236
+
  237
+  9. The Free Software Foundation may publish revised and/or new versions
  238
+of the General Public License from time to time.  Such new versions will
  239
+be similar in spirit to the present version, but may differ in detail to
  240
+address new problems or concerns.
  241
+
  242
+Each version is given a distinguishing version number.  If the Program
  243
+specifies a version number of this License which applies to it and "any
  244
+later version", you have the option of following the terms and conditions
  245
+either of that version or of any later version published by the Free
  246
+Software Foundation.  If the Program does not specify a version number of
  247
+this License, you may choose any version ever published by the Free Software
  248
+Foundation.
  249
+
  250
+  10. If you wish to incorporate parts of the Program into other free
  251
+programs whose distribution conditions are different, write to the author
  252
+to ask for permission.  For software which is copyrighted by the Free
  253
+Software Foundation, write to the Free Software Foundation; we sometimes
  254
+make exceptions for this.  Our decision will be guided by the two goals
  255
+of preserving the free status of all derivatives of our free software and
  256
+of promoting the sharing and reuse of software generally.
  257
+
  258
+                            NO WARRANTY
  259
+
  260
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
  261
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
  262
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
  263
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
  264
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
  265
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
  266
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
  267
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
  268
+REPAIR OR CORRECTION.
  269
+
  270
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
  271
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
  272
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
  273
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
  274
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
  275
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
  276
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
  277
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
  278
+POSSIBILITY OF SUCH DAMAGES.
  279
+
  280
+                     END OF TERMS AND CONDITIONS
  281
+
  282
+            How to Apply These Terms to Your New Programs
  283
+
  284
+  If you develop a new program, and you want it to be of the greatest
  285
+possible use to the public, the best way to achieve this is to make it
  286
+free software which everyone can redistribute and change under these terms.
  287
+
  288
+  To do so, attach the following notices to the program.  It is safest
  289
+to attach them to the start of each source file to most effectively
  290
+convey the exclusion of warranty; and each file should have at least
  291
+the "copyright" line and a pointer to where the full notice is found.
  292
+
  293
+    <one line to give the program's name and a brief idea of what it does.>
  294
+    Copyright (C) <year>  <name of author>
  295
+
  296
+    This program is free software; you can redistribute it and/or modify
  297
+    it under the terms of the GNU General Public License as published by
  298
+    the Free Software Foundation; either version 2 of the License, or
  299
+    (at your option) any later version.
  300
+
  301
+    This program is distributed in the hope that it will be useful,
  302
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
  303
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  304
+    GNU General Public License for more details.
  305
+
  306
+    You should have received a copy of the GNU General Public License along
  307
+    with this program; if not, write to the Free Software Foundation, Inc.,
  308
+    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  309
+
  310
+Also add information on how to contact you by electronic and paper mail.
  311
+
  312
+If the program is interactive, make it output a short notice like this
  313
+when it starts in an interactive mode:
  314
+
  315
+    Gnomovision version 69, Copyright (C) year name of author
  316
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
  317
+    This is free software, and you are welcome to redistribute it
  318
+    under certain conditions; type `show c' for details.
  319
+
  320
+The hypothetical commands `show w' and `show c' should show the appropriate
  321
+parts of the General Public License.  Of course, the commands you use may
  322
+be called something other than `show w' and `show c'; they could even be
  323
+mouse-clicks or menu items--whatever suits your program.
  324
+
  325
+You should also get your employer (if you work as a programmer) or your
  326
+school, if any, to sign a "copyright disclaimer" for the program, if
  327
+necessary.  Here is a sample; alter the names:
  328
+
  329
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
  330
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
  331
+
  332
+  <signature of Ty Coon>, 1 April 1989
  333
+  Ty Coon, President of Vice
  334
+
  335
+This General Public License does not permit incorporating your program into
  336
+proprietary programs.  If your program is a subroutine library, you may
  337
+consider it more useful to permit linking proprietary applications with the
  338
+library.  If this is what you want to do, use the GNU Lesser General
  339
+Public License instead of this License.
23  sites/all/modules/contrib/apachesolr_views/apachesolr_views.info
... ...
@@ -0,0 +1,23 @@
  1
+name = Apache Solr Views Integration
  2
+description = Provides Views Integration with Views
  3
+package = Search Toolkit
  4
+core = "7.x"
  5
+
  6
+dependencies[] = apachesolr
  7
+dependencies[] = views
  8
+
  9
+files[] = apachesolr_views.views.inc
  10
+files[] = apachesolr_views_query.inc
  11
+files[] = apachesolr_views_solr_base_query.inc
  12
+files[] = handlers/apachesolr_views_handler_field.inc
  13
+files[] = handlers/apachesolr_views_handler_sort.inc
  14
+files[] = handlers/apachesolr_views_handler_filter.inc
  15
+files[] = handlers/apachesolr_views_keyword_handler_filter.inc
  16
+files[] = handlers/apachesolr_views_handler_argument.inc
  17
+
  18
+; Information added by drupal.org packaging script on 2012-05-30
  19
+version = "7.x-1.0-beta1"
  20
+core = "7.x"
  21
+project = "apachesolr_views"
  22
+datestamp = "1338371748"
  23
+
14  sites/all/modules/contrib/apachesolr_views/apachesolr_views.module
... ...
@@ -0,0 +1,14 @@
  1
+<?php
  2
+
  3
+/**
  4
+ * @file
  5
+ * Provides Views Implementation for the ApacheSolr Search Integration project
  6
+ * drupal.org/project/apachesolr
  7
+ */
  8
+
  9
+/**
  10
+ * Implementation of hook_views_api().
  11
+ */
  12
+function apachesolr_views_views_api() {
  13
+  return array('api' => '3.0');
  14
+}
104  sites/all/modules/contrib/apachesolr_views/apachesolr_views.views.inc
... ...
@@ -0,0 +1,104 @@
  1
+<?php
  2
+
  3
+/*
  4
+ * Load files with base classes of the contained classes.
  5
+ */
  6
+
  7
+/**
  8
+ * Implementation of hook_views_plugins().
  9
+ */
  10
+function apachesolr_views_views_plugins() {
  11
+  return array(
  12
+    'module' => 'apachesolr_views',
  13
+    'query' => array(
  14
+      'apachesolr_views_query' => array(
  15
+        'title' => t('Apache Solr Query'),
  16
+        'help' => t('Query that allows you to search with Apache Solr.'),
  17
+        'handler' => 'apachesolr_views_query',
  18
+        'parent' => 'views_query',
  19
+      ),
  20
+    ),
  21
+  );
  22
+
  23
+}
  24
+
  25
+/**
  26
+ * Implementation of hook_views_data().
  27
+ */
  28
+function apachesolr_views_views_data() {
  29
+  foreach (apachesolr_load_all_environments() as $env_id => $environment) {
  30
+    $name = $environment['name'];
  31
+    $apachesolr_base_table = 'apachesolr__' . $env_id;
  32
+
  33
+    $data[$apachesolr_base_table]['table']['group'] = t('Apache Solr');
  34
+    $data[$apachesolr_base_table]['table']['base'] = array(
  35
+      'query class' => 'apachesolr_views_query',
  36
+      'title' => t('Apache Solr @name', array('@name' => $name)),
  37
+      'help' => t('Searches the site with the Apache Solr search engine for @name', array('@name' => $name)),
  38
+    );
  39
+
  40
+    // Get the list of the fields in index directly from Solr.
  41
+    try {
  42
+      $solr = apachesolr_get_solr($env_id);
  43
+      $solr_fields = $solr->getFields(1);
  44
+    }
  45
+    catch (Exception $e) {
  46
+      $solr_fields = array();
  47
+      watchdog('Apache Solr Views', nl2br(check_plain($e->getMessage())), NULL, WATCHDOG_ERROR);
  48
+    }
  49
+
  50
+    foreach ($solr_fields as $solr_field_name => $solr_field) {
  51
+
  52
+      // We do not allow to display 'sort_*' fields.
  53
+      if (strpos($solr_field_name, 'sort_') === 0) {
  54
+        continue;
  55
+      }
  56
+
  57
+      $field_type = $solr_field->type;
  58
+
  59
+      $data[$apachesolr_base_table][$solr_field_name] = array(
  60
+        'title' => $solr_field_name,
  61
+        'help' => $solr_field_name,
  62
+        'field' => array(
  63
+          'handler' => 'apachesolr_views_handler_field',
  64
+          'click sortable' => TRUE,
  65
+        ),
  66
+        'filter' => array(
  67
+          'handler' => 'apachesolr_views_handler_filter',
  68
+        ),
  69
+        'sort' => array(
  70
+          'handler' => 'apachesolr_views_handler_sort',
  71
+        ),
  72
+        'argument' => array(
  73
+          'handler' => 'apachesolr_views_handler_argument',
  74
+        ),
  75
+      );
  76
+
  77
+      // Default sort field for label.
  78
+      $sort_field_name = ($solr_field_name == 'label') ? 'sort_label' : '';
  79
+      // Check if corresponding sort_ field exists. We remove prefix from field
  80
+      // name (for example prefix "ss_" from "ss_name") and check if "sort_*"
  81
+      // field is available.
  82
+      if (array_key_exists('sort_' . substr($solr_field_name, 2), $solr_fields)) {
  83
+        $sort_field_name = 'sort_' . substr($solr_field_name, 2);
  84
+      }
  85
+      if (!empty($sort_field_name)) {
  86
+        // Use the sort field for click sorting.
  87
+        $data[$apachesolr_base_table][$solr_field_name]['field']['click sort field'] = $sort_field_name;
  88
+        // And use the sort field for explicit sorts.
  89
+        $data[$apachesolr_base_table][$solr_field_name]['sort']['real field'] = $sort_field_name;
  90
+      }
  91
+    }
  92
+
  93
+    // Keyword field.
  94
+    $data[$apachesolr_base_table]['keyword'] = array(
  95
+      'title' => t('Search'),
  96
+      'help' => t('Fulltext search'),
  97
+      'filter' => array(
  98
+        'handler' => 'apachesolr_views_keyword_handler_filter',
  99
+      ),
  100
+    );
  101
+  }
  102
+
  103
+  return $data;
  104
+}
237  sites/all/modules/contrib/apachesolr_views/apachesolr_views_query.inc
... ...
@@ -0,0 +1,237 @@
  1
+<?php
  2
+
  3
+/**
  4
+ * Class for handling a view that gets its data not from the database, but from
  5
+ * a Solr server.
  6
+ */
  7
+class apachesolr_views_query extends views_plugin_query {
  8
+
  9
+  /**
  10
+   * Array of parameters for Solr query.
  11
+   */
  12
+  protected $params;
  13
+
  14
+  /**
  15
+   * Array of all encountered errors. Each of these is fatal, meaning that a
  16
+   * non-empty $errors property will result in an empty result being returned.
  17
+   *
  18
+   * @var array
  19
+   */
  20
+  protected $errors;
  21
+
  22
+  /**
  23
+   * Store results of apachesolr search.
  24
+   */
  25
+  protected $apachesolr_results;
  26
+
  27
+  /**
  28
+   * Array of where conditions.
  29
+   *
  30
+   * Neede for grouppin of query conditions.
  31
+   */
  32
+  protected $where = array();
  33
+
  34
+  public function build(&$view) {
  35
+    $view->init_pager();
  36
+
  37
+    // Let the pager modify the query to add limits.
  38
+    $this->pager->query();
  39
+
  40
+    // Set aliases of the fields.
  41
+    foreach ($view->field as $field_name => &$field) {
  42
+      $field->field_alias = $field_name;
  43
+      $field->aliases['entity_type'] = 'entity_type';
  44
+    }
  45
+
  46
+    // Add fields to the query so they will be shown in solr document.
  47
+    $this->params['fl'] = array_keys($view->field);
  48
+  }
  49
+
  50
+  /**
  51
+   * Executes the query and fills the associated view object with according
  52
+   * values.
  53
+   *
  54
+   * Values to set: $view->result, $view->total_rows, $view->execute_time,
  55
+   * $view->pager['current_page'].
  56
+   */
  57
+  public function execute(&$view) {
  58
+    try {
  59
+      $start = microtime(TRUE);
  60
+
  61
+      // Execute the search.
  62
+      $params = array();
  63
+      if (isset($this->params['q'])) {
  64
+        $params['q'] =  $this->params['q'];
  65
+      }
  66
+
  67
+      $params['rows'] = $this->pager->options['items_per_page'];
  68
+      $params['start'] = $this->pager->current_page * $this->pager->options['items_per_page'];
  69
+
  70
+      // If we display all items without pager.
  71
+      if ($params['rows'] == 0) {
  72
+        $params['rows'] = 100000;
  73
+      }
  74
+
  75
+      // Add fields.
  76
+      $params['fl'] = array('id', 'entity_id');
  77
+      if (isset($this->params['fl'])) {
  78
+        $params['fl'] = array_merge($params['fl'], $this->params['fl']);
  79
+      }
  80
+      $params['fl'] = implode(',', $params['fl']);
  81
+
  82
+      // Add conditions to filter parameter.
  83
+      $conditions = array('conditions' => $this->where, 'type' => $this->group_operator);
  84
+      $conditions_string = $this->build_where_string($conditions);
  85
+
  86
+      if (!empty($conditions_string)) {
  87
+        $params['fq'] = $conditions_string;
  88
+      }
  89
+
  90
+      // Load search query.
  91
+      // Get the Apache Solr "environment id".
  92
+      if (strpos($view->base_table, 'apachesolr__') === 0) {
  93
+        $env_id = substr($view->base_table, 12);
  94
+      }
  95
+      else {
  96
+        $env_id = apachesolr_default_environment();
  97
+      }
  98
+
  99
+      $solr = apachesolr_get_solr($env_id);
  100
+      $query = new ApachesolrViewsSolrBaseQuery('apachesolr', $solr, $params, '', current_path());
  101
+
  102
+      // Add sorting.
  103
+      if (isset($this->params['sort'])) {
  104
+        $query->setAvailableSort($this->params['sort'][0], $this->params['sort'][1]);
  105
+        $query->setSolrsort($this->params['sort'][0], $this->params['sort'][1]);
  106
+      }
  107
+
  108
+      $query->page = $this->pager->current_page;
  109
+
  110
+      // Boost parameters if apachesolr_search module is available.
  111
+      if (module_exists('apachesolr_search')) {
  112
+        apachesolr_search_add_boost_params($query);
  113
+      }
  114
+
  115
+      // Execute search.
  116
+      list($final_query, $response) = apachesolr_do_query($query);
  117
+      apachesolr_has_searched($solr->getId(), TRUE);
  118
+
  119
+      // Store results.
  120
+      $view->result = $response->response->docs;
  121
+
  122
+      // Store apachesolr cached response.
  123
+      $this->apachesolr_response = $response;
  124
+
  125
+      // Store the results.
  126
+      $this->pager->total_items = $view->total_rows = $this->apachesolr_response->response->numFound;
  127
+      $this->pager->update_page_info();
  128
+
  129
+      // We shouldn't use $results['performance']['complete'] here, since
  130
+      // extracting the results probably takes considerable time as well.
  131
+      $view->execute_time = microtime(TRUE) - $start;
  132
+    }
  133
+    catch (Exception $e) {
  134
+      $this->errors[] = $e->getMessage();
  135
+    }
  136
+
  137
+    if ($this->errors) {
  138
+      foreach ($this->errors as $msg) {
  139
+        drupal_set_message($msg, 'error');
  140
+      }
  141
+      $view->result = array();
  142
+      $view->total_rows = 0;
  143
+      $view->execute_time = 0;
  144
+      return;
  145
+    }
  146
+  }
  147
+
  148
+  public function add_filter($type, $value, $exclude = FALSE) {
  149
+    $exclude_string = ($exclude) ? '-' : '';
  150
+    $this->params['filters'][] = $exclude_string . $type . ':(' . $value . ')';
  151
+  }
  152
+
  153
+  public function add_filter_string($string) {
  154
+    $this->params['q.alt'][] = $string;
  155
+  }
  156
+
  157
+  public function add_sort($field, $order) {
  158
+    $this->params['sort'] = array($field, $order);
  159
+  }
  160
+
  161
+  public function add_parameter($key, $value) {
  162
+    $this->params[$key] = $value;
  163
+  }
  164
+
  165
+  public function add_field($table_alias, $field, $alias = '', $params = array()) {
  166
+    if (isset($table_alias[$field])) {
  167
+      return $table_alias[$field];
  168
+    }
  169
+  }
  170
+
  171
+  public function get_params() {
  172
+    return $this->params;
  173
+  }
  174
+
  175
+  /**
  176
+   *  Build filter string from where array.
  177
+   */
  178
+  function build_where_string($where) {
  179
+    if (!isset($where['conditions'])) {
  180
+      return $where['field'] . ':(' . $where['value'] . ')';
  181
+    }
  182
+    else {
  183
+      $condition_strings = array();
  184
+      foreach ($where['conditions'] as $condition) {
  185
+        $condition_strings[] = $this->build_where_string($condition);
  186
+      }
  187
+      $condition_strings = array_filter($condition_strings);
  188
+      return implode(' ' . $where['type'] . ' ', $condition_strings);
  189
+    }
  190
+  }
  191
+
  192
+  /**
  193
+   * Support for groupping.
  194
+   *
  195
+   * @see views_plugin_query_default::add_where().
  196
+   */
  197
+  function add_where($group, $field, $value = NULL, $operator = NULL) {
  198
+    // Ensure all variants of 0 are actually 0. Thus '', 0 and NULL are all
  199
+    // the default group.
  200
+    if (empty($group)) {
  201
+      $group = 0;
  202
+    }
  203
+
  204
+    // Check for a group.
  205
+    if (!isset($this->where[$group])) {
  206
+      $this->set_where_group('AND', $group);
  207
+    }
  208
+
  209
+    $this->where[$group]['conditions'][] = array(
  210
+      'field' => $field,
  211
+      'value' => $value,
  212
+      'operator' => $operator,
  213
+    );
  214
+  }
  215
+
  216
+  /**
  217
+   * Support for groupping.
  218
+   *
  219
+   * @see views_plugin_query_default::set_where_group().
  220
+   */
  221
+  function set_where_group($type = 'AND', $group = NULL, $where = 'where') {
  222
+    // Set an alias.
  223
+    $groups = &$this->$where;
  224
+
  225
+    if (!isset($group)) {
  226
+      $group = empty($groups) ? 1 : max(array_keys($groups)) + 1;
  227
+    }
  228
+
  229
+    // Create an empty group
  230
+    if (empty($groups[$group])) {
  231
+      $groups[$group] = array('conditions' => array(), 'args' => array());
  232
+    }
  233
+
  234
+    $groups[$group]['type'] = strtoupper($type);
  235
+    return $group;
  236
+  }
  237
+}
15  sites/all/modules/contrib/apachesolr_views/apachesolr_views_solr_base_query.inc
... ...
@@ -0,0 +1,15 @@
  1
+<?php
  2
+
  3
+/**
  4
+ * Custom SolrBaseQuery class for Apachesolr Views.
  5
+ *
  6
+ * Needed to set proper base path for facets.
  7
+ */
  8
+class ApachesolrViewsSolrBaseQuery extends SolrBaseQuery {
  9
+  public function getPath($new_keywords = NULL) {
  10
+    if (isset($new_keywords)) {
  11
+      return $this->base_path . '/' . $new_keywords;
  12
+    }
  13
+    return $this->base_path;
  14
+  }
  15
+}
10  sites/all/modules/contrib/apachesolr_views/handlers/apachesolr_views_handler_argument.inc
... ...
@@ -0,0 +1,10 @@
  1
+<?php
  2
+
  3
+/**
  4
+ * Class that allows searching the site with Apache Solr through a view.
  5
+ */
  6
+class apachesolr_views_handler_argument extends views_handler_argument {
  7
+  public function query() {
  8
+    $this->query->add_filter($this->real_field, $this->argument);
  9
+  }
  10
+}
29  sites/all/modules/contrib/apachesolr_views/handlers/apachesolr_views_handler_field.inc
... ...
@@ -0,0 +1,29 @@
  1
+<?php
  2
+
  3
+/**
  4
+ * Field handler for Solr fields.
  5
+ */
  6
+class apachesolr_views_handler_field extends views_handler_field {
  7
+
  8
+  // Retrieve value from Solr result document.
  9
+  function get_value($values, $field = NULL) {
  10
+    $alias = isset($field) ? $this->aliases[$field] : $this->field_alias;
  11
+    if (isset($values->{$alias})) {
  12
+      if (is_array($values->{$alias})) {
  13
+        return implode(" ", $values->{$alias});
  14
+      }
  15
+      else {
  16
+        return $values->{$alias};
  17
+      }
  18
+    }
  19
+  }
  20
+
  21
+  /**
  22
+   * Called to determine what to tell the clicksorter.
  23
+   */
  24
+  function click_sort($order) {
  25
+    $sort_field = (isset($this->definition['click sort field']) ? $this->definition['click sort field'] : $this->real_field);
  26
+    $this->query->add_sort($sort_field, $order);
  27
+  }
  28
+
  29
+}
23  sites/all/modules/contrib/apachesolr_views/handlers/apachesolr_views_handler_filter.inc
... ...
@@ -0,0 +1,23 @@
  1
+<?php
  2
+
  3
+class apachesolr_views_handler_filter extends views_handler_filter {
  4
+  function query() {
  5
+    if (!empty($this->value)) {
  6
+      if (is_array($this->value)) {
  7
+        $this->value = implode(' OR ', $this->value);
  8
+      }
  9
+      $this->query->add_where($this->options['group'], "$this->real_field", $this->value, $this->operator);
  10
+    }
  11
+  }
  12
+
  13
+  /**
  14
+   * Provide a simple textfield for equality
  15
+   */
  16
+  function value_form(&$form, &$form_state) {
  17
+    $form['value'] = array(
  18
+      '#type' => 'textfield',
  19
+      '#title' => t($this->definition['title']),
  20
+      '#default_value' => $this->value,
  21
+    );
  22
+  }
  23
+}
17  sites/all/modules/contrib/apachesolr_views/handlers/apachesolr_views_handler_sort.inc
... ...
@@ -0,0 +1,17 @@
  1
+<?php
  2
+
  3
+/**
  4
+ * Class for sorting for a field.
  5
+ */
  6
+class apachesolr_views_handler_sort extends views_handler_sort {
  7
+
  8
+  /**
  9
+   * Places the sort into the search parameters.
  10
+   */
  11
+  public function query() {
  12
+    // Find out why apachesolr module adds sort_* fields
  13
+    //  to index and use them if needed.
  14
+    $order = strtolower($this->options['order']);
  15
+    $this->query->add_sort($this->real_field, $order);
  16
+  }
  17
+}
12  sites/all/modules/contrib/apachesolr_views/handlers/apachesolr_views_keyword_handler_filter.inc
... ...
@@ -0,0 +1,12 @@
  1
+<?php
  2
+
  3
+/**
  4
+ * Fulltext keyword search.
  5
+ */
  6
+class apachesolr_views_keyword_handler_filter extends apachesolr_views_handler_filter {
  7
+  function query() {
  8
+    if (!empty($this->value)) {
  9
+      $this->query->add_parameter('q', $this->value);
  10
+    }
  11
+  }
  12
+}

0 notes on commit 248cd97

Please sign in to comment.
Something went wrong with that request. Please try again.