Robert Cemper · Nov 6, 2017 go to post

having this done ~ 9 yrs back I can't resist to share my old solution (at that time for a UNIQUE on 2000  char)

- split Text into 4 sections in calculated properties e.g.
tx1 = $e(Text,1,500)
tx2 = $e(Text,501,1000) 
tx3 = $e(Text,1001,1500)
tx4 = $e(Text,1501,2000)

- index them
- then you can build an SQL  statement to have all 4 pieces identic.
you end up with a cascade of embedded SELECTS

It's not to fast but very precise.
 

Robert Cemper · Nov 5, 2017 go to post

Found it:

Exceptions to READ COMMITTED  1 of some more

If you query contains an aggregate function, the aggregate result returns the current state of the data,
regardless of the specified ISOLATION LEVEL. Therefore, inserts and updates are in progress (and may subsequently be rolled back) are included in aggregate results. Deletes that are in progress (and may subsequently be rolled back) are not included in aggregate results. This is because an aggregate operation requires access to data from many rows of a table.

see:

http://docs.intersystems.com/latest/csp/docbook/DocBook.UI.Page.cls?KEY…

Robert Cemper · Nov 5, 2017 go to post

being suspicious on any * do you see the same behavior for 

select count(AttrA) into :ans from Test.Table)
Robert Cemper · Oct 27, 2017 go to post

Hi Eduard !

Being a little bit lazy I simplified the query (for less typing)
My example: 

SELECT * FROM %Dictionary.StorageDataValueDefinition
where id [ 'Sample.Person'

And it works fine for persistent and serial classes.
My hidden assumption: there is only 1 Storage Strategy.

The nice point about:
you get also storage locations of deleted (!!) properties  
that eventually might be invisible in class definition.
 
yes yes

Robert Cemper · Oct 25, 2017 go to post

ECP always acts as Master/Slave relation.
Server 2 holds the "FROM" DB as ECP master while Server1 pulls it down as ECP client.

So from logic Server2  just can "reply" to requests from Server1.
Though I'm not sure  how a firewall in between has to be configured.  

Robert Cemper · Oct 25, 2017 go to post

Assumimg you have both DB on the same instance but different namespaces "FROM" and "TO"

You may run a loop like this

set id=""
for cnt=1:1 {
  set id=$ORDER(^|"FROM"|Data(""),1,value) quit:id=""
  set ^|"TO"|Data(id+10000000)=value)
  if cnt#100000 write cnt,?10,id,!
}

For the connections of the host you may use ECP

For a more structured global you might need to use $QUERY()

The write is just to see progress

Robert Cemper · Oct 22, 2017 go to post

YES it is !

Class %DeepSee.ResultSet has a method %CancelQuery that does the trick.

http://docs.intersystems.com/latest/csp/documatic/%25CSP.Documatic.cls?…

http://docs.intersystems.com/latest/csp/documatic/%25CSP.Documatic.cls?…

Chapter  Using the Result Set API tells you some more details.
http://docs.intersystems.com/latest/csp/docbook/DocBook.UI.Page.cls?KEY…

especially:

If you used %ExecuteAsynch(), periodically check to see whether the query has completed. If the query uses any plug-ins, make sure that any pending results are also complete; pending results are the results from the plug-ins, which are executed separately from the query.

To determine the status of the query, call the %GetStatus() method of your instance. Or call the %GetQueryStatus() class method of %DeepSee.ResultSet. These methods return the status of the query and also (separately) the status of any pending results; see the class documentation for details.

Optionally, to cancel a query that has not yet completed, call the %CancelQuery() class method.

A practical example is seen in ##class( %DeepSee.UI.Analyzer). onunloadHandler()

Robert Cemper · Oct 19, 2017 go to post

Changing IDKey to %Integer is not enough for Bitmap Indexing

You also have to set MINVAL =1  to prevent 0 or negative integers !

Robert Cemper · Oct 19, 2017 go to post

Hi Scott,

analyzing  ##class( EnsLib.SQL.Common).ExecuteProcedureParmArray(.....)
I think you should be able to provide a prepared Snapshot to set  the required parameters.

At least $$$sysTRACE("Using initialized SnapShot "_(tNumRS+1))  points in this direction

So your code might look like this:

Set SelectPER355MC=##class(%ListOfObjects).%New()
Set preset=##class(EnsLib.SQL.Snapshot).%New()
Set preset.MaxRowsToGet=12000
do SelectPER355MC.SetAt(preset,1)
set tSC = ..Adapter.ExecuteProcedureParmArray(.SelectPER355MC,.output,SPQuery,"oi",.parm)

I have no environment to check the approach.
So it's up to you to verify it.

Robert Cemper · Oct 18, 2017 go to post

I'm sorry.

I'm not aware of ANY documentation on required privileges by any Query.
I understand quite well your intention but especially <Protect> is hard to trap double hard inside a Class Query
With privileged app you limit the scope and get control over access parameters. 
 

Robert Cemper · Oct 17, 2017 go to post

up to now I would do it:

SELECT Name,Home_Street FROM Sample.Person ORDER BY +Home_Street

Where's the improvement ? I see no difference.

Robert Cemper · Oct 16, 2017 go to post

 ERROR 5540 - User "UnknownUser" is not privileged for the operation.
This tells me that you don't login with a managed user with enough privileges.

So you could have a dedicated user just for this purpose.
OR
give "Unknown User" enough rights
OR
make use of a Privileged Application to assign temporary required Resources (my guess "%Developer") 

more on this and pp.
http://docs.intersystems.com/latest/csp/docbook/DocBook.UI.PortalHelpPa…

Robert Cemper · Oct 16, 2017 go to post

Alexey,

You are totally right.
Indirection just does a mimic of "address" while it's in fact the "name" of a  variable or global.
A kind of "symbolic  addressing". 
 

Robert Cemper · Oct 10, 2017 go to post

I used this rule of thumb:

selectivity > 8 %  candidate for bitmap index

selectivity < 2 % normal index
in between it's a mater of investigation and other side conditions beyond selectivity

Robert Cemper · Oct 9, 2017 go to post

Olga,

You made my day.

It's really easy to follow and helps much more then the "short cutted" version.

I wish I had 5 votes.

yes yes  yes yes yes

Robert Cemper · Oct 3, 2017 go to post

I'd recommend Java as you are platform independent then.

Atelier + Eclipse are just another goody for developers 

Robert Cemper · Sep 29, 2017 go to post

That's fine and nothing new.
You missed my point:

With the Class Query it's not self explaining if params got to Prepare() or to Execute()
http://docs.intersystems.com/latest/csp/documatic/%25CSP.Documatic.cls?…

I just learned from  John Murray a few comments above

Prepare() is for dynamic SQL, but in your case it's a class query you want to run.
So change your rs.Prepare call to be an rs.Execute one.


that you don't need a prepare with a Class Query.
I wasn't aware of that until a few hours ago.
Then it's obvious that any param has to go to Execute().

Robert Cemper · Sep 29, 2017 go to post

SQL Error 417 = Security Error

You should check your access rights inside 
- Windows
- Caché